What is a stack trace, and how can I use it to debug my application errors?
(7个答案)
2年前关闭。
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
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提供了漂亮的stacktrace,它可以告诉您确切的问题所在。您正在寻找的工具是调试器,使用断点将使您能够在选定的时刻检查应用程序的状态。
如果要使用解析,解决方案可能是以下逻辑:
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
}
}
Java中的
Exception
是什么?
异常是事件,它在执行过程中发生
程序,这会破坏程序指令的正常流程。
-
Documentation
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
?
引发以指示应用程序已尝试将字符串转换为数字类型之一,但该字符串没有适当的格式。
-
Documentation
NumberFormatException
extends
IllegalArgumentException
。它告诉我们它是更专业的
IllegalArgumentException
。确实,它用于突出显示尽管参数类型是正确的(
String
),但
String
的内容不是数字(a,b,c,d,e,f被认为是十六进制中的数字,并且是合法的)。需要的时候)。
我如何解决它?
好吧,不要修正它被抛出的事实。扔了很好。您需要考虑一些事项:
我可以阅读堆栈跟踪信息吗?
导致
String
的
Exception
是
null
吗?
看起来像数字吗?
是“我的字符串”还是用户的输入?
未完待续
广告。 1。
消息的第一行是有关发生异常以及导致问题的输入
String
的信息。字符串始终跟随
:
,并用引号(
"some text"
)表示。然后您开始对从头开始阅读stacktrace感兴趣,因为前几行通常是
NumberFormatException
的构造函数,解析方法等。最后,您的方法中就有一个bug。将会指出在哪个文件中调用了哪个方法。甚至连一条线。你会看到的。以上是如何读取stacktrace的示例。
广告。 2。
当您看到时,它表示是一个
"For input string:"
(不是
null
)而不是
"null"
和输入,它表示您试图将null引用传递给数字。如果您实际上想将其视为0或任何其他数字,则可能对我在StackOverflow上的另一篇文章感兴趣。它可用
here。
解决意外
null
的描述在StackOverflow线程
What is a NullPointerException and how can I fix it?上有很好的描述。
广告。 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。
最后,我们达成了共识,那就是我们无法避免用户输入“ abc”作为数字字符串的情况。为什么?因为他可以。幸运的是,这是因为他是测试人员,或者仅仅是个极客。在糟糕的情况下,它是攻击者。
我现在能做什么?好吧,Java为我们提供了
try-catch
您可以执行以下操作:
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.
}
我是一名优秀的程序员,十分优秀!