Java: Почему исключения NullPointerException не называются NullReferenceExceptions - PullRequest
31 голосов
/ 19 сентября 2008

Был ли это недосмотр? Или это связано с JVM?

Ответы [ 5 ]

26 голосов
/ 28 марта 2009

В Java действительно есть указатели - указатели, над которыми нельзя выполнять арифметику указателей.

Из почтенного JLS :

Существует два вида типов в языке программирования Java: примитивные типы (§4.2) и ссылочные типы (§4.3). Соответственно, существует два вида значений данных, которые могут храниться в переменных, передаваться в качестве аргументов, возвращаться методами и обрабатываться: примитивные значения (§4.2) и ссылочные значения (§4.3).

А , позже :

объект является экземпляром класса или массивом .

Ссылочные значения (часто просто ссылки ) являются указателями на эти объекты и специальной нулевой ссылкой, которая не ссылается на объект.

(выделение их)

Итак, интерпретировать, если вы напишите:

Object myObj = new Object();

затем myObj - это ссылочный тип , который содержит справочное значение , которое само по себе указывает на вновь созданный Object.

Таким образом, если вы установите myObj до null вы устанавливаете эталонное значение (ака указатель ) до null. Следовательно, при разыменовании переменной разумно генерируется исключение NullPointerException.

Не волнуйтесь: эта тема была горячо обсуждена раньше.

3 голосов
/ 11 января 2011

В Java они используют номенклатуру REFERENCE для ссылки на динамически создаваемые объекты. На предыдущих языках он называется POINTER. Подобно тому, как именование МЕТОДОВ в объектно-ориентированных языках заимствовано из прежних ФУНКЦИЙ и ПРОЦЕДУР в более ранних (как объектно-ориентированных, так и не объектно-ориентированных) языках. Нет ничего лучше или хуже в этом наименовании или новом стандарте, это просто еще один способ назвать явление способности создавать бывшие динамические объекты, зависшие в воздухе (куче пространства) и на которые ссылается фиксированная ссылка на объект ( или динамическая привязка тоже висит в воздухе). Авторы нового стандарта (использование METHODS и REFERENCES) особо отметили, что новые стандарты были реализованы, чтобы привести его в соответствие с будущими системами планирования - такими как UML и UP, где использование объектно-ориентированной терминологии предписывает использование ATTRIBUTES, МЕТОДЫ и ССЫЛКИ, а не ПЕРЕМЕННЫЕ, ФУНКЦИИ и УКАЗАТЕЛИ.

Теперь вы можете подумать, что это было просто переименование, но это упростило бы описание процесса, а не просто длинный путь, который языки выбрали во имя разработки. Метод по своей природе отличается от процедуры тем, что он работает в области видимости класса, тогда как процедура по своей природе работает в глобальной области видимости. Точно так же атрибут - это не просто новое имя переменной, так как атрибут является свойством класса (а его экземпляр - объект). Точно так же ссылка, которая является вопросом, стоящим за этим небольшим написанием здесь, отличается тем, что она напечатана, поэтому она не имеет типичного свойства указателей, являясь необработанными ссылками на ячейки памяти, таким образом, опять же, ссылка является структурированной ссылкой на объекты на основе памяти.

Теперь, внутри Java, то есть - в желудке Java существует арбитражный уровень между базовым C-кодом и кодом Java (виртуальная машина). На этом уровне арбитража происходит абстракция, заключающаяся в том, что базовая (голая металлическая) реализация ссылок, как это делается на Виртуальной машине, защищает ссылки от ссылок на голый металл (ячейки памяти без структуры). Таким образом, грубая истина заключается в том, что исключение NullPointerException - это действительно исключение нулевого указателя, а не просто исключение нулевой ссылки. Тем не менее, эта истина может быть совершенно неактуальной для программиста в среде Java, так как он / она никогда не будет контактировать с голой железной JVM.

1 голос
/ 03 июня 2011

Я думаю, что ответ в том, что мы никогда не узнаем настоящего ответа.

Я подозреваю, что за некоторое время до выпуска Java 1.0 кто-то определил класс с именем NullPointerException. Либо этот человек неправильно понял имя, либо терминология не стабилизировалась; то есть решение использовать термин «ссылка» вместо «указатель» не было принято.

В любом случае, вероятно, никто не заметил, что несоответствие не может быть исправлено без нарушения обратной совместимости. Есть и другие мелкие несоответствия, подобные этому, если вы выглядите очень усердно. И некоторые более серьезные проблемы, которые не могут быть решены по той же причине.

Но это всего лишь догадка.

1 голос
/ 19 сентября 2008

Полагаю, это связано с тем, что JVM написана на C ++. Кроме того, указатели и ссылки почти одинаковы. Можно сказать, что механизм ссылок в Java реализован с использованием указателей C ++, а имя NullPointerException позволяет просвечивать детали реализации.

0 голосов
/ 19 сентября 2008

Это связано с тем, что Java была разработана для программистов на Си. В терминологии C слово «указатель» используется вместо «ссылка»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...