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