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)
My While Loop:
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
答案 0 :(得分:37)
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
表示:
There was an error. We try to give you as much information as possible
It was an Exception in main thread. It's called NumberFormatException and has occurred for input "Ace of Clubs".
at line 65th of NumberFormatException.java which is a constructor,
which was invoked from Integer.parseInt() which is in file Integer.java in line 580,
which was invoked from Integer.parseInt() which is in file Integer.java in line 615,
which was invoked from method main in file Cards.java in line 68.
It has resulted in exit code 1
换句话说,您尝试将"Ace of Clubs"
解析为int
Java无法使用方法Integer.parseInt
解决的问题。 Java提供了漂亮的堆栈跟踪,它可以准确地告诉您问题所在。您正在寻找的工具是调试器,使用断点将允许您在所选时刻检查应用程序的状态。
如果您想使用解析,解决方案可能是以下逻辑:
if (cards[index].startsWith("Ace"))
value = 1;
else if (cards[index].startsWith("King"))
value = 12;
else if (cards[index].startsWith("Queen"))
value = 11;
...
else {
try {
Integer.parseInt(string.substring(0, cards[index].indexOf(" ")));
} catch (NumberFormatException e){
//something went wrong
}
}
Exception
是什么? 异常是在执行a期间发生的事件 程序,会破坏程序指令的正常流程。
Integer#parseInt
static NumberFormatException forInputString(String s) {
return new NumberFormatException("For input string: \"" + s + "\"");
}
public NumberFormatException (String s) {
super (s);
}
它们对于理解如何读取堆栈跟踪非常重要。看看NumberFormatException
:
Integer#parseInt
的
if (s == null) {
throw new NumberFormatException("null");
}
或更高版本,如果输入String s
的格式不可解析:
throw NumberFormatException.forInputString(s);
NumberFormatException
? 抛出以指示应用程序已尝试将字符串转换为其中一种数字类型,但该字符串没有适当的格式。
NumberFormatException
extends
IllegalArgumentException
。它告诉我们它更专业IllegalArgumentException
。实际上,它用于突出显示虽然参数类型是正确的(String
),String
的内容不是数字( a,b,c,d,e,f是在HEX中考虑数字并在需要时合法)。
如何解决?
好吧,不要解决它抛出的事实。抛出它是件好事。有些事情你需要考虑:
String
导致Exception
一个null
?消息的第一行是异常发生的信息和导致问题的输入String
。字符串始终跟在:
之后,并被引用("some text"
)。然后你开始对从最后读取堆栈跟踪感兴趣,因为前几行通常是NumberFormatException
的构造函数,解析方法等。然后在最后,你的方法中有一个bug。将在其调用的文件和方法中指出。即使是一条线也会被附加。你会看到的。上面是如何读取堆栈跟踪的示例。
当你看到,而不是"For input string:"
和输入时,有一个null
(不是"null"
),这意味着你试图通过对数字的null引用。如果您真的想要处理为0或任何其他数字,您可能会对我在StackOverflow上的另一篇文章感兴趣。它可用here。
在StackOverflow线程 What is a NullPointerException and how can I fix it? 上详细描述了解决意外null
的问题。
如果String
之后:
引用的" 6"
看起来像您认为的数字,则可能是您的系统无法解码的字符或看不见的空格。显然"123 "
无法解析,String
也无法解析。这是因为空间。但它可能会发生,"6"
看起来像System.out.println
,但实际上它的长度将大于您可以看到的位数。
在这种情况下,我建议使用调试器或至少String
并打印您尝试解析的stringToParse.trim()
的长度。如果它显示的位数超过了位数,请尝试将:
传递给解析方法。如果它不起作用,请在StackOverflow
之后复制整个字符串,并使用在线解码器对其进行解码。它会给你所有字符的代码。
我最近在"1.86"
上发现了一个案例,您可能会看到输入看起来像一个数字,例如Double#parseDouble
并且它只包含这4个字符,但错误仍然存在。请记住,只能用#Integer#parseInt#解析整数。对于解析十进制数,应使用int
。
另一种情况是,当数字有多位数时。可能是,它太大或太小而不适合long
或new BigDecimal(<str>)
。您可以尝试try-catch
。
最后,我们来到了我们同意的地方,当用户输入“abc”作为数字字符串时,我们无法避免这种情况。为什么?因为他可以。幸运的是,这是因为他是测试人员或者只是一个极客。在一个糟糕的情况下,它是攻击者。
我现在能做什么?嗯,Java给了我们try {
i = Integer.parseInt(myString);
} catch (NumberFormatException e) {
e.printStackTrace();
//somehow workout the issue with an improper input. It's up to your business logic.
}
你可以做到以下几点:
{{1}}
答案 1 :(得分:10)
NumberFormatException
?抛出此异常以指示应用程序具有此异常 尝试将
string
转换为其中一种数字类型,但是string
没有合适的格式。
在您的情况下,根据您的堆栈跟踪,Integer.parseInt(String)
抛出了此异常,这意味着提供的String
不包含可解析的integer
。仍然根据堆栈跟踪,这是因为您试图解析String
&#34; 俱乐部的王牌&#34;作为一个整数,它不能工作,因为它不是整数的String
表示。
最简单和通用的方法是捕获异常NumberFormatException
int value = -1;
try {
value = Integer.parseInt(myString);
} catch (NumberFormatException e) {
// The format was incorrect
}
它会起作用,但是捕获异常很慢,因为它需要构建调用堆栈来创建代价很高的Exception
,所以如果你能避免它那么做。此外,您需要妥善管理异常,这并不总是很明显。
或者您可以使用regular expression
来检查String
matches
是否Integer
,但它很容易出错,因为您可以轻松使用错误的{{} 1}}。
在您的情况下,应使用更多面向对象的方法,而不是处理regular expression
,例如,您可以使用String
或class
代表您的卡片,而不是使用简单的enum
因为你已经注意到它更容易出错。
因此,如果您决定使用专用课程,您的代码可以是:
String
对于卡片的套装和等级,我们可以使用public class Card {
private final Rank rank;
private final Suit suit;
public Card(final Rank rank, final Suit suit) {
this.rank = rank;
this.suit = suit;
}
public Rank getRank() {
return this.rank;
}
public Suit getSuit() {
return this.suit;
}
}
,因为现有的等级和套装数量有限。
enum
然后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);
private final int value;
Rank(final int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
public enum Suit {
SPADE, HEART, DIAMOND, CLUB
}
将是cards
的数组,而不是Card
的数组,并且可以初始化为下一个:
String
如果你需要洗牌,你可以继续下一步(请注意,如果您决定使用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
)
Collections.shuffle(list)
然后,您可以使用List<Card> allCards = Arrays.asList(cards);
Collections.shuffle(allCards);
allCards.toArray(cards);
直接访问卡片的价值,而无需承担获得例外的风险(如果您没有使用正确的索引,则cards[index].getRank().getValue()
除外)。
答案 2 :(得分:6)
看起来cards[]
是字符串数组,而您正尝试将Ace of Clubs
转换为整数。
int first_value = Integer.parseInt(cards[index]);
答案 3 :(得分:2)
java.lang.NumberFormatException
当您尝试解析某些不是数字字符串的输入时,会出现。
在您的情况下,您尝试将字符串(没有数字)解析为Integer。 因为它不可能 发生了NumberFormatException异常。
int first_value = Integer.parseInt(cards[index]);//cards[index] value should be //number string "123" not "abc"
答案 4 :(得分:2)
NumberFormatException是Java必须说的方式“我试图将String转换为int而我无法做到”。
在您的例外追踪中,您可以阅读
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)
基本上,这意味着在代码的第68行,您调用Integer.parseInt方法,将“Ace of Clubs”作为paremeter传递。此方法需要一个表示为String的整数值,例如“4”,所以方法抱怨抛出一个NumberFormatException,因为“Ace of Clubs”似乎根本不是整数。
答案 5 :(得分:1)
第一件让我进行循环的事情(没有双关语意思)是你在需要0-52时将值限制为1-13。还有你的逻辑,价值总是更高。更好的方法是使用数字生成器。这是我的代码使用数字生成器(或Java随机):
public static void main(String[] args) {
String[] cards = { "Ace of Clubs", "1 of Clubs", "2 of Clubs",
"3 of Clubs", "4 of Clubs", "5 of Clubs", "6 of Clubs",
"7 of Clubs", "8 of Clubs", "9 of Clubs", "10 of Clubs",
"Queen of Clubs", "King of Clubs", "Ace of Diamonds",
"1 of Diamonds", "2 of Diamonds", "3 of Diamonds",
"4 of Diamonds", "5 of Diamonds", "6 of Diamonds",
"7 of Diamonds", "8 of Diamonds", "9 of Diamonds",
"10 of Diamonds", "Queen of Diamonds", "King of Diamonds",
"Ace of Hearts", "1 of Hearts", "2 of Hearts", "3 of Hearts",
"4 of Hearts", "5 of Hearts", "6 of Hearts", "7 of Hearts",
"8 of Hearts", "9 of Hearts", "10 of Hearts",
"Queen of Hearts", "King of Hearts", "Ace of Spades",
"1 of Spades", "2 of Spades", "3 of Spades", "4 of Spades",
"5 of Spades", "6 of Spades", "7 of Spades", "8 of Spades",
"9 of Spades", "10 of Spades", "Queen of Spades",
"King of Spades" };
Scanner scanner = new Scanner(System.in);
Random rand = new Random();
String response = "";
int index = 0;
int value = 0;
while (!response.equals("q") && index < 52) {
// set next card value based on current set of cards in play
if (cards[index].endsWith("Clubs")) {
value = rand.nextInt(12);
}
if (cards[index].endsWith("Diamonds")) {
value = rand.nextInt(12) + 13;
}
if (cards[index].endsWith("Hearts")) {
value = rand.nextInt(12) + 26;
}
if (cards[index].endsWith("Spades")) {
value = rand.nextInt(12) + 39;
}
// display card too user (NOTE: we use the random number not the index)
System.out.println("Card is: " + cards[value]);
// ask user what well the next card be
System.out.println("Will the next card be higher or lower?, press q if you want to quit");
response = scanner.nextLine();
// display if user was right (NOTE: compared the random number to the current index)
// ignore incorrect response and just continue
if ((value > index && response.startsWith("h")) || (value < index && response.startsWith("l"))) {
System.out.println("You answer was right, well done!");
} else {
System.out.println("You answer was wrong, try again!");
}
// continue loop
index++;
}
}
至于NumberFormatException,我相信Nicolas Filotto在解释这个方面做得很好。
答案 6 :(得分:1)
NumberFormatException
表示Integer.parseInt()
无法将字符串转换为数字。
我建议使用以下两个选项之一:
将卡封装为名称(字符串)/值(int)组合。使用该值进行比较,并使用名称向用户显示信息。 Cards[]
然后成为卡片列表,而不是字符串。
自己解析字符串。这可能更容易,因为您已经使用if(cards[index].startsWith("Ace")) { value = 1; }
位完成了它。您可以将它们移动到名为CardToInt()
(或其他)的函数中,并使用该函数代替Integer.parseInt()
。
答案 7 :(得分:1)
int first_value = Integer.parseInt(cards[index]);
在写上述声明时,你试图将“俱乐部的王牌”解析为一个数字。
您可以使用以下方法测试是否可以将任何字符串解析为Integer:
boolean tryParseInt(String value) {
try {
Integer.parseInt(value);
return true;
} catch (NumberFormatException e) {
return false;
}
}
关于你的问题,什么是NumberFormatException:抛出它表示应用程序试图将字符串转换为其中一种数字类型,但该字符串没有适当的格式。 (参考 - http://docs.oracle.com/javase/7/docs/api/java/lang/NumberFormatException.html)
答案 8 :(得分:0)
Exception出现在您的代码中,您将String转换为Integer:
int first_value = Integer.parseInt(cards[index]);
你传递一个字符串作为“俱乐部的王牌”,这是不可能转换为整数,所以它会抛出数字格式异常。你可以用,
try {
....
// Your Code
....
}
catch(NumberFormatException e)
{
e.getMessage(); //You can use anyone like printStackTrace() ,getMessage() to handle the Exception
}