2014-04-09 98 views
1

我是新來的例外,這是我所知道的,到目前爲止:關於投擲拋出:IllegalArgumentException

  • 投和罰球都不同

  • 做「拋出IllegalArgumentException」我可能會增加'拋出IllegalArgumentException'方法簽名

  • 非法參數異常是一個未經檢查的異常和「處理未在編譯期間驗證的異常

來源:http://javarevisited.blogspot.com/2011/12/checked-vs-unchecked-exception-in-java.html#ixzz2yM5jNFeghttp://www.tutorialspoint.com/java/java_exceptions.htm

這是一個家庭作業的問題:不拋拋出:IllegalArgumentException使程序立即退出?

這個問題似乎有點普遍,可能是錯誤的,但我並不完全清楚IllegalArgumentException。這些消息並沒有以一種簡單的方式真正體現「拋出」,所以我仍然感到困惑。所以,如果能夠對此進行簡單的解釋,那將是非常好的。

+0

如果您調用一個需要特定輸入但您不服從的方法,則可能會拋出IllegalArgumentException。如果任何異常未被捕獲,您的程序將結束。如果它被任何人抓住了調用堆棧,那麼捕獲器就如何處理它。因此,如果您預計您的調用可能導致IllegalArgumentException,那麼您可以通過兩種方式處理它。 1)在打電話之前親自檢查變量以確保它們良好。 2)用try塊包圍你的調用並捕獲IllegalArgumentException並在發生時做適當的事情。 –

+0

有兩種類型的例外。 「檢查異常」和「運行時異常」。如果該方法拋出檢查的異常,則只需在方法簽名中聲明'throws'子句。對於運行時異常(即IllegalArgumentException),您不需要在方法簽名中聲明throws子句。拋出異常不會立即退出程序。您可以選擇捕捉並處理該異常。 – anonymous

+0

@stvcisco我只是假設我打電話'拋出IllegalArgumentException',而不是做一個try-catch塊。這是否會退出當前的方法?甚至整個計劃?我想不是,對吧? – user3511965

回答

2

投擲任何異常使得緊接在當前方法退出,而不是整個程序。而且,這個例外將繼續在調用方法上拋出,從第一種方法拋出它的地方;這被稱爲傳播。它是否繼續在這一點取決於該調用方法是否捕獲該異常。如果什麼都沒有捕捉到異常,它將一直傳播回main方法(假定一個簡單的單線程應用程序),並且如果該方法也拋出異常,則然後該程序將退出。

void callee() { 
    if (someTrueCondition()) { 
     throw new IllegalArgumentException("whatever"); 
    } 
    System.out.println("this will never get called"); 
} 

void caller() { 
    calle(); // the IllegalArgumentException propagates from here 
    System.out.println("this will also never get called"); 
} 

以上是任何異常真。 IllegalArgumentException與其他的不同之處僅在於它沒有被選中,因此不需要在可能拋出它的方法的throws子句中聲明。 (請注意,在你的問題,你說你可能會需要聲明throws IllegalArgumentException,但實際上你不這樣做,因爲它是一個unchecked異常)。

如果你是不是拋出檢查異常(例如,throw new SQLException()),然後calleecaller將需要聲明該異常。 callee需要聲明它,因爲它直接拋出異常,並且caller需要聲明它,因爲它可能通過callee的傳播間接拋出該異常。

停止傳播的唯一方法(運行時的異常以及編譯時的throws子句)都是用try-catch來捕獲給定的異常。

+0

如果只有一個主要功能,我們稱之爲聲明怎麼辦?它會導致程序退出嗎? – user3511965

+0

是的;如果'main'拋出一個異常,程序將暫停(再次假設一個單線程應用程序)。 – yshavit

+0

停止等於停止嗎?你認爲是否導致程序立即退出的問題太廣泛而普遍? – user3511965

1

未捕獲的異常可以使單線程應用程序退出。如果您將下面的foo/bar示例放入Java應用程序中,您將看到執行狀態將因未捕獲的異常而終止。

差異

/** 
* This is my foo method 
* @throws IllegalArgumentException if argument is wrong! 
*/ 
public void foo(String s) throws IllegalArgumentException { 
    // Some code 
    if (!s.equals("bar")) { 
     throw IllegalArgumentException("something not quite right here..."); 
    } 
} 

之間拋出&擲

就快成功了 - 拋出:是文檔的目的在評論以及使用方法簽名表示任何可能出現的異常的方法 威力拋出。這包括直接或間接拋出的異常。添加任何它被鏈接或無法捕獲的拋出總是很好,它可以從任何使用相同或其他對象/類的方法拋出。

Throw是實現代碼。當您嘗試在運行時向方法發送錯誤的類參數類型時,通常會引發IllegalArgumentException。如上所示,您也可以在檢查失敗時隨時手動拋出它們。另外,你不需要在方法簽名中聲明它,但是如果你聲明瞭它,你的任何實現代碼都應該被包裝在try/catch塊中。

間接異常的一個例子:

class foo { 
    /** 
    * @throws IllegalArgumentException when s != foo 
    */ 
    public void foo(String s) throws IllegalArgumentException { 
     if (!s.equals("foo")) { 
      throws IllegalArgumentException("argument did not equal 'foo'"); 
     } 
    } 
} 

class bar { 
    protected foo foo; 
    public bar() { 
     this.foo = new foo(); 
    } 

    public void bar(String s) throws IllegalArgumentException { 
     this.foo.foo(s); 
    } 
} 
+1

我不認爲OP爲了文檔目的詢問'@ throws'。在方法簽名中需要'throws'子句的情況是該方法拋出一個'checked exception'。嘗試拋出新的IOException(「」)'沒有throws子句,你會看到問題。 – anonymous

+0

不太...拋出規範,而不是評論。 – djechlin

+0

我不好,根據那個更正了答案 –

相關問題