2015-03-03 34 views
0

一個try塊無需任何代碼:爲什麼一個帶有catch異常的空try塊被編譯?

try { 

} catch (Exception ex) { 
    // what Exception it is catching 
    ex.printStackTrace(); 
} 

的沒有任何代碼的含義是拋出異常是不可能的,所以爲什麼不這樣給出一個「無法訪問catch塊」編譯錯誤?

+2

你能不能給我們一些更詳細的在這裏?你如何編譯這段代碼?你在IDE或IntelliJ等IDE中工作嗎?此代碼是否位於'.java'源文件中? – 2015-03-03 05:46:32

+3

爲什麼*不應該編譯它?一個完全空的java文件也編譯。 – Bohemian 2015-03-03 05:48:05

+0

爲什麼這是什麼問題?它只是一個塊和高達你,如果你不想寫的錯誤代碼.Compiler檢查,你不要有任何 – silentprogrammer 2015-03-03 05:48:53

回答

2

這是有效的Java語法。這是同樣具有一個空當塊:

if (condition) { 

} 

...或定義一個空方法:

public void empty() { 

} 

...或者只是有意見作爲身體的一部分:

try { 
    // try body 
} catch (Exception e) { 
    // catch body 
} 

所有這一切是有效的語法,所以編譯器是幸福的。此外,由於空白行/空體完全正常,因此在運行時不會有異常情況發生在try塊中,因此代碼也可以正常執行。

+3

我認爲重點在於技術上'Exception'不能從無代碼中拋出,所以應該有一個「捕獲的可排除異常」編譯錯誤。 – Bohemian 2015-03-03 05:52:25

4

Exception包括RuntimeException s,它們是未選中的並且不需要聲明,所以Exception總是可以被有效捕獲。

我覺得這是一個不重要的邊緣情況。

+0

如何從空塊中拋出'RuntimeException'? – fastcodejava 2015-03-03 06:02:26

+1

@fast看到重複(我剛剛找到)從傳奇自己更完整的答案 – Bohemian 2015-03-03 06:06:08

1

所以我假設你的問題是什麼異常會被抓住,答案是沒有。只有在try塊內運行代碼時拋出異常纔會捕獲異常。然後它會檢查是否捕獲到異常(FYI異常會捕獲所有異常),如果是,它會在catch塊內處理它,否則會導致錯誤。由於try塊中沒有任何內容,所以不會捕獲異常,因爲不會拋出任何異常。