从抛出异常的方法中恢复

时间:2013-01-09 22:35:17

标签: java exception

我是java esp的新手。一些编码实践。我有一种情况,方法抛出NullPointerException并且调用方法捕获它。

try {
    String test = Class.method(arg)
}    
catch (Exception ex) {
    ...
}

public String method(arg){
String str;
...
if(str == null) throw(exception)
return str;
}

现在Class.method(arg)内的某个方法会抛出一个NullPointerException,它会被上面的捕获(如上所述)捕获。相反,我想做类似的事情:

if (test == null) { do something else }

在try块内。

处理此问题的最佳方法是什么?我可以删除throw inside方法并使其返回null吗?

4 个答案:

答案 0 :(得分:3)

您应该在method(arg)中捕获异常,并在任何异常情况下返回null

示例程序:

public class Test1 {

    public static void main(String[] args) {
        try{
            String test = method("1");
            if(test==null){
                //do something else
            }
        }catch(Exception e){

        }

    }

    private static String method(String str) throws Exception{
            if(str.equals("1")) return null;
            else if(str.equals("2")) throw new Exception("My Exception");
            else return str;          
    }

}

现在你可以将方法改为这样的,这完全取决于你的要求:

    private static String method(String str) throws Exception{
        try{
            if(str.equals("1")) return null;
            else if(str.equals("2")) throw new Exception("My Exception");
            else return str;
        }catch(Exception e){
            return null;
        }

    }

答案 1 :(得分:3)

期待空指针异常有一些难闻的气味。是不是可以在method中添加空测试并返回约定的结果而不等待例外?

所以而不是

 public String method(String arg) {
   try {
     return arg.toString();
   } catch (NullPointerException npe) {
     return null;
   }
 }

你真的应该这样做

 public String method(String arg) {
   if (arg == null) {
     return null;
   }

   return arg.toString();
 }

一个可观的替代方案是抛出除NPE之外的异常来提示问题 - 并且因为返回null通常是一个坏主意:

 public String method(String arg) {
   if (arg == null) {
     throw new IllegalArgumentException("Passing null is illegal");
   }

   return arg.toString();
 }

答案 2 :(得分:0)

try{
    Class.method(arg);
} catch ( NullPointerException npe ) {
    //do something else
}

答案 3 :(得分:0)

您可以特别为NullPointerException指定一个catch子句:

try {
    String test = Class.method(arg)
}
catch (NullPointerException ex) {
    // test == null
    // do something
}
catch (Exception ex) {
    // ?
}

但是您可能不希望在catch子句中放置过多的逻辑/行为,因此请考虑将if块放在try-catch块之外的那个块中:< / p>

try {
    String test = Class.method(arg)
}
catch (NullPointerException ex) {
    // At least log the exception; never swallow exceptions. NEVER.
    System.out.println(ex);
}
catch (Exception ex) {
    // ?
}
if(test != null) {
    // do something
}
else {
    // do something else
 }