2014-10-03 26 views
4

JLS at the 14.20.1說:「最左邊」在那個定義中意味着什麼?

如果V的運行時類型是賦值兼容(第5.2節)一 捕異常類try語句中的任何catch子句, 那麼第一個(最左邊)這樣的catch子句被選中。

最左邊是什麼?我們把catch子句由上到下的,例如:

try{ } 
catch(IndexOutOfBoundException e){ } 
catch(SQLException e){ } 
catch(NullPointerException e){ } 
//etc 
+0

這與在後來的Java版本中引入的任何新功能無關。 – 2014-10-03 11:36:44

回答

6

這與Java的任何新語言功能無關。

術語「最左邊」簡單地說就是最早出現的catch子句。將代碼描繪爲一個一維的代幣序列,從左向右延伸。這就是語言分析器看到它的方式。

因此,所有規定陳述的是,第一個匹配的catch-clause被輸入。

+0

你的意思是如果拋出異常,可以處理異常的第一個catch-block會被選中,對嗎?這個概念是不是涉及多捕獲條款? – 2014-10-03 11:41:47

+0

@ St.Antario是的,該語句解釋的語義自1.0版以來一直在Java中使用。 – 2014-10-03 11:43:20

+2

@assylias雖然我寫了「圖片」,但你實際上畫了這張圖片:) – 2014-10-03 11:44:06

0

我們可以按照

try{ } 
catch(IndexOutOfBoundException e){ } 
catch(SQLException e){ } 
catch(NullPointerException e){ } 

try{ } catch(IndexOutOfBoundException e){ } catch(SQLException e){ }catch(NullPointerException e){ } 

轉換現在你可以看到什麼是最左邊。換句話說,我們可以說最早出現的catch條款。

Java 7我們可以清楚地說出這一點。因爲我們可以寫多個catch as

try{ } 
    catch(IndexOutOfBoundException |SQLException |NullPointerException e){ } 

現在更清楚了。

+0

這個答案正確嗎?有人可以確認嗎?如果這樣可以真正爲我節省一些輸入捕捉子類型的異常? – 2014-10-03 11:42:28

+1

@EvzhanMustafa你可以在Java 8中使用多重捕獲,但你提到的特定句子與此無關。 – assylias 2014-10-03 11:43:28

+1

@EvdzhanMustafa是的,它是完全正確的。哦爲什麼+3和'-3'? – 2014-10-03 11:47:22

1

您所引述的JLS這是完全有效的版本比6

高有一個在你的問題中引用的代碼沒有leftmost

對於Java 8 - 異常處理有不同的語法。

例如 - 你可以做一些事情像

catch (Exception one | Exception two | Exception three) { 
    // handling part 
} 

這裏,最左邊的是Exception onequote可以用上面的語法進行驗證。

編輯 - 我修改。

它與Java 7或更高版本中引入的catch語法無關。

leftmost表示首先遇到的catch塊,它與異常類型thrown相匹配。

例如

try { 
    throw E1; 
} catch (Exception E1) {} //1 
    catch (Exception E2) {} //2 
    catch (Exception E3) {} //3 

對於上述碼,leftmost catch塊是在1

請隨時評論和分享你的知識。

4

技術上的例子可以寫成:

try{ } catch(IndexOutOfBoundException e){ } catch(SQLException e){ } catch(NullPointerException e){} 

最左邊先簡單指節目順序。

ps:它與多個捕獲異常無關,可以在3rd edition of the JLS中找到措辭,儘管目前還沒有多捕獲概念。

+0

這個標準在那一刻只是有點不成熟。現在我明白了,謝謝。 – 2014-10-03 11:42:40