Есть ли четкая документация по номерам строк трассировки стека 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.
Я хочу знать, чтобы, когда я вижу трассировку стека, я мог точно знать, в какой строке произошла ошибка. (методы цепочки (на нескольких строках) очень распространены в коде, на который я смотрю).