(Неизвестный Источник) в Отслеживании стека исключительной ситуации

Фон

Этот вопрос связан с тем, Почему String.valueOf (пустой указатель) бросает NullPointerException?

Рассмотрите следующий отрывок:

public class StringValueOfNull {
    public static void main(String[] args) {
        String.valueOf(null);

        // programmer intention is to invoke valueOf(Object), but instead
        // code invokes valueOf(char[]) and throws NullPointerException
    }
}

Как объяснено в ответе на связанный вопрос, перегрузка метода Java разрешает вышеупомянутый вызов к String.valueOf(char[]), который законно приводит к a NullPointerException во времени выполнения.

Скомпилированный в Eclipse и javac 1.6.0_17, это - отслеживание стека:

Exception in thread "main" java.lang.NullPointerException
        at java.lang.String.(Unknown Source)
        at java.lang.String.valueOf(Unknown Source)
        at StringValueOfNull.main(StringValueOfNull.java:3)

Обратите внимание, что отслеживание стека выше пропускает КЛЮЧЕВУЮ информацию: это НЕ имеет полной подписи valueOf метод! Это просто говорит String.valueOf(Unknown Source)!

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

И все же в этом случае отслеживание стека не помогает вообще. Это потерпело полный провал в помощи программисту определить проблему.

Как, я вижу 3 способа, которыми программист может определить проблему с вышеупомянутым отрывком:

  • Программист понимает на его собственном, что метод перегружается, и по правилу разрешения, "неправильная" перегрузка вызывается в этом случае
  • Программист использует хороший IDE, который позволяет ему быстро видеть, какой метод выбран
    • В Eclipse, например, парение мыши по вышеупомянутому выражению быстро говорит программисту что String valueOf(char[] data) действительно выбранный тот
  • Программист исследует байт-код (тьфу!)

Последняя опция, вероятно, наименее доступна, но конечно является Окончательным Ответом (программист может, неправильно понял перегружающееся правило, IDE может быть багги, но байт-коды всегда(?) говорят правду на том, что делается).


Вопросы

  • Почему отслеживание стека так неинформативно в этом случае относительно подписей методов, которые находятся на самом деле в отслеживании стека?
    • Действительно ли это происходит из-за компилятора? Время выполнения? Что-то еще?
  • В какой другой (редкий?) сценарии отслеживание стека может не получить важную информацию как они?
51
задан Community 23 May 2017 в 02:18
поделиться

3 ответа

Обычно это связано с отсутствием отладочной информации. Вероятно, вы используете JRE (не JDK), который не включает отладочную информацию для классов rt.jar. Попробуйте использовать полный JDK, вы получите правильные местоположения в трассировке стека:

Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.<init>(String.java:177)
    at java.lang.String.valueOf(String.java:2840)
    at StringValueOfNull.main(StringValueOfNull.java:3)
29
ответ дан 7 November 2019 в 09:49
поделиться

Я запустил код в Eclipse и Я получил следующий результат:

public class Aloof {
    public static void main(String[] args) {
        String.valueOf(null);
    }
}

Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.<init>(String.java:177)
    at java.lang.String.valueOf(String.java:2840)
    at mysql.Aloof.main(Aloof.java:19)

Если вы включите полный исходный код (из JDK), вы действительно можете выполнить отладку до строки 177 в String.java

3
ответ дан 7 November 2019 в 09:49
поделиться

Это происходит, когда в исходном тексте нет отладочной (строковой) информации или ВМ приказано отбросить эту информацию во время загрузки класса. Поскольку у вас есть номера строк, дело не в настройках VM, а в том, что в классе String отсутствует отладочная информация.

1
ответ дан 7 November 2019 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: