2012-02-06 67 views
0
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后面跟着catchtest()

+0

try-catch-finally用于运行时异常而不用于编译时错误 – Kris 2012-02-06 09:49:59

+0

@Kris,不正确。检查异常是**不是**运行时异常,'try-catch-finally'对于任何异常都是有效的。 – 2012-02-06 10:00:25

+0

@TEG对不起,你是对的,我只想指出try-catch-finally编译时间错误的有用性,我指的是程序运行时发生的所有类型的错误/异常,而不是编译后的 – Kris 2012-02-06 10:11:00

回答

5

的Java版本7之前的版本允许的的try-catch-最后这三个组合:

​​

唯一的例外可能是一个NullPointerException因为没有声明为静态字段和初始化在线或mainx方法。无论try或/和catch块发生了什么,finally块都将始终执行。

+0

Java 7允许ARM自己尝试。 ;) – 2012-02-06 10:05:00

+0

@PeterLawrey首先,我很震惊地知道在ARM架构(RISC基础)中使用Java,直到我阅读您的答案;) – Johnydep 2012-02-06 10:09:21

+0

@Johnydep Java也可用于Linux上的ARM;) – 2012-02-06 10:26:28

0

try必须跟着catchfinally。总是不需要catch块。没有任何的catchfinally编译,因为唯一的要求是try块必须跟随至少一个catch块 finally块会发生时间错误

1

尝试不一定需要catch子句。

以下是有效的异常处理条款中的java:

  • try-catch条款,
  • try-finally条款或
  • try-catch-finally条款。

检查JLS Chapter 11.3, Handling Exceptions

1

尝试后面必须跟着一个catch或者java中的finally块。

如果终于在那里,捕获是没有必要的。

0

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

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

例如:

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

Java 7中加入ARM(自动资源管理)将意味着你可以单独使用try

try (PrintWriter pw = new PrintWriter("out.txt")) { 
    pw.println("Hello World!"); 
} 

这个范围退出时关闭pw