static void test() {
try {
System.out.print(x.toString() + " ");
}
finally { System.out.print("finally "); }
}
public static void main(String args[])
{
try
{
test();
}
catch (Exception ex) { System.out.print("exception ");
}
输出为finally exception
。
为什么在编译时没有抛出错误,尽管try
中的catch
后面没有test()
?
答案 0 :(得分:9)
Java 7添加ARM(自动资源管理)意味着您可以单独使用try
。
try (PrintWriter pw = new PrintWriter("out.txt")) {
pw.println("Hello World!");
}
当此范围退出时,这将关闭pw
。
答案 1 :(得分:6)
版本7之前的Java版本允许try-catch-finally的这三种组合:
try - catch
try - catch - finally
try - finally
异常可能是NullPointerException
,因为没有x
被声明为静态字段并在内联或main
方法中初始化。无论finally
或/和try
块中发生了什么,catch
块都会被执行。
答案 2 :(得分:3)
因为唯一的要求是try块必须后跟至少一个catch块 或 一个finally块。
请参阅Java语言规范中的The try statement。
答案 3 :(得分:1)
尝试不一定需要一个catch子句。
以下是java中的有效异常处理子句:
try-catch
条款,try-finally
条款或try-catch-finally
条款。答案 4 :(得分:1)
尝试必须在java中跟一个catch或一个finally块。
如果最终存在,则不需要捕获。
答案 5 :(得分:0)
try
必须紧跟catch
或finally
。总是不需要catch
阻止。如果没有catch
或finally
编译时,将发生错误
答案 6 :(得分:0)
你真的回答了自己的问题。没有编译时错误,因为try块不必跟随catch。它在语义上是正确的,并且经常需要在尝试之后才想要一个finally块。
也许该方法抛出异常,但您仍想关闭连接。
例如:
public void connect() throws IOException {
Socket s = new Socket();
try {
s.getInputStream();
}
finally {
s.close();
}
}