Фон
Этот вопрос относится к Почему String.valueOf (null) генерирует исключение 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[])
, что справедливо приводит к NullPointerException
во время выполнения.
Скомпилировано в Eclipse и javac 1.6.0_17
, это трассировка стека:
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.<init>(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
at StringValueOfNull.main(StringValueOfNull.java:3)
Обратите внимание, что в трассировке стека выше отсутствует KEY информация: НЕ имеет полную сигнатуру valueOf
метода!Он просто говорит String.valueOf(Unknown Source)
!
В большинстве ситуаций, с которыми я сталкивался, трассировки стека исключений всегда имеют полную сигнатуру методов, которые на самом деле находятся в трассировке стека, что, конечно, очень полезно в немедленной идентификации проблемы и основной причине, по которой трассировка стека (которую, разумеется, довольно дорого построить) предоставляется в первую очередь.
И, тем не менее, в этом случае трассировка стека вообще не помогает .Он с треском провалился, помогая программисту идентифицировать проблему.
Таким образом, я вижу 3 способа, которыми программист может идентифицировать проблему с помощью приведенного выше фрагмента:
- Программист осознает, чтоего / ее собственное, что метод перегружен, и по правилу разрешения в этом случае вызывается «неправильная» перегрузка
- Программист использует хорошую IDE, которая позволяет ему / ей быстро видеть, какой метод выбран
- Например, в Eclipse при наведении указателя мыши на вышеупомянутое выражение программист быстро сообщает, что
String valueOf(char[] data)
действительно выбрано
- Программист проверяет байт-код (тьфу!)
Последний вариант, вероятно, наименее доступен, но, конечно же, это Ultimate Answer (программист может неправильно понять правило перегрузки, IDE может содержать ошибки, но байт-коды всегда (?) Говорят правду о том, чтоделается).
Вопросы
- Почему трассировка стека так неинформативна в этом случае в отношениисигнатуры методов, которые на самом деле находятся в трассировке стека?
- Это из-за компилятора?Время выполнения?Что-то еще?
- В каких других (редких?) Сценариях трассировка стека может не захватить важную информацию, подобную этой?