JVM异常处理控制流程

时间:2017-02-08 05:31:33

标签: java exception controls

示例代码:

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输出“输入一个整数”,用户输入字母B.字母B是否被分配给int类型的变量号,然后由于这种不兼容性而发生异常或

b)JVM输出“输入一个整数”,用户输入字母B.是否首先检查输入以确定它是否为整数,如果没有抛出异常以将控制转移到catch块?< / p>

C)以上都没有?

我认为它有点像B和C.

1 个答案:

答案 0 :(得分:1)

nextInt()定义为返回int。因此,必须检查输入并将其转换为int。如果它无法生成int,它就不能只返回任何旧东西(如字母或String),因为它只能返回int。< / p>

在这种情况下,它根本不会返回。它引发了一个例外。呼叫nextInt()的声明被放弃了;那句话中没有其他事情发生。在Java术语中,突然完成。如果语句要调用其他方法,则不会调用它们。如果该语句将要执行的赋值,则不会发生。这就是异常的工作原理。

并且该声明之后的任何声明都不会被执行 - 它们只是被跳过。

在这种情况下,声明

int number = input.nextInt();

突然完成。但是,由于它位于try块中,因此程序会查看该异常是否有catch块。在这种情况下,有。因此,在上述语句突然完成后,程序会跳过其他所有内容到catch块中的第一个语句。

但是,如果没有try块,则整个方法将突然完成。然后调用该方法的语句也会突然完成,这可能导致它所在的方法突然完成,依此类推,直到它被捕获或导致程序崩溃堆栈跟踪。

请尝试有关异常(https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html)的Oracle教程,以获取有关异常如何工作的更多信息。