繁体   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