Java 从引发异常的方法中恢复

Java 从引发异常的方法中恢复,java,exception,Java,Exception,我对java相当陌生,尤其是一些编码实践。我遇到了这样一种情况:一个方法抛出一个NullPointerException,调用方法捕获它 try { String test = Class.method(arg) } catch (Exception ex) { ... } public String method(arg){ String str; ... if(str == null) throw(exception) return str; } 现在类中的某个方

我对java相当陌生,尤其是一些编码实践。我遇到了这样一种情况:一个方法抛出一个
NullPointerException
,调用方法捕获它

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

public String method(arg){
String str;
...
if(str == null) throw(exception)
return str;
}
现在
类中的某个方法。方法(arg)
抛出一个
NullPointerException
,并在上面的捕获中捕获它(如上图所示)。相反,我想做如下事情:

if (test == null) { do something else }
在try块内部


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

您应该在
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;
        }

    }

您应该在
方法(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;
        }

    }

您可以为
NullPointerException
指定catch子句,尤其是:

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

但您可能不想在<代码> catch < /COD>子句中添加太多的逻辑/行为,所以只考虑将<<代码>如果尝试捕获< /代码>块:

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
 }

您可以为
NullPointerException
指定catch子句,尤其是:

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

但您可能不想在<代码> catch < /COD>子句中添加太多的逻辑/行为,所以只考虑将<<代码>如果尝试捕获< /代码>块:

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
 }

期望出现空指针异常有一些不好的味道。难道不可能在
方法中添加一个空测试,并在不等待异常的情况下返回商定的结果吗

所以不是

 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();
 }

期望出现空指针异常有一些不好的味道。难道不可能在
方法中添加一个空测试,并在不等待异常的情况下返回商定的结果吗

所以不是

 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();
 }

测试是否为空,或者是否有其他原因导致异常?是。其中一个方法中存在对null的测试,因此它会直接抛出异常。@SairamSankaran该方法不应该这样做是因为测试null,还是其他原因导致了异常?是的。其中一个方法中有一个null测试,因此它直接抛出异常。@SairamSankaran该方法不应该这样做是的。异常被捕获并发送到日志。但我想采取行动。因此,与内部方法引发异常不同,我想做一些其他事情,如果方法(arg)返回null,如果方法()返回null,您可以使用if语句来做其他事情。我不明白这里的问题。该方法直接抛出异常,而不是返回null。但是我想在方法之外处理null。这正是我要寻找的。在我的方法中,我已经明确了这一点[如果(str.equals(“2”))抛出新的异常(“我的异常”);]。我是否可以将其删除并替换为[if(str.equals(“1”))return null;]。我不确定在方法中抛出异常有什么好处,它只是一个示例,不是真实的编程场景。我显式地抛出异常以显示使用它的不同方式。你可以根据你的要求做任何事情。异常被捕获并发送到日志。但我想采取行动。因此,与内部方法引发异常不同,我想做一些其他事情,如果方法(arg)返回null,如果方法()返回null,您可以使用if语句来做其他事情。我不明白这里的问题。该方法直接抛出异常,而不是返回null。但是我想在方法之外处理null。这正是我要寻找的。在我的方法中,我已经明确了这一点[如果(str.equals(“2”))抛出新的异常(“我的异常”);]。我是否可以将其删除并替换为[if(str.equals(“1”))return null;]。我不确定在方法中抛出异常有什么好处,它只是一个示例,不是真实的编程场景。我显式地抛出异常以显示使用它的不同方式。根据您的要求,您可以使用此功能执行任何操作。