2017-02-08 37 views
-2

示例代码异常处理流程:JVM的控制

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)以字母B的JVM输出“输入一个整数”和用户类型是否字母B会被分配给int类型的可变数量,然后发生异常时,因为这种不兼容性OR

b)JVM输出“输入一个整数”,用户键入字母B.是否首先检查输入以确定它是否为整数,如果不是抛出异常以将控制权转移给catch块?

C)以上都不是?

我认为它是被定义为返回一个int位B和C.

+0

包含代码时请使用'{}'图标,而不是“JavaScript/HTML/CSS代码段”图标。我认为你是以JavaScript代码片段的形式输入的,但Java不是JavaScript。 – ajb

+1

这是调试器的用途。 –

+1

你为什么要问一个stackoverflow问题,通过打印变量的内容就可以很容易地发现它? –

回答

1

nextInt()的。所以它必须检查输入并将其转换为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)以获取有关例外如何工作的更多信息。

+0

“突然完成”。谢谢。这是我想知道的。 – silenceislife