2011-05-26 109 views
0

考虑两种情况case1和case2加上两种方法method1和method2。说方法1解决case1和方法2解决case2。现在,我有一个可能以case1或case2结束的程序。在我的代码中,无论发生什么情况,我都会调用method1。但是,如果发生case2,method1会发出nullpointerexception。Java - 摆脱NullPointerException

我想要的是:我的代码应该首先调用method1,如果发生异常,则调用method2。我该怎么做?由于我没有关于试穿的信息,所以我真的需要一些帮助!

+2

我认为一些代码比任何解释都要好。 – khachik 2011-05-26 18:17:05

+0

我想你是对的。假设我有TreeNode parentNode,它将成为平等的左手,右手将搜索(parent,this)或search2(parent,this)。然而,search和search2可能会返回null,这是我不想要的。现在,我应该如何实施? – 2011-05-26 18:31:10

+0

请编辑您的问题并发布一些代码示例,而不仅仅是变量名称和方法签名。 – khachik 2011-05-26 18:33:24

回答

2

捕获NullPointerException是一个糟糕的实践 - 你可能没有捕获到你想捕获的特殊异常。你有两个选择:

1)抛出自己的异常,后来抓住它:

public void method1(Case caze) throws MyException { 
    if (case.getType() == CaseType.CaseOne) { 
     // processing 
    } else { 
     throw new MyException("Wrong case type"); 
    } 
    } 

而且客户端代码:

try { 
    method1(caze); 
} catch (MyException e) { 
    // log the excpetion 
    method2(caze); 
} 

2)返回一个布尔标志,表明该处理已成功完成。

请记住,分析数值比在您的情况下使用try-catch机制更好。我会为你推荐变种#2。

3

你可以这样做:

try { 
     method1(); 
    } 
    catch (Exception e) { 
     method2(); 
    } 

这就是说,它通常最好依赖于只对例外的例外条件。对于正常的控制流程,你可以使用一个if:

if (isCase2()) { 
     method2(); 
    } 
    else { 
     method1(); 
    } 
+0

正如@Vladimir发布的,如果你打算用try/catch,最好从method1中抛出你自己的异常对象,而不是依赖NPE(由于其他问题,即使在案例1中也可能出现这种情况)。 – 2011-05-26 18:21:45

+0

同意。上面的第一个例子旨在从字面上满足OP:“我的代码应该首先调用method1,如果发生异常,则调用method2。”如果您可以事先区分case1和case2,那么最好使用任何异常。 – 2011-05-26 18:28:38

+0

当然。在特殊情况下使用例外。这听起来像是一个案件与另一个案件并不例外。 – 2011-05-26 18:43:40