我可以在 catch 语句中使用 Scanner
Can i use Scanner within a catch statement
如果我为第一个 Scanner 语句输入字母,我得到 "error!!" 和 "enter a number" 但不能输入另一个 number.I 我是初学者,不知道是否可以输入语句在 catch 语句中使用
import java.util.InputMismatchException;
import java.util.Scanner;
public class excep {
public static void main(String args[]){
int n;
Scanner input=new Scanner(System.in);
try{
System.out.println("ENTER A NUMBER: ");
n=input.nextInt();
}
catch(InputMismatchException e){
System.out.println("ERROR!!! \nENTER A NUMBER :");
n=input.nextInt();
}
}
}
从句法上讲,是的,你可以,但你不应该使用它。为什么?
如果扫描器是 closed
,input.nextInt();
可以抛出 InputMismatchException
或 NoSuchElementException
或 IllegalStateException
。
如果这些异常中的任何一个发生在 catch 块中,则您没有处理它们。你应该看看 how to implement a retry catch
你正在使用 input.nextInt(),意味着它只能接受 int values.If 你想输入字符串值,那么最好使用 input.nextine()。
在 catch 块中的代码中,您再次使用 input.nextInt() 但扫描器中已经输入了错误的内容,这就是为什么它会抛出 exception.If 您想在 catch 块中输入的原因,然后尝试以下代码:
catch(InputMismatchException e){
System.out.println("ERROR!!! \nENTER A NUMBER :");
Scanner input1=new Scanner(System.in);
n=input1.nextInt();
System.out.println("Inside catch:"+n);
}
在重新开始输入之前,您必须从缓冲区中吃掉或删除字符。为了简单起见,您的代码应该看起来相似:
while(true) {
Scanner input=new Scanner(System.in);
try {
System.out.println("ENTER A NUMBER: ");
n=input.nextInt();
break;
}catch(InputMismatchException e) {
System.out.println("ERROR!!! \nENTER A NUMBER :");
input.next(); // eat some chars
}
}
您的方法最大的问题是,如果 nextInt()
由于用户未输入有效整数而失败,则扫描器不会前进。扫描仪有一个指针指向下一个要从输入中读取的字符。当您使用 nextInt()
时,如果下一个 "token" 是一个整数,则扫描器会将指针前进到该整数之后。但如果它不是一个整数,就会抛出一个异常——指针会保持在原来的位置。因此,当您捕捉到异常,然后调用 nextInt()
时,扫描器会尝试读取它上次尝试读取的同一个无效整数。
要跳过错误的整数,您可以说 input.next()
跳过一个标记,或者说 input.nextLine()
跳过输入行的整个剩余部分,然后再尝试读取另一个整数。 (这两个 return String
结果,但您可以丢弃结果,因为它对您不重要)。
然而,这并不是一个很好的使用方法try/catch
。如果用户今天心情不好并输入了另一个无效整数,扫描器将抛出一个异常,并且不会被捕获,因为当第二个异常被抛出时你不在 try
中。 catch
不回环再抓。最好的习惯用法是循环:
boolean validIntegerEntered = false;
System.out.println("ENTER A NUMBER: ");
while (!validIntegerEntered) {
try {
n=input.nextInt();
validIntegerEntered = true; // will not get here if nextInt()
// throws an exception
}
catch (InputMismatchException e) {
input.nextLine(); // let the scanner skip over the bad input
System.out.println("ERROR!!! \nENTER A NUMBER :");
// don't call nextInt() here; loop back, and nextInt() will be called
// in the try statement
}
}
如果我为第一个 Scanner 语句输入字母,我得到 "error!!" 和 "enter a number" 但不能输入另一个 number.I 我是初学者,不知道是否可以输入语句在 catch 语句中使用
import java.util.InputMismatchException;
import java.util.Scanner;
public class excep {
public static void main(String args[]){
int n;
Scanner input=new Scanner(System.in);
try{
System.out.println("ENTER A NUMBER: ");
n=input.nextInt();
}
catch(InputMismatchException e){
System.out.println("ERROR!!! \nENTER A NUMBER :");
n=input.nextInt();
}
}
}
从句法上讲,是的,你可以,但你不应该使用它。为什么?
如果扫描器是closed
,input.nextInt();
可以抛出 InputMismatchException
或 NoSuchElementException
或 IllegalStateException
。
如果这些异常中的任何一个发生在 catch 块中,则您没有处理它们。你应该看看 how to implement a retry catch
你正在使用 input.nextInt(),意味着它只能接受 int values.If 你想输入字符串值,那么最好使用 input.nextine()。 在 catch 块中的代码中,您再次使用 input.nextInt() 但扫描器中已经输入了错误的内容,这就是为什么它会抛出 exception.If 您想在 catch 块中输入的原因,然后尝试以下代码:
catch(InputMismatchException e){
System.out.println("ERROR!!! \nENTER A NUMBER :");
Scanner input1=new Scanner(System.in);
n=input1.nextInt();
System.out.println("Inside catch:"+n);
}
在重新开始输入之前,您必须从缓冲区中吃掉或删除字符。为了简单起见,您的代码应该看起来相似:
while(true) {
Scanner input=new Scanner(System.in);
try {
System.out.println("ENTER A NUMBER: ");
n=input.nextInt();
break;
}catch(InputMismatchException e) {
System.out.println("ERROR!!! \nENTER A NUMBER :");
input.next(); // eat some chars
}
}
您的方法最大的问题是,如果 nextInt()
由于用户未输入有效整数而失败,则扫描器不会前进。扫描仪有一个指针指向下一个要从输入中读取的字符。当您使用 nextInt()
时,如果下一个 "token" 是一个整数,则扫描器会将指针前进到该整数之后。但如果它不是一个整数,就会抛出一个异常——指针会保持在原来的位置。因此,当您捕捉到异常,然后调用 nextInt()
时,扫描器会尝试读取它上次尝试读取的同一个无效整数。
要跳过错误的整数,您可以说 input.next()
跳过一个标记,或者说 input.nextLine()
跳过输入行的整个剩余部分,然后再尝试读取另一个整数。 (这两个 return String
结果,但您可以丢弃结果,因为它对您不重要)。
然而,这并不是一个很好的使用方法try/catch
。如果用户今天心情不好并输入了另一个无效整数,扫描器将抛出一个异常,并且不会被捕获,因为当第二个异常被抛出时你不在 try
中。 catch
不回环再抓。最好的习惯用法是循环:
boolean validIntegerEntered = false;
System.out.println("ENTER A NUMBER: ");
while (!validIntegerEntered) {
try {
n=input.nextInt();
validIntegerEntered = true; // will not get here if nextInt()
// throws an exception
}
catch (InputMismatchException e) {
input.nextLine(); // let the scanner skip over the bad input
System.out.println("ERROR!!! \nENTER A NUMBER :");
// don't call nextInt() here; loop back, and nextInt() will be called
// in the try statement
}
}