如何用实际导致的异常消息替换异常消息?

时间:2017-04-27 20:47:27

标签: java

我正在尝试打印出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());

3 个答案:

答案 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