我试图在一个while循环中使用JAVA中的try-catch语句,只是为了向nextInt提供字符串输入时捕获异常,我不知道为什么它在第一次错误后继续引发异常输入
代码
import java.util.Arrays;
import java.util.Scanner;
public class People{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
Scanner inS=new Scanner(System.in);
int i=0;
System.out.println("Enter number of people");
int n=in.nextInt();
int[] age=new int[n];
String[] name=new String[n];
double[] aIncome=new double[n];
while (i<n){
try{
System.out.println(i+"Enter your last and first name (for e.g. if full name is \"Rahul Gupta\" then enter \"Gupta Rahul\") : ");
name[i]=inS.nextLine();
System.out.println("Now putting name");
System.out.println("Enter your age: ");
age[i]=in.nextInt();
System.out.println("Now putting age");
System.out.println("Enter your annual income: ");
aIncome[i]=in.nextDouble();
System.out.println("Now putting income");
i++;
}
catch(Exception InputMismatchException){
System.out.println("Error !! Wrong input, Please try again.");
}
}
System.out.println(Arrays.toString(age));
System.out.println(Arrays.toString(name));
System.out.println(Arrays.toString(aIncome));
}
}
给出正确的输入。
Script started on Sat 03 Feb 2018 07:55:42 PM NST
amehla@slbnen3000pc50:~/Desktop/test$ jva KKKava People.K
Enter number of people
3
0Enter your last and first name (for e.g. if full name is "Rahul Gupta" then enter "Gupta Rahul") :
harit Gupta
Now putting name
Enter your age:
26
Now putting age
Enter your annual income:
59495
Now putting income
1Enter your last and first name (for e.g. if full name is "Rahul Gupta" then enter "Gupta Rahul") :
Rahul Gupta
Now putting name
Enter your age:
59
Now putting age
Enter your annual income:
35695
Now putting income
2Enter your last and first name (for e.g. if full name is "Rahul Gupta" then enter "Gupta Rahul") :
Shikha kom
Now putting name
Enter your age:
56
Now putting age
Enter your annual income:
59565
Now putting income
[26, 59, 56]
[harit Gupta, Rahul Gupta, Shikha kom]
[59495.0, 35695.0, 59565.0]
但是当给出不正确的输入时,这会无限次地进行。
amehla@slbnen3000pc50:~/Desktop/test$ java People
Enter number of people
3
0Enter your last and first name (for e.g. if full name is "Rahul Gupta" then enter "Gupta Rahul") :
Rahul Gupta
Now putting name
Enter your age:
59
Now putting age
Enter your annual income:
fasdf
Error !! Wrong input, Please try again.
0Enter your last and first name (for e.g. if full name is "Rahul Gupta" then enter "Gupta Rahul") :
Rahul Gupta
Now putting name
Enter your age:
Error !! Wrong input, Please try again.
0Enter your last and first name (for e.g. if full name is "Rahul Gupta" then enter "Gupta Rahul") :
Rahu lasdf
Now putting name
Enter your age:
Error !! Wrong input, Please try again.
0Enter your last and first name (for e.g. if full name is "Rahul Gupta" then enter "Gupta Rahul") :
asdf adsf
Now putting name
Enter your age:
Error !! Wrong input, Please try again.
0Enter your last and first name (for e.g. if full name is "Rahul Gupta" then enter "Gupta Rahul") :
^Camehla@slbnen3000pc50:~/Desktop/test$ exit
exit
Script done on Sat 03 Feb 2018 07:57:22 PM NST
即使有人回复,也会有很大的帮助。
谢谢。
答案 0 :(得分:1)
当您混合使用nextLine()
和nextInt()
,nextDouble()
或其中任何内容时,新行会发生奇怪的事情。如果您使用nextInt()
和nextDouble()
替换代码中Integer.valueOf(inS.nextLine())
和Double.valueOf(inS.nextLine())
的来电,则应解决您的问题。
作为一般规则,如果您在命令行中读取任何用户输入,则应阅读整行并解析整行。不要试图抓住个别令牌,它会变得非常混乱。
答案 1 :(得分:0)
当您输入输入值时,按Enter
键即可接受输入值。它在输入值后生成新的行字符。当您在下一行代码中调用nextLine()
方法时,它会读取剩余的新行字符而不是您键入的输入。要在调用nextInt()
或nextDouble()
后清除换行符,请在这些方法后立即放置nextLine()
。
另一种可能性是调用Integer.parseInt(in.nextLine())
或Double.parseDouble(in.nextLine())
等方法,因为它们会自动删除剩余的新行字符。
您还应该考虑在in.nextLine()
块中放置catch
方法,以便在输入抛出异常时删除剩余的新行字符:
您的代码中存在的另一个问题是这一部分:
catch(Exception InputMismatchException) {...}
使用该代码,您可以捕获任意类型的Exception
- 不仅InputMismatchException
,还有继承自Exception
类和Exception
本身的任何其他类型 - 括号中的第一个是您要捕获的Exception
类,然后是catch
块中要调用它的名称 - 将其更改为:
catch(InputMismatchException ex ) {...}
这样你只能抓住InputMismatchException.
答案 2 :(得分:0)
我尝试运行您的代码,我发现了三个可以解决问题的更改。
首先 - 您不需要两台扫描仪。只需使用一个。完全摆脱in2
。
接下来 - 摆脱行in2
name[i]=inS.nextLine();
弄乱行name[i]=in.next();
您可以将其更改为:nextLine()
我不确定为什么这可以解决问题,但这是我最好的猜测(其他用户,如果您对此有更多了解,请说出来)!
当您使用\n
时,扫描程序会在下一个int n=in.nextInt();
字符之前查找所有内容。在\n
行中之前对扫描仪的调用中,扫描程序仅读取数字本身,而不是用户输入数字时输入的相应in.nextLine()
换行符。因此,调用next()
将导致扫描程序再次读取与该名称相同的值。我们不希望这样 - 我们只想阅读用户输入的下一个令牌,catch(Exception InputMismatchException){...
做得非常好。
最后 - 我还将行catch(InputMismatchException e){...
更改为更常规的编写catch语句的方式:{{1}}
答案 3 :(得分:-1)
我没有完全解决问题,但我猜你想要的是在抛出第一个异常后退出循环?然后而不是
while (...) {
try {
...
} catch (...) {
...
}
}
你可以写
try {
while (...) {
...
}
} catch (...) {
...
}
或者只是在catch块中添加break
语句以退出周围的while
循环。