2012-12-08 113 views
24

我正在評審我準備明天早上參加期末考試的期中考試。我把這個問題弄錯了,但沒有指出正確的答案,我忽略向教授詢問這個問題。當main方法拋出異常時,這意味着什麼?

考慮下面的代碼片段:

public static void main(String[] args) throws FileNotFoundException 

以下哪項關於這個代碼是正確的?

  1. 主要方法被設計用來捕獲和處理所有類型的異常。
  2. 主要方法是設計用來捕獲和處理FileNotFoundException
  3. 如果FileNotFoundException發生,主要方法應該簡單地終止。
  4. 如果發生任何異常,主要方法應該簡單地終止。

我選擇了第二個選項。

回答

13

回答是4號,

4.-如果發生任何異常的主要方法應當簡單地終止。

throws子句只聲明該方法拋出一個檢查的FileNotFoundException,並且調用方法應該捕獲或重新拋出它。如果在main方法中引發(而不是捕獲)未檢查的異常,它也將終止。

檢查一下測試:

public class ExceptionThrownTest { 

    @Test 
    public void testingExceptions() { 

     try { 
      ExceptionThrownTest.main(new String[] {}); 
     } catch (Throwable e) { 
      assertTrue(e instanceof RuntimeException); 
     } 

    } 

    public static void main(String[] args) throws FileNotFoundException { 

     dangerousMethod(); 

     // Won't be executed because RuntimeException thrown 
     unreachableMethod(); 

    } 

    private static void dangerousMethod() { 
     throw new RuntimeException(); 
    } 

    private static void unreachableMethod() { 
     System.out.println("Won't execute"); 
    } 
} 

正如你所看到的,如果我把一個RuntimeException方法將終止,即使拋出的異常是不是FileNotFoundException

+1

嗯,但問題是關於'公共靜態無效的主要(字串[] args)拋出FileNotFoundException異常 '簽名,不是一般 – PermGenError

+1

好了,測試了一下,如果你把比'FileNotFoundException'它贏得了其他經過檢查的異常不會編譯。否則,如果該方法拋出一個未經檢查的異常,那麼它將簡單地結束傳播未經檢查的異常。 – ElderMael

+0

嗯,真的。 +1 :) – PermGenError

2

主要方法是不要再追任何異常,而是通過將它引發到調用main方法的源來處理FileNotFoundException

該系統運行時啓動JVM班,JVM類中一個特定的類調用的主要方法。

的處理爲主要方法的throws是在這種情況下,JVM類的擺佈。

  • 您可以在Oracle提供的Java language specification中閱讀它。
  • 此外,您可以查看源代碼的一些可用在那裏的的JVM,去這條道路雖然你走以其他編程語言,OpenJdk

我想到的是主題分享我的小謙卑研究地殼,希望它可以幫助那些好奇:)

8

哥們,有點晚了,但答案是3號。

1號是假的,因爲它不處理FileNotFoundException異常

2號是出於同樣的原因假。

數字3爲真。如果拋出FileNotFoundException,則主方法將終止。

4號是錯誤的。它不會在任何異常情況下終止。它只會在未經檢查的異常或FileNotFoundException時終止。如果'throws'子句中沒有聲明其他檢查過的異常,則表示它們正在該方法內處理。

+0

這個答案顯然是錯誤的。爲什麼這裏沒有任何評論或者反對票?只有在沒有任何'try-catch'語句的情況下'throws'的方法將不會處理這些異常。 – user3437460

+0

我認爲這個練習的目的是想象主要方法中的內容。我同意它留下含糊不清和假設的餘地。但是,因爲它拋出FileNotFoundException異常,我假定正在處理任何其他檢查異常(使用try-catch)。另外我假設它不處理未經檢查的異常。 – MartinV

-1

雖然答案已經選擇了這個問題,我認爲正確的答案,你的測試號3:

  • 主要方法應該簡單地終止,如果發生FileNotFoundException。
  • 因爲它說:應該,不
    我的意思是,方法中的代碼可以捕獲任何異常,既可以選中也可以不選中,並且可以吞嚥,恢復或重新拋出異常,或者它根本無法捕獲它們。

    但是,如果它在沒有最終(重新)拋出它的情況下捕獲FileNotFoundException,它將破壞它自己的合約:任何調用者都不會在方法簽名中看到異常,因爲該方法處理它(甚至可能是編譯器在這種情況下可以投訴,說這個例外從未拋出,但我不確定)。

    我認爲你的期中期提出了一個關於設計的問題,而不是一個具體的實現。

    1

    我一些其他的答案一致認爲的正確答案的問題是,選項3選項4說:

  • 主要方法應該簡單地終止,如果發生任何異常。
  • 請注意此選項中的「任何」。下面是其中發生異常的代碼示例,但main()不會終止:

    public static void main(String[] args) throws FileNotFoundException { 
        try { 
         methodThatThrowsACheckedException(); 
        } catch (SomeCheckedException e) { 
         // do something to handle this exception 
        } 
    } 
    

    在這段代碼中發生異常,但該方法不會終止,因爲它已經建立,以處理這個異常。如果這個例外是未被捕獲的UncheckedException,那麼該方法當然會終止。然而,選項4的意義在於,任何反例都會使其無效,因爲它表示出現「任何」異常。

    選項3,但是,限制了這種終止於僅當在方法的簽名拋出異常發生:

  • 如果發生FileNotFoundException主要方法應該簡單地終止。
  • 之所以選擇3更有意義,因爲類似於下面的代碼是沒有意義的實踐:

    public static void main(String[] args) throws FileNotFoundException { 
        try { 
         methodThatThrowsFileNotFoundException(); 
        } catch (FileNotFoundException e) { 
         // do something to handle this exception 
        } 
    } 
    

    它沒有太大的意義來聲明一個方法拋出一個異常,但在方法中捕獲該異常(除非可能在執行某些操作後重新拋出它,在這種情況下,方法3仍然存在,因爲方法最終終止)。

    相關問題