我有这段代码:
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;
时,它运行正常。但在这种情况下,如果异常被捕获两次,同样的事情也会发生。
请告诉我如何解决这个无限循环错误?
提前致谢:)
答案 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");
}
}
}
}
}
if(spstr[i].equals("")) {i--;}
实际上是毫无意义和错误的逻辑,会使你的程序陷入无限循环。只需修剪String并检查它是否为空,就像我一样。Exception
超类。这对调试很不利。这里提到的Exception
是NumberFormatException
,你应该抓住它。