簡體   English   中英

JVM異常處理控制流程

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

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