你好,我被困在一个简单的Java练习上,我希望有人可以提供帮助。
很抱歉,如果这很简单,我就是一个java新手。
我遇到的问题是:如果用户输入的字符串不是“帮助”,例如“foo”,那么我会收到以下错误:
Exception in thread "main" java.lang.NumberFormatException: For input string: "foo"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
at NumberGuess.main(NumberGuess.java:10)
我认为发生了什么:“foo”没有被“else”捕获,因为args [0]是一个对象引用,而不是一个字符串。
我想知道的:如何捕获除“帮助”或数字“1”到“5”以外的所有内容?
这是代码......
public class NumberGuess {
public static void main(String args[]){
int r;
int g;
if ((args[0].compareTo("help")) == 0){
System.out.println("Enter a number between 1-5 to play.");
} else if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) <= 5){
r = ((int)(Math.random()));
g = Integer.parseInt(args[0]);
if (r == g){
System.out.println("YOU WON!");
} else {
System.out.println("Wrong: number was " + r);
}
} else {
System.out.println("Something went horribly wrong.");
}}}
答案 0 :(得分:3)
程序逻辑本质上是,“如果参数零不是'帮助',则将其解析为整数......”此时,抛出异常,因为“foo”不是有效整数。
最简单的方法是捕获NumberFormatException
并打印更有用的消息。
if ("help".equals(args[0])) {
System.out.println("Enter a number between 1 and 5 to play.");
}
else {
int number;
try {
number = Integer.parseInt(args[0]);
}
catch (NumberFormatException ex) {
System.out.println("Input is not an integer: " + args[0]);
return;
}
if ((number < 1) || (number > 5)) {
System.out.println("Number out of bounds: " + number);
return;
}
int r = new java.util.Random().nextInt(5) + 1;
if (number == r)
System.out.println("You won!");
else
System.out.println("You lost!");
}
答案 1 :(得分:1)
在寻找“帮助”后,它首先要做的是尝试将其解析为数字:
g = Integer.parseInt(args[0]);
您可以尝试做的是通过将该行更改为:
来捕获此异常try {
g = Integer.parseInt(args[0]);
} catch(NumberFormatException e) {
System.out.println("The first parameter was supposed to be a number!");
System.exit(1);
}
如果您打算接受像“foo 1”这样的参数,那么你应该将args [1]解析为数字,而你应该测试args [0]以查看它是否像这样的“foo”:
if(args[0].equalsIgnoreCase("foo")) {
// now we know foo is the first arg. Parse args[1]!
...
}
哦,顺便说一下。大多数语言中的“随机”数字是介于0和1之间的数字。它们通常看起来像“.108937190823 ...”
如果要检查1-10之类的数字,则需要执行以下操作:
Random().nextInt(10) + 1; // (Thanks @mmyers)
(不完全确定这是正确的方法,但它很接近。
答案 2 :(得分:1)
这里发生的是代码进入else块(正如你猜测的那样)并且else块直接尝试将参数转换为数字(Integer.parseInt(args [0])。所以,你可以添加一个try catch块来处理这样的场景:
public class NumberGuess {
public static void main(String args[]){
int r;
int g;
int temp;
if ((args[0].compareTo("help")) == 0){
System.out.println("Enter a number between 1-5 to play.");
} else {
try{
temp = Integer.parseInt(args[0]);
}catch(NumberFormatException e){
System.out.println("Please enter a number");
System.exit(-1);
}
if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) <= 5){
r = ((int)(Math.random()));
g = Integer.parseInt(temp);
if (r == g){
System.out.println("YOU WON!");
} else {
System.out.println("Wrong: number was " + r);
}
}
} else {
System.out.println("Something went horribly wrong.");
}}}
这是你编写代码的一种方式(只是一个建议)。
答案 3 :(得分:0)
正如您所注意到的,如果您尝试解析未正确表示错误的字符串,parseInt
会引发异常; try/catch
是用于捕获此类异常并处理它们的Java构造 - 在您最喜欢的Java文档中查找它!