尝试抓住不工作的Java

时间:2018-02-03 23:40:16

标签: java exception while-loop try-catch

我试图在一个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

即使有人回复,也会有很大的帮助。

谢谢。

4 个答案:

答案 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循环。