java中异常处理时为什么可以只要try-finally,而可以不要catch啊。
1) 分析下列java代码:
class A
{
public static void main(String[] args)
{
method();
}
static void method()
{
try
{
System.out.println(“Hello”);
}
finally
{
System.out.println(“good-bye”);
}
}
}
编译运行后,输出结果是()。(选择一项)
a) ”Hello”
b) ”good-bye”
c) “Hello”
“good-bye”
d) 代码不能编译
答案是C,而且我在eclipse中运行过,也确实是C,但是JAVA的语法不都是说try和catch要一起使用吗,为什么可以只有try而没有catch也可以啊。另外如果我把finally去掉后报错,提示我要把finally加上去。奇怪。 展开
因为在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。try、catch、finally三个模块的特点如下:
try 块:用于捕获异常。
catch 块:用于处理try捕获到的异常。
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。
编译器硬性规定,异常如果选择捕获,就必须用catch显示声明以便进行处理。如果只用try去处理异常却不加catch,编译是通不过的。但在运行时没有此规定,所以可以不要catch。
try、catch、finally语句块的执行顺序为:
①当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句。
②当try捕获到异常,catch语句块里没有处理此异常:这种情况下,该异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行。
③当try捕获到异常,catch语句块里有处理此异常:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句。
扩展资料
使用try-catch-finally时,必须遵循以下几条规则:
①必须在 try 之后添加 catch 或 finally 块,try 块后可同时接 catch 和 finally 块,但至少有一个块。
② 若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。
③ catch 块与相应的异常类的类型相关。
④ 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块。
⑤ 可嵌套 try-catch-finally 结构。
⑥在 try-catch-finally 结构中,可重新抛出异常。
⑦除了下列情况,总将执行 finally 做为结束:JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。
参考资料:百度百科-异常处理
更为严格的说法其实是:try只适合处理运行时异常,try+catch适合处理运行时异常+普通异常。也就是说,如果你只用try去处理普通异常却不加以catch处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以catch可以省略,你加上catch编译器也觉得无可厚非。
理论上,编译器看任何代码都不顺眼,都觉得可能有潜在的问题,所以你即使对所有代码加上try,代码在运行期时也只不过是在正常运行的基础上加一层皮。但是你一旦对一段代码加上try,就等于显示地承诺编译器,对这段代码可能抛出的异常进行捕获而非向上抛出处理。如果是普通异常,编译器要求必须用catch捕获以便进一步处理;如果运行时异常,捕获然后丢弃并且+finally扫尾处理,或者加上catch捕获以便进一步处理。
至于加上finally,则是在不管有没捕获异常,都要进行的“扫尾”处理。
因为捕获异常是必须要有的,而捕获到异常之后,如果不做处理,那就不用写catch,如果需要对捕获到异常之后做处理才需要catch,finally也是一样,可以不用写,也可以加上。
在本题中,try中的打印语句并没有异常发生,所以应该正常输出,对于finally,无论有没有异常发生,都必须执行它,所以答案是上面代码中的两条语句都会被执行到。