2012-02-06 63 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