Этот вопрос связан с тем, Почему 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 способа, которыми программист может определить проблему с вышеупомянутым отрывком:
String valueOf(char[] data)
действительно выбранный тотПоследняя опция, вероятно, наименее доступна, но конечно является Окончательным Ответом (программист может, неправильно понял перегружающееся правило, IDE может быть багги, но байт-коды всегда(?) говорят правду на том, что делается).
Обычно это связано с отсутствием отладочной информации. Вероятно, вы используете 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)
Я запустил код в 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
Это происходит, когда в исходном тексте нет отладочной (строковой) информации или ВМ приказано отбросить эту информацию во время загрузки класса. Поскольку у вас есть номера строк, дело не в настройках VM, а в том, что в классе String
отсутствует отладочная информация.