[英]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.