我已经完成了创建购物清单计划的任务。我在Python中完成了这个,而且相对简单。然而,在Java中我遇到了一些障碍。
这些是我的变量,我知道以这种方式使用静态的问题,并且最好避免这样做。
private static Scanner input = new Scanner(System.in);
private static String list_add = "string"; //"string" is just a place holder
private static ArrayList listFull = new ArrayList();
private static ArrayList listPos = new ArrayList();
private static int userIn = 1; //1 is also being used as place holder
我用于:
private static void userInput() {
boolean isValid = false;
while (!isValid) {
isValid = true;
try {
userIn=Integer.parseInt(input.next());
}
catch (InputMismatchException e) {
System.out.println("That's not a valid number!");
isValid = false;
}
}
}
这样做的原因是需要输入的任务越少,任务就越快完成。在我尝试这个之前,这是一个很好的哲学。我之前尝试解决这个问题给出了一个无限循环,想到的第二个解决方案返回了StackOverflowError
。当我询问避免无限循环时,我被引导到另一个问题(Endless loop while using "try and catch " block inside a "while loop"),我认为这个问题并不合适,但发现它是(谢谢你标记的那个)。然而,我没有得到这个解决方案,我无法看到我出错的地方。
在尝试不同的输入以查看它们是否是一种杀死它的特定类型之后,这些是我收到的错误:
测试用例“strin”:
Exception in thread "main" java.lang.NumberFormatException: For input string: "strin"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at DebuggingMethods.AllIn(DebuggingMethods.java:17)
at DebuggingMethods.Menu(DebuggingMethods.java:33)
at DebuggingMethods.main(DebuggingMethods.java:58)
测试用例“十”:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Ten"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at DebuggingMethods.AllIn(DebuggingMethods.java:17)
at DebuggingMethods.Menu(DebuggingMethods.java:33)
at DebuggingMethods.main(DebuggingMethods.java:58)
测试用例int(10):
与预期结果一致。
我以为我错过了一个模块,所以我做了import java.lang.*;
并没有改变错误。如果有人有解决方案,请帮助我。我找不到已发布的问题,这解释了我做错了什么。当我把它从Try-Catch中取出时,它正在起作用。
Full Piece
import java.util.InputMismatchException;
import java.util.*;
import java.util.Scanner;
import java.lang.*;
public class TestOne {
private static Scanner input = new Scanner(System.in);
private static String list_add = "string";
private static ArrayList listFull = new ArrayList();
private static ArrayList listPos = new ArrayList();
private static int userIn = 1;
private static void userInput() {
boolean isValid = false;
while (!isValid) {
isValid = true;
try {
userIn=Integer.parseInt(input.next());
}
catch (InputMismatchException e) {
System.out.println("That's not a valid number!");
isValid = false;
}
}
}
public static void main(String[] args) {
//titleMain();
userInput(); // For the sake of demonstration
}
}
答案 0 :(得分:0)
你的异常已经混淆了。您正在捕获InputMismatchException
,如果输入无效,则input.nextInt()
会抛出Integer.parseInt
。但实际上您正在使用NumberFormatException
来解析输入,如果输入无效,则会抛出NumberFormatException
。由于InputMismatchException
不是Scanner
的子类,因此它不会被捕获,您最终会因堆栈跟踪而死亡。
你根本不需要做任何异常的事情。 Scanner sc;
//...
System.out.println("Please enter a number");
while (!sc.hasNextInt()){
sc.nextLine(); // throw away the bad input
System.out.println("Please enter a valid number");
}
int theNum = sc.nextInt();
可以告诉您下一个输入是否为有效整数,然后您可以主动决定如何处理它。按照以下思路思考:
<div id="rv-binding">
<!-- {items.Url} is working -->
<div class="fb-like" rv-data-href="items.Url" data-width="80" data-layout="button_count" data-action="like" data-size="small"
data-show-faces="true" data-share="true"></div>
</div>