没有try块的异常处理

时间:2016-08-09 21:37:19

标签: java

我认为这是正确的...当异常发生时,抛出异常类的对象,如果我们不使用try或catch块,那么该对象将转到JVM。                                                                                    我的问题是为什么try块是必要的,为什么不能捕获块足够好,因为异常对象不是在try块中创建的?我知道java要求你试一试阻止测试可能发生异常的代码,但是想知道是否以任何方式创建了异常对象,那么为什么无法捕获阻塞就足够了。这个问题与其他异常处理问题的不同之处在于,似乎没有人询问是否需要专门设置try块。

2 个答案:

答案 0 :(得分:2)

假设您有以下

doSomething(); // throws Exception1
doNothing();   // throws Exception2 which extends Exception1
catch(Exception 1 ex){   // handle exception  }

catch块适用于什么?只有在doNothing()中抛出异常时,它才会起作用吗?或者它也适用于doSomething()的通话。或者它可能只适用于doSomething()而不是doNothing(),它会抛出异常2。

遗漏括号有先例。例如,考虑接下来的两组代码。

int i;
for( i = 0 ; i < 10 ; i++) 
   System.out.println("hello World" + i);

int i;
for( i = 0 ; i < 10 ; i++) 
{
   System.out.println("hello World" + i);
}

这里的for语句被理解为在下一个括号内的块或下一行代码中起作用。

因此,我认为可能有一些catch语句可用于前一个语句或前一个语句。但这只是语法糖,对吧?没有任何功能可以通过尝试阻止而丢失。

答案 1 :(得分:2)

try { }部分表示catch { }块正在保护的代码部分。

void test() {
    do_something();          // Not covered
    try {
       something_fixable();  // Covered
    } catch (InvalidStateException ex) {
       do_recovery_for_fixable_thing();
    }
}

如果没有try { }块,catch { }块可能会尝试捕获除它可以处理的异常之外的异常。

即使do_something()抛出的异常是同一种异常,InvalidStateException,恢复代码也不会处理它;它不应该是。