示例代码:
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.
答案 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教程,以获取有关异常如何工作的更多信息。