2014-07-02 172 views
-3

任何人都可以幫助我,當我執行這個程序時會發生什麼。爲什麼編譯器不能告訴編譯時異常?

它應該拋出編譯時錯誤,但它沒有給它。

public class Test { 
public static void main(String args[]){ 
    int c = getCount(); 
    System.out.println(c); 
} 

private static int getCount() { 
    try{ 
     throw new IOException(); 
    }finally{ 
     return 10; 
    } 
} 

在此先感謝!

+2

'它應該拋出編譯時異常'。爲什麼? –

+2

我的問題是'爲什麼?',你的回答是'是'。我很困惑。 –

+0

什麼是「編譯時異常」。你的意思是「編譯時錯誤」? – Raedwald

回答

10

這是因爲您在finally區塊中有一個return聲明 - 所以IOException實際上不會被拋出getCount()方法。如果finally塊突然完成(即它引發異常或具有返回語句),那麼整個try/finally或try/catch/finally塊將完成。

JLS section 14.20.2

如果try塊的執行突然完成,因爲值V的拋,然後有一個選擇:

  • ...
  • 如果最後由於S原因塊突然完成,然後try語句爲S原因突然完成(並丟棄和遺忘值V的拋出)。

而且從section 11.2.2(報表除外分析) - 重點是礦山:

一個try語句(§14.20)可以拋出一個異常,E級IFF之一:

  • try塊可以拋出E,或者用於初始化資源的表達式(在try-with-resources語句中)可以拋出E,或者資源的close()方法的自動調用(在try-with-resources聲明)可以拋出E和E是不分配任何捕異常類try語句中的任何catch子句的兼容,並要麼沒有finally塊存在或finally塊可以正常完成
  • ...

在你的情況,終於阻止不能正常完成(即由於return語句,所以對try語句的分析結果是它不能拋出異常。

如果將return 10;移至finally塊之後,則會得到您所期望的錯誤。