簡體   English   中英

拋出異常而無需在Java中使用try

[英]Throw exceptions without needing to use try in Java

我有想要運行的Java代碼。 如果已完全添加了4個以上的字符串,則應引發異常,但是在調用addString方法的前4次中,不需要使用try / catch。

Foo myFoo = new Foo();
myFoo.addString("String A");
myFoo.addString("String B");
myFoo.addString("String C");
myFoo.addString("String D");


boolean exceptionThrown = false;

try {
    myFoo.addString("String E");
} catch (NoRoomForMoreStringsException e) {
    exceptionThrown = true;
}

assertTrue(exceptionThrown);

如果我在addString函數中添加這樣的內容,它將要求我始終使用trow / catch語句。

public void addString(String str) throws NoRoomForMoreStringsException {
    ...
    if(strings.size() >= 4) {
        throw new NoRoomForMoreStringsException();  
    }

我如何在addString方法中引發異常而無需始終使用try / catch語句?

您的NoRoomForMoreStringsException可以是未經檢查的異常 我並不是說這是一個好主意,但是它將滿足您的要求。

如何在不需要始終使用try / catch語句的情況下在addString方法中引發異常?

您需要將NoRoomForMoreStringsException聲明為RuntimeException ,如下所示:

public NoRoomForMoreStringsException extends RuntimeException {

   //methods for custom exception
}

在Java中, Exception對象是兩種類型:

(1)已檢查的異常:這些異常迫使您嘗試/捕獲或在方法簽名中聲明它們(例如您當前的NoRoomForMoreStringsException)。 最佳實踐是,您需要非常仔細地使用這些Checked異常,即僅當您在捕獲異常時需要執行恢復操作時才使用。

(2)未檢查的/運行時異常:這些異常不會強制您捕獲或聲明該異常。

在大多數情況下,您更喜歡使用Runtime Exceptions(上面的Type 2),因為通常,在獲得異常后,我們將能夠做的很少(例如記錄日志)。

因為Checked Exceptions非常嘈雜(意味着它們迫使調用者在方法簽名中捕獲或聲明),所以流行的框架(如Spring )會盡量避免它們,即Spring拋出Runtime Exceptions甚至更好地包裝/轉換Checked Exceptions(如果有)。從JDK)到運行時異常,然后拋出。

簡而言之,如果您具有恢復機制,則將使用Checked Exception(上面的Type1),否則,就需要使用RuntimeException(上面的Type2)。

你可以在這里參考

如果您沒有抓住它,編譯器會抱怨,但是它仍然可以編譯並運行良好。

public static void main(String args[]){
  System.out.println("Starting!");
  Foo myFoo = new Foo();
  myFoo.addString("String A");
  myFoo.addString("String B");
  myFoo.addString("String C");
  myFoo.addString("String D");
  myFoo.addString("String E");
}

並輸出:

Starting!
Adding: String A
Adding: String B
Adding: String C
Adding: String D
Adding: String E
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at Foo.addString(Foo.java:6)
    at StackOverFlow.main(StackOverFlow.java:9)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM