[英]JVM Exception handling flow of control
示例代碼:
package com.company;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean continueInput = true;
do {
try {
System.out.println("Enter an integer");
int number = input.nextInt();
System.out.println("The number entered is " + number);
continueInput = false;
}
catch (InputMismatchException ex) {
System.out.println("Try again, enter integer only: ");
input.nextLine();
}
}
while (continueInput);
}
}
上面的程序是測試InputMismatch異常類。 我不確定在輸入字母時控制流在什么時候傳遞到 catch 塊。 具體來說,會發生什么情況?
a) JVM 輸出“Enter an integer”,用戶輸入字母 B。字母 B 是否被賦值給 int 類型的變量號,然后因為這種不兼容而發生異常或
b) JVM 輸出“輸入一個整數”,用戶輸入字母 B。是否首先檢查輸入以確定它是否是一個整數,如果不是則拋出異常以將控制轉移到 catch 塊?
或者
C) 以上都不是?
我覺得有點B和C。
nextInt()
被定義為返回一個int
。 所以它必須檢查輸入並將其轉換為int
。 如果它不能從中得到一個int
,它就不能只返回任何舊的東西(比如一個字母或一個String
),因為它只能返回int
。
在這種情況下,它根本不會返回。 它拋出異常。 放棄調用nextInt()
的語句; 該聲明中沒有其他任何事情發生。 在 Java 術語中,它突然完成。 如果語句要調用其他方法,則不會調用它們。 如果有一個語句要執行的賦值,它就不會發生。 這就是異常的工作方式。
並且該語句之后的任何語句都不會被執行——它們只是被跳過。
在這種情況下,聲明
int number = input.nextInt();
突然完成。 但是,由於它在try
塊中,因此程序會查看是否存在用於異常的catch
塊。 在這種情況下,有。 因此,在上述語句突然完成后,程序會跳過其他所有語句,跳轉到catch
塊中的第一條語句。
但是,如果沒有try
塊,則整個方法將突然完成。 然后調用該方法的語句也將突然完成,這可能導致它所在的方法突然完成,依此類推,直到它被捕獲或導致您的程序因堆棧跟蹤而崩潰。
請嘗試有關異常的 Oracle 教程 ( https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html ) 以獲取有關異常如何工作的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.