我正在尝试打印出catch中导致ArrayIndexOutOfBoundsException的原因。我只允许输入单个字符或数字,任何空格都会触发此异常。但是,使用getStackTrace,我得到一个“[Ljava.lang.StackTraceElement; @ 66d3c617”错误。
我也尝试过getCause();但它返回null。
有什么建议吗?
try{
for (int i=0; i < word.length(); i++)
counts[word.charAt(i)-'A']++;
...
catch (ArrayIndexOutOfBoundsException ex){
System.out.println("Not a letter " + ex.getStackTrace());
答案 0 :(得分:3)
您可能正在寻找的是getMessage(),
System.out.println("Not a letter " + ex.getMessage());
调用getStackTrace()会返回StackTraceElement[]
类型的对象,但这不能转换为字符串。
要打印整个堆栈跟踪,请使用:
ex.printStackTrace(); // print to stderr
或者如果你想迭代调用链,比如:
for ( StackTraceElement element : ex.getStackTrace() ){
System.out.println( element.toString() );
}
答案 1 :(得分:1)
尝试以下方法:
ex.getMessage();
答案 2 :(得分:1)
如果您正在尝试查看堆栈跟踪,那么您可能无法以正确的方式解决问题。
for (int i=0; i < word.length(); i++)
counts[word.charAt(i)-'A']++;
在这里导致ArrayIndexOutOfBoundsException
的原因非常明显:一个值小于'A'
的char,或者c - 'A'
大于数组长度的word.charAt(i)
(*)。您可以轻松地检测并避免这种情况;异常只应用于处理意外情况。
根据您对spencer.sm's answer的评论,您似乎想要被告知犯罪角色是什么;你无论如何都不会从堆栈跟踪中得到这个;因为它不知道word.charAt(i) - 'A'
不是一封信;它只知道某个整数不是这个数组的有效索引。
在将ArrayIndexOutOfBoundsException
作为数组元素传递之前,应该检查for (int i=0; i < word.length(); i++) {
char c = word.charAt(i);
int index = c - 'A';
if (index >= 0 && index < counts.length) {
counts[index]++;
} else {
System.out.println(c + " is not a letter.");
break;
}
}
;如果消息超出范围,则打印该消息。
你可以不用'0' < '9' < 'A'
这样做,例如:
fn_loop
(*)请注意,虽然您的问题表明应该接受数字,但是0到9之间的字符也会触发此异常,因为fn_drop
。