Есть ли четкая документация по номерам строк трассировки стека Java?
Как они "вычисляются" при печати трассировки стека (логика за ней, а не реализация)?
Чтобы показать вам, почему я запутался, сделайте следующий фрагмент кода:
public static void main(String[] args) {
String evilString = null;
System.out.println(new StringBuilder()
.append(evilString.toLowerCase()));
evilString.toUpperCase();
}
Он дает: Исключение в потоке "main" java.lang.NullPointerException at 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 at be.company.training.ocjp6.App.main(App.java: 30)
Итак, я понимаю, что запуск цепочки методов StringBuilder
делает ее обрабатываемой как 1 строка (код StringBuilder начинается с строки 28 в моем редакторе). Но если ошибка произошла в фрагменте evilString.toUpperCase(), мы вернулись на дорожку с строкой 30.
Я хочу знать, что, когда я вижу стек, я точно знаю, в какой строке произошла ошибка (методы цепочки (на нескольких строках) очень распространены в коде, который я просматриваю).