Error Message:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Ace of Clubs"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at set07102.Cards.main(Cards.java:68)
C:\Users\qasim\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
我的while循环:
while (response != 'q' && index < 52) {
System.out.println(cards[index]);
int first_value = Integer.parseInt(cards[index]);
int value = 0;
//Add a Scanner
Scanner scanner = new Scanner(System.in);
System.out.println("Will the next card be higher or lower?, press q if you want to quit");
String guess = scanner.nextLine();
if(cards[index].startsWith("Ace")) { value = 1; }
if(cards[index].startsWith("2")) { value = 2; }
if(cards[index].startsWith("3")) { value = 3; }
//checking 4-10
if(cards[index].startsWith("Queen")){ value = 11; }
if(cards[index].startsWith("King")){ value = 12; }
if(guess.startsWith("h")){
if(value > first_value){ System.out.println("You answer was right, weldone!"); }
else { System.out.println("You answer was wrong, try again!"); }
} else if(guess.startsWith("l")){
if(value < first_value) { System.out.println("You answer as right, try again!"); }
else { System.out.println("You answer was wrong, try again!"); }
} else { System.out.println("Your was not valid, try again!"); }
scanner.close();
index++;
}//end of while loop
9条答案
按热度按时间x6492ojm1#
指:
换句话说,您试图解析
"Ace of Clubs"
到int
java不能用方法做什么Integer.parseInt
. java提供了漂亮的stacktrace,可以准确地告诉您问题所在。您正在寻找的工具是调试器,使用断点将允许您在所选时刻检查应用程序的状态。如果要使用解析,解决方案可能是以下逻辑:
java中的异常是什么?
异常是在程序执行期间发生的事件,它会中断程序指令的正常流动。
-文件
整数#parseint中的构造函数和用法
它们对于理解如何读取堆栈跟踪非常重要。看看这个
NumberFormatException
是从Integer#parseInt
:如果输入的格式
String s
不可解析:什么是numberformatexception?
抛出以指示应用程序已尝试将字符串转换为其中一种数字类型,但该字符串没有适当的格式。
-文件
NumberFormatException
extendsIllegalArgumentException
. 它告诉我们它更专业IllegalArgumentException
. 事实上,它用于强调尽管参数类型是正确的(String
)报告的内容String
不是数字(a、b、c、d、e、f被认为是十六进制数字,需要时是合法的)。我怎么修理它?
好吧,不要修正它被抛出的事实。它被扔了真是太好了。您需要考虑以下几点:
我能看一下stacktrace吗?
是
String
这导致了Exception
A.null
?它看起来像一个数字吗?
是“我的字符串”还是用户的输入?
待续
公元1年。
消息的第一行是异常发生和输入的信息
String
这导致了问题。字符串总是跟在后面:
并被引用("some text"
). 然后,您会对从末尾读取stacktrace感兴趣,因为前几行通常是NumberFormatException
的构造函数、解析方法等。最后,还有您的方法,您在其中产生了一个bug。将指出它在哪个文件中被调用,在哪个方法中被调用。甚至连一条线都会被连接。你会看到的。上面是如何读取stacktrace的示例。公元2年。
当你看到的时候,那不是
"For input string:"
而输入,有一个null
(不是"null"
)这意味着,您试图将空引用传递给一个数字。如果你真的想把is当作0或任何其他数字,你可能会对我在stackoverflow上的另一篇文章感兴趣。这里有。解决意外事件的描述
null
s在stackoverflow线程上有很好的描述什么是nullpointerexception,如何修复它?。公元3年。
如果
String
接下来是:
在您看来,如果引用的是一个数字,则可能有一个字符您的系统无法解码,或者有一个看不见的空白。明显地" 6"
无法解析为"123 "
不能这是因为空间。但有可能发生的是String
看起来像"6"
但实际上它的长度比你能看到的数字还要大。在这种情况下,我建议使用调试器或至少
System.out.println
并打印出String
您正在尝试解析。如果显示的数字超过位数,请尝试传递stringToParse.trim()
到解析方法。如果不起作用,请在:
并使用在线解码器对其进行解码。它会给你所有字符的代码。还有一个案例是我最近发现的
StackOverflow
,您可能会看到,输入看起来像一个数字。"1.86"
它只包含这4个字符,但错误仍然存在。记住,只能用#integer#parseint#解析整数。对于解析十进制数,应该使用Double#parseDouble
.另一种情况是,当数字有许多位数时。可能是因为它太大或太小而无法安装
int
或long
. 你可能想试试new BigDecimal(<str>)
.公元4年。
最后,我们达成了一致,当用户以数字字符串形式键入“”时,我们无法避免这种情况。为什么?因为他能。幸运的是,这是因为他是一个测试人员或者只是一个极客。在坏的情况下,是攻击者。
我现在能做什么?java给了我们
try-catch
您可以执行以下操作:bjp0bcyl2#
什么是numberformatexception?
引发此异常是为了指示应用程序已尝试转换
string
到其中一个数字类型,但string
没有适当的格式。在您的情况下,根据堆栈跟踪,此异常是由
Integer.parseInt(String)
这意味着String
不包含可解析的integer
. 仍然根据堆栈跟踪,这是由于您试图解析String
“俱乐部王牌”是一个整数,它不能工作,因为它不是String
整数的表示法。如何修复它?
最简单和通用的方法是捕获异常
NumberFormatException
```int value = -1;
try {
value = Integer.parseInt(myString);
} catch (NumberFormatException e) {
// The format was incorrect
}
public class Card {
}
public enum Rank {
ACE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), HEIGHT(8),
NINE(9), TEN(10), JACK(11), QUEEN(12), KING(13);
}
public enum Suit {
SPADE, HEART, DIAMOND, CLUB
}
Rank[] ranks = Rank.values();
Suit[] suits = Suit.values();
Card[] cards = new Card[ranks.length * suits.length];
for (int i = 0; i < ranks.length; i++) {
for (int j = 0; j < suits.length; j++) {
cards[i * suits.length + j] = new Card(ranks[i], suits[j]);
}
}
List allCards = Arrays.asList(cards);
Collections.shuffle(allCards);
allCards.toArray(cards);
fsi0uk1n3#
看起来像
cards[]
是字符串数组,您正在尝试转换Ace of Clubs
到整数。wtlkbnrh4#
当您试图分析某些不是数字字符串的输入时发生。
在您的例子中,您试图将字符串(没有数字)解析为整数。由于不可能,发生numberformatexception异常。
nc1teljy5#
numberformatexception是java告诉您“我试图将字符串转换为int,但我做不到”的方式。
在异常跟踪中,您可以读取
基本上,这意味着在代码的第68行调用integer.parseint方法,将“俱乐部ace”作为参数传递。该方法需要一个以字符串表示的整数值,例如“4”,因此该方法抱怨抛出numberformatexception,因为“俱乐部王牌”看起来根本不是整数。
nvbavucw6#
A.
NumberFormatException
意味着Integer.parseInt()
无法将字符串转换为数字。我建议两种选择之一:
将卡片封装为名称(字符串)/值(整数)组合。使用值进行比较,使用名称向用户显示信息。
Cards[]
然后变成一张卡片列表,而不是字符串。自己解析字符串。这可能更容易,因为您已经用
if(cards[index].startsWith("Ace")) { value = 1; }
位。您可以将它们移动到一个名为CardToInt()
(或其他),并使用该函数而不是Integer.parseInt()
.0dxa2lsx7#
第一件让我感到困惑的事(没有双关语的意思)是,当值需要为0-52时,你将值限制在1-13。同样,根据你的逻辑,值总是更高。更好的方法是使用数字生成器。下面是我使用数字生成器(或java random)的代码:
至于数字形式概念,我相信尼古拉斯·菲洛托解释得很好。
n7taea2i8#
在编写上述语句时,您试图将“俱乐部王牌”解析为一个数字。
您可以使用以下方法测试是否可以将任何字符串解析为整数:
关于您的问题,什么是numberformatexception:抛出它是为了指示应用程序试图将字符串转换为一种数值类型,但该字符串没有适当的格式(参考号-http://docs.oracle.com/javase/7/docs/api/java/lang/numberformatexception.html)
4uqofj5v9#
代码中会出现异常,将字符串转换为整数:
其中,您将字符串作为“俱乐部王牌”传递,该字符串不可能转换为整数,因此它会引发数字格式异常。你可以用,