[英]Why does throwing an unchecked exception removes the “missing return statement” error
我對編程很陌生,因此這個問題可能看起來很傻。 下面提到的方法的返回類型為 int 數組。 當我們不拋出任何未經檢查的異常時,它會拋出我理解的錯誤。 但是為什么包含未經檢查的異常會消除該錯誤呢? 它仍然沒有任何返回語句,不是嗎?
public static int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
//throw new IllegalArgumentException("No two sum solution");
}
在具有非 void 返回類型的方法中沒有實際要求有 return 語句。 例如:
int huh() {
while (true) {}
}
是合法的。
要求是該方法無法正常完成( JLS ):
如果將方法聲明為具有返回類型(第 8.4.5 節),則如果方法的主體可以正常完成(第 14.1 節),則會發生編譯時錯誤。
正常完成基本上是在方法的執行“落到底部”時,即在沒有遇到 return 或 throw 語句的情況下到達方法的末尾。
所以,如果你在方法的末尾放了一個 throw 語句,執行就無法到達方法的末尾,所以是合法的。
在上面的huh()
示例的情況下,while 循環沒有正常完成,因此執行無法到達方法的末尾,因此您不需要 return 或 throw 那里。
在某些情況下,您的程序永遠不會到達內部 return 語句。 例如,如果nums
的長度為 0 或nums[j] == target - nums[i]
永遠不會為真。 對於這些情況,該方法需要返回一些東西或者它可以拋出異常。 您可以決定您的用例的正確行為是什么。 如果沒有為此類情況定義任何內容,並且您的 IDE 會讓您通過它,那么您將破壞代碼。 如果你拋出一個異常而不是什么都不做,你的 IDE 說它很好,因為你的代碼在技術層面上是正確的。
該異常強行將您從被調用的方法中踢出。 然后強制調用方法捕獲異常並繼續計算,而無需訪問被調用方法的返回值。
如果異常是不可避免的/無條件的,那么后面的 return 語句就不是必需的或有用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.