Документация по номерам строк в трассировке стека

Есть ли четкая документация по номерам строк трассировки стека Java?
Как они «вычисляются» при печати трассировки стека (логика, а не реализация)?

Чтобы показать вам, почему я запутался, возьмите следующий фрагмент кода:

public static void main(String[] args) {
        String evilString = null;
        System.out.println(new StringBuilder()
                .append(evilString.toLowerCase()));
        evilString.toUpperCase();
    }

Он дает: Исключение в потоке "main" java.lang.NullPointerException на be.company.training.ocjp6.App.main (App.java: 28 )

В то время как следующий фрагмент кода:

public static void main(String[] args) {
        String evilString = null;
        System.out.println(new StringBuilder()
                .append("".toLowerCase()));
        evilString.toUpperCase();
    }

дает: Исключение в потоке "main" java.lang.NullPointerException на be.company.training.ocjp6.App.main (App.java: 30 )

Итак, я понимаю, что выполнение цепочки методов StringBuilder делает ее обработанной как 1 строка (код StringBuilder начинается со строки 28 в моем редакторе). Но если ошибка возникает во фрагменте evilString.toUpperCase (), мы вернулись к работе со строкой 30.

Я хочу знать, чтобы, когда я вижу трассировку стека, я мог точно знать, в какой строке произошла ошибка. (методы цепочки (на нескольких строках) очень распространены в коде, на который я смотрю).

10
задан AndrewBourgeois 2 January 2012 в 15:17
поделиться