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