是否应该使用异常将进程展开回main?

时间:2016-08-17 22:40:30

标签: java exception design-patterns

现在这对我来说真的很难解释所以请耐心等待。

我一直想知道,当某些情况得到满足时,将每个链式方法“解除”回主方法的最佳方法。例如,假设我从Main调用一个方法,从那个方法调用另一个方法,依此类推。在某些时候,我可能想要取消链接的每个方法的所有进一步操作,并简单地返回到Main方法。这样做的最佳方式是什么?

我将给出一个场景:

在下面的代码中有3种方法,但是当Method1使用null值调用Method2时,它应该一直放松回Main,而不需要在Method2中进一步操作(EG“很多其他代码”部分)。

public static void main(String[] args) 
{
    try
    {
        Method1();
    }
    catch( ReturnToMainException e )
    {
        // Handle return \\
    }
}

public static void Method1() throws ReturnToMainException
{
    String someString = null;
    Method2( someString  );

    // Lots more code after here
}

public static boolean Method2( String someString )
{
    if( someString == null )
        throw new ReturnToMainException();
    else if( someString.equals( "Correct" ))
        return true;
    else
        return false;
}

在这个例子中,我使用了一个我读过的只能用于“异常情况”的投掷。我经常遇到这个问题并且发现自己只是简单地使用If / Else语句来解决问题,但是当处理只能返回True / False的方法时,我发现我没有足够的选项来返回决定一个动作。我想我可以使用枚举器或类,但这似乎有些麻烦。

1 个答案:

答案 0 :(得分:2)

  

我使用了一个我读过的只能用于"异常环境"。我经常遇到这个问题,发现自己只是在做If / Else语句来解决问题

异常抛出是相对昂贵的,所以不应该在没有仔细考虑的情况下使用它,但我相信你的例子是一个正确使用的正确例子。

一般情况下,您应该仅将例外用于"例外"该计划的行为。如果someString可以null通过某种用户输入,数据库值或其他正常机制,那么通常你应该使用正常的返回机制来处理这种情况。

在您的情况下,如果Boolean为空,您可以返回null对象(不是原始对象)并返回someString

private static Boolean method2( String someString ) {
     if (someString == null) {
         return null;
     }
     ...
}

然后,您可以在调用者中正确处理null,可能会根据方法"是否正常工作将boolean返回main

private static boolean method1() {
    ...
    Boolean result = method2(someString);
    if (result == null) {
        // the method didn't "work"
        return false;
    }

然后在主要内容中,您可以看到method1"是否正常工作":

public static void main(String[] args) {
    if (!method1()) {
        // handle error
    }
    ...
}

请注意,我对方法名称进行了下调,并将方法的权限更改为private,这两种方式都是很好的模式。

  

调查员或类,但这看起来有些麻烦。

确实如此。这取决于如何使用此代码。如果它是其他人调用的API方法,您可能希望返回某种Result类,它可能提供反馈,如boolean,参数为null。或者你可以在这种情况下抛出IllegalArgumentException。相反,如果这是一个内部本地私有方法,那么我投票支持一种更简单的方法来处理参数错误。无论哪种方式,我都会使用javadoc来记录行为,这样你就不会绊倒你。

希望这有帮助。