使用Scanner进行输入时无法处理无限循环

时间:2016-06-03 19:27:18

标签: java exception-handling java.util.scanner

我有这段代码:

import java.util.*;
class HelloWorld {
    public static void main(String args[]) {
        Scanner ob = new Scanner(System.in);
        int t = ob.nextInt(); //no. of Test Cases
                ob.next(); // for next input whether exception occurs or not
        int a = 0, c = 0;
        for (int j = 0; j < t; j++)
        {
            a = 0; c = 0;
            String str = ob.nextLine();
            String [] spstr = str.split("\\s+");
            try
            {
                for (int i=0 ; i<spstr.length ; i++)
                {
                    if(spstr[i].equals("")) {i--;}
                    else {
                        c = c + Integer.parseInt(spstr[i]);
                        }
                }
                System.out.println(c);
            } catch (Exception e) {
                System.out.println("Invalid Input");
                }
        }
    }
}

这段代码的作用是在一行中添加任何整数。在此之前,我有一个测试用例int t。这决定了必须采取多少输入。但即使我输入整数值,这也会导致无限循环。

我看过这篇文章: How to handle infinite loop caused by invalid input using Scanner关于如何摆脱这个问题有许多答案。我已经按照答案,但我还没有解决这个问题。

注意:当我使用int t=5;时,它运行正常。但在这种情况下,如果异常被捕获两次,同样的事情也会发生。

请告诉我如何解决这个无限循环错误?

提前致谢:)

2 个答案:

答案 0 :(得分:1)

首先,正确的缩进有助于使代码更易于阅读。

class HelloWorld {
    public static void main(String args[]) {
        Scanner ob = new Scanner(System.in);
        int t = ob.nextInt(); //no. of Test Cases
        ob.next(); // for next input whether exception occurs or not
        int a = 0, c = 0;
        for (int j = 0; j < t; j++) {
            a = 0;
            c = 0;
            String str = ob.nextLine();
            String[] spstr = str.split("\\s+");
            try {
                for (int i = 0; i < spstr.length; i++) {
                    if (spstr[i].equals("")) {
                        i--;
                    } else {
                        c = c + Integer.parseInt(spstr[i]);
                    }
                }
                System.out.println(c);
            } catch (Exception e) {
                System.out.println("Invalid Input");
            }
        }
    }
}

有几个问题。

int t = ob.nextInt(); //no. of Test Cases
ob.next(); // for next input whether exception occurs or not

我不知道你希望在这里完成什么。这是链接的答案作为解决方案的内容。链接的答案是指输入无效的情况,特别是引用异常的引用,如下所示:

try {
    int x = ob.nextInt();
} catch (InputMismatchException e) {
    ob.next();
}

除非您故意输入错误数据,否则我严重怀疑与您的问题有关。

然后就是这个,最可能的罪魁祸首是认为它是乍一看的潜在无限循环。

for (int i = 0; i < spstr.length; i++) {
    if (spstr[i].equals("")) {
        i--;
     } else {
         c = c + Integer.parseInt(spstr[i]);
     }
}

如果i为5而spstr[i].equals("")返回true,那么i将变为4,其他内容将被跳过,i将无限制地增加回到5。

答案 1 :(得分:1)

只需使用ob.nextLine()即可忽略它。我为你修复了代码,它可以正常工作。您的代码有几个我提到过的问题。

import java.util.*;
class HelloWorld {
    public static void main(String args[]) {
        Scanner ob = new Scanner(System.in);
        int t = ob.nextInt(); 
        ob.nextLine();
        int a = 0, c = 0;
        for (int j = 0; j < t; j++)
        {
            a = 0; c = 0;
            String str = ob.nextLine();
            if(str.trim().length()>0){
            String [] spstr = str.trim().split("\\s+");
            try
            {
                for (int i=0 ; i<spstr.length ; i++)
                {
                    c = c + Integer.parseInt(spstr[i]);
                }
                System.out.println(c);
            } catch (NumberFormatException e) {
                System.out.println("Invalid Input");
            }
        }
    }
  }
}
  1. if(spstr[i].equals("")) {i--;}实际上是毫无意义和错误的逻辑,会使你的程序陷入无限循环。只需修剪String并检查它是否为空,就像我一样。
  2. 不要简单地抓住Exception超类。这对调试很不利。这里提到的ExceptionNumberFormatException,你应该抓住它。