如何在java中获取错误的行号?

时间:2012-07-10 01:29:11

标签: java error-handling

我知道错误的行是to_return = find(list,false);NullPointerException类型的错误出现时,如何获取此行的行号?或者一般是行号?

我试了几件事。最接近的是Called.getLineNumber(),它给出了行号StackTraceElement Called = new Throwable().fillInStackTrace().getStackTrace()[0];

public TestObject[] myfind(Subitem list )throws Exception{
    TestObject[]to_return=null;
    try {
        to_return = find(list,false);
    }
    catch (RationalTestException ex) {
        //logStoreException(ex);
        StackTraceElement Called = new Throwable().fillInStackTrace().getStackTrace()[0];
        StackTraceElement Calling = new Throwable().fillInStackTrace().getStackTrace()[1];
        throw new Exception (this.add_debugging_info(Called, Calling, ex.getMessage()));

    }   
    catch (NullPointerException npe) {
        StackTraceElement Called = new Throwable().fillInStackTrace().getStackTrace()[0];
        StackTraceElement Calling = new Throwable().fillInStackTrace().getStackTrace()[1];
        logStoreException(npe);
        System.out.println("Line number: "+npe.getStackTrace()[0].getLineNumber()); 
        System.out.println("Line number2: "+Integer.toString(Called.getLineNumber()));
        System.out.println(this.add_debugging_info(Called, Calling, npe.getMessage()));
        throw new Exception (this.add_debugging_info(Called, Calling, npe.getMessage()));
    }   
    catch (Exception ex) {
        StackTraceElement Called = new Throwable().fillInStackTrace().getStackTrace()[0];
        StackTraceElement Calling = new Throwable().fillInStackTrace().getStackTrace()[1];
        throw new Exception (this.add_debugging_info(Called, Calling, ex.getMessage()));

    } 
    finally {
        //unregisterAll();
        //unregister(to);
        return to_return;
    }
}

2 个答案:

答案 0 :(得分:0)

  1. 如果您只想要当前的堆栈跟踪,请使用Thread.currentThread().getStackTrace()

  2. 如果要强制JVM填写堆栈跟踪,请在JVM上设置选项-XX:-OmitStackTraceInFastThrow

答案 1 :(得分:0)

在Eclipse中运行时,要获取行号本身,您需要获取StackTrace数组并对其调用getLineNumber()。

以下在我的Utils类isSessionConnectible方法中为我工作:

... catch (ClassFormatError cfe) {
        logger.error("Problem ClassFormatError connecting. " + cfe.getMessage() + " " + cfe.getCause());
        int size = cfe.getStackTrace().length - 1;
        logger.error("   Root cause: " + cfe.getStackTrace()[size].getMethodName() + " " + cfe.getStackTrace()[size].getClassName());
        if (size>1) { 
            logger.error("   Penultimate cause: method=" + cfe.getStackTrace()[size-1].getMethodName() + " class=" + cfe.getStackTrace()[size-1].getClassName() + 
                    " line=" + cfe.getStackTrace()[size-1].getLineNumber()); 
        }

抛出时的结果:

2018-07-06 12:00:12 ERROR Utils:319 - Problem ClassFormatError connecting to Hibernate. Absent Code attribute in method that is not native or abstract in class file javax/transaction/SystemException null
2018-07-06 12:00:12 ERROR Utils:322 -    Root cause: main <mypackage>.Utils
2018-07-06 12:00:12 ERROR Utils:324 -    Penultimate cause: method=isSessionConnectible class=<mypackage>.Utils line=306

顺便说一句,在Eclipse中,请确保“窗口->首选项-> Java->编译器”上的复选框已选中“将行号属性添加到生成的类文件”。