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 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。

参考资料:百度百科-异常处理

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-01-10
我去!!这样的答案居然采纳!!正解在这里!
更为严格的说法其实是:try只适合处理运行时异常,try+catch适合处理运行时异常+普通异常。也就是说,如果你只用try去处理普通异常却不加以catch处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以catch可以省略,你加上catch编译器也觉得无可厚非。
理论上,编译器看任何代码都不顺眼,都觉得可能有潜在的问题,所以你即使对所有代码加上try,代码在运行期时也只不过是在正常运行的基础上加一层皮。但是你一旦对一段代码加上try,就等于显示地承诺编译器,对这段代码可能抛出的异常进行捕获而非向上抛出处理。如果是普通异常,编译器要求必须用catch捕获以便进一步处理;如果运行时异常,捕获然后丢弃并且+finally扫尾处理,或者加上catch捕获以便进一步处理。
至于加上finally,则是在不管有没捕获异常,都要进行的“扫尾”处理。
第2个回答  2013-06-04
try 和 catch 不需要一定共存,try是尝试对其中代码捕获异常,catch是捕获异常并且可以处理异常。。你可以 try 来搜寻异常,不去捕获。也就是不去catch 这是可以的。。至于提示加finally,finally的意思是,其中的代码一定会执行,也就是说,如果try 其中的代码产生了异常,如果有catch 则会直接跳转到catch部分,如果没有catch 会跳转到‘}’后面的代码,这样,以上方法就没有一个确定的返回值,所以要加finally 作为方法出异常以后的返回的结果。。。
第3个回答  推荐于2017-09-12
在Java的try、catch、finally中,try是必须的,catch和finally都不是必须的。
因为捕获异常是必须要有的,而捕获到异常之后,如果不做处理,那就不用写catch,如果需要对捕获到异常之后做处理才需要catch,finally也是一样,可以不用写,也可以加上。
第4个回答  推荐于2017-10-05
try和catch可以连用,try-catch- finally可以连用,这是众所周知的,但是try、catch、finally这三个关键字却不能单独使用,如果在程序中只想try而不去catch也是可以的,但是try的后面必须跟有finally。
在本题中,try中的打印语句并没有异常发生,所以应该正常输出,对于finally,无论有没有异常发生,都必须执行它,所以答案是上面代码中的两条语句都会被执行到。本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网