应该尝试始终跟随捕获?

时间:2012-02-06 09:42:47

标签: java try-catch

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()

7 个答案:

答案 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条款。

检查JLS Chapter 11.3, Handling Exceptions

答案 4 :(得分:1)

尝试必须在java中跟一个catch或一个finally块。

如果最终存在,则不需要捕获。

答案 5 :(得分:0)

try必须紧跟catchfinally。总是不需要catch阻止。如果没有catchfinally编译时,将发生错误

答案 6 :(得分:0)

你真的回答了自己的问题。没有编译时错误,因为try块不必跟随catch。它在语义上是正确的,并且经常需要在尝试之后才想要一个finally块。

也许该方法抛出异常,但您仍想关闭连接。

例如:

public void connect() throws IOException {
    Socket s = new Socket();
    try {
        s.getInputStream();         
    }
    finally {
        s.close();
    }
}