在Java中尝试两次处理异常
我正在尝试处理一个异常2次 第一个是定义方法的核心:在Java中尝试两次处理异常,java,Java,我正在尝试处理一个异常2次 第一个是定义方法的核心: Class Class1 { public int method (int a, String b) { try { System.out.println(a+" "+b.length()); } catch (NullPointerException e) { // TODO: handle exception System.out.println("catc
Class Class1 {
public int method (int a, String b) {
try {
System.out.println(a+" "+b.length());
}
catch (NullPointerException e) {
// TODO: handle exception
System.out.println("catch from the method");
}
finally {
System.out.println("finally from the method");
}
return 0;
}
}
第二个呢
当我在main中调用此方法并向其传递null参数时:
public Class Class2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Class1 c = null;
try {
c = new Class1();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
c.method(1, null);
}
catch (Exception e) {
// TODO: handle exception
System.out.println("catch from the main");
}
finally {
System.out.println("finally from the main");
}
System.out.println("\nEnd of the main");
}
}
结果是:
从方法中捕获
最后从方法上进行分析
最后从主要
干涸
现在我的问题是,为什么main中的catch块没有被执行?一旦捕获到异常,它就不再继续,但是可以再次抛出它。如果您想让main也看到异常,则需要在捕获异常后再次抛出该异常。试试这个:
public int method (int a, String b) throws NullPointerException{
try {
System.out.println(a+" "+b.length());
}
catch (NullPointerException e) {
// TODO: handle exception
System.out.println("catch from the method");
throw e;
}
finally {
System.out.println("finally from the method");
}
return 0;
}
请注意,由于函数中现在有一个抛出,因此需要将其包含在函数定义中
编辑:正如一些人所说,不需要捕获NullPointerException,因为它是一个未经检查的异常。这是因为它是RuntimeException的一个子类。一旦捕获到异常,它就不再继续,但您可以再次抛出它。如果您想让main也看到异常,则需要在捕获异常后再次抛出该异常。试试这个:
public int method (int a, String b) throws NullPointerException{
try {
System.out.println(a+" "+b.length());
}
catch (NullPointerException e) {
// TODO: handle exception
System.out.println("catch from the method");
throw e;
}
finally {
System.out.println("finally from the method");
}
return 0;
}
请注意,由于函数中现在有一个抛出,因此需要将其包含在函数定义中
编辑:正如一些人所说,不需要捕获NullPointerException,因为它是一个未经检查的异常。这是因为它是RuntimeException的一个子类。您可以找到许多关于抛出和捕获异常机制的文本。我发现更重要的是如何最好地利用异常概念 这不完全是对你问题的回答,但可能澄清了当前情况背后的一些概念 经验法则
原因
,并抛出此新异常。就我个人而言,我尽量避免这种“例外翻译”
如果您必须关闭您在体内获得的某些资源,如果不关闭,这些资源将被长时间阻止。想想I/O流、数据库连接/事务和类似的事情。不要仅仅为了内存分配而这样做,这是垃圾收集器的工作NullPointerException
时,它将无法完成其工作,因此它不应该正常返回,而是带着异常退出,最容易的方法是什么都不做(根本不做try/catch),只让异常框架执行其自动工作。这意味着它的调用者将获得原始的NullPointerException
:
public int method (int a, String b) {
System.out.println(a+" "+b.length());
}
如果
Class1.method()
的作业是“打印这两个数字,但仅当存在字符串时”,那么您应该捕获其中的NullPointerException(或者更好,使用If
检查),并正常返回(“我完成了我的工作!”)。然后Class2.main()
应该满足在null情况下不打印的要求,并且在调用Class1.method()
后没有理由做任何错误处理。如果Class2.main()
不希望出现这种行为,那么在这种情况下,它不应该调用Class1.method()
。您可以找到许多关于抛出和捕获异常机制的文本。我发现更重要的是如何最好地利用异常概念
这不完全是对你问题的回答,但可能澄清了当前情况背后的一些概念
经验法则
原因
,并抛出此新异常。就我个人而言,我尽量避免这种“例外翻译”