Подтвердить что ты не робот

Java: Почему NullPointerExceptions не называются NullReferenceExceptions?

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

4b9b3361

Ответ 1

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

От почтенного JLS:

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

И позже:

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

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

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

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

Object myObj = new Object();

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Но это всего лишь гипотеза.

Ответ 5

Это связано с тем, что Java был разработан с программистами C. В терминологии C слово "pointer" используется вместо "reference"