null java что это
Что из себя представляет null?
Свободный перевод вопроса «What is null in Java?» от участника @unj2.
1 ответ 1
В Java null == null (что верно не для всех языков). Из описания java.lang.Object :
public boolean equals(Object obj)
null также является значением по умолчанию для всех ссылочных типов.
Вы можете использовать это свойства для отложенной инициализации, когда поле будет иметь начальное значение null до тех пор, пока оно фактически не будет использовано, где будет заменено «реальным» значением (вычисление которого может быть дорогостоящим).
Есть и другие применения. Если посмотреть на java.lang.System :
Returns: The system console, if any, otherwise null.
Это очень распространённая практика: null используется для обозначения несуществующего объекта.
public String readLine() throws IOException
Returns: A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached.
Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.
К примеру, java.util.Hashtable делает вещи проще путём запрета null в ключах и значениях; так что, если V get(Object key) вернёт null это однозначно говорит о том, что под таким ключом ничего нет.
Операции автоматического анбоксинга на null выбросят java.lang.NullPointerException :
Если резюмировать, то null используется как специальное значение для обозначения:
Как null представлен в памяти?
Небольшое дополнение
I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
Что такое null в Java?
Is null экземпляр чего-либо?
что значит null принадлежит?
как он представлен в памяти?
14 ответов
является ли null экземпляром чего-либо?
15.20.2 Тип Оператора Сравнения instanceof
к какому набору принадлежит’ null’?
JLS 4.1 виды типов и значений
как говорится в приведенной выше цитате JLS, на практике вы можете просто притвориться, что это»просто специальный литерал, который может быть любого ссылочного типа».
В Java, null == null (это не всегда так на других языках). Обратите внимание также, что по договору он также имеет это специальное свойство (от java.lang.Object ):
public boolean equals(Object obj)
это тоже значение по умолчанию (для переменных, которые имеют их) для всех ссылочных типов:
JLS 4.12.5 начальные значения переменных
как это зависит. Вы можете использовать его, чтобы включить то, что называется ленивая инициализация полей, где поле будет иметь начальное значение null пока он фактически не используется, где он заменяется «реальным» значением (которое может быть дорогостоящим для вычисления).
есть и другие использует. Возьмем реальный пример из java.lang.System :
это очень распространенный шаблон использовать: null используется для обозначения несуществования объекта.
вот еще один пример использования, на этот раз из java.io.BufferedReader :
public String readLine() throws IOException
возвращает: A String содержит содержимое строки, не включая символы завершения строки, или null если достигнут конец потока.
здесь readLine() вернутся instanceof String для каждой строки, пока наконец не возвращает null чтобы обозначить конец. Это позволяет обрабатывать каждую строку следующим образом:
давайте возьмем другой пример, на этот раз с java.util.Map :
возвращает значение, к которому сопоставлен указанный ключ, или null Если эта карта не содержит отображения для ключа.
здесь мы начинаем видеть, как с помощью null может усложнить ситуацию. Первое утверждение гласит, что если ключ не сопоставлен, null возвращается. Второе утверждение говорит, что даже если ключ сопоставлен, null can и будет возвращенный.
вы можете прочитать остальную часть API и найти, где и как есть. Имейте в виду, что они не всегда лучшие практики примеры.
вообще говоря, null используются в качестве специального значения для обозначьте:
как это представлено в памяти?
В Java? Не твое дело. И так будет лучше.
Is null хорошая вещь?
это теперь пограничный субъективный. Некоторые говорят, что null вызывает много ошибок программиста, которых можно было бы избежать. Некоторые говорят, что на языке, который ловит NullPointerException как Java, хорошо использовать его, потому что вы будете быстро терпеть неудачу при ошибках программиста. Некоторые люди избегают null С помощью Null шаблон объекта, etc.
это огромная тема сама по себе, поэтому лучше всего обсудить ее как ответ на другой вопрос.
я называю это своей миллиардной ошибкой. это было изобретение null ссылка в 1965 году. В то время я разрабатывал первую комплексную систему типов для ссылок на объектно-ориентированном языке (ALGOL W). Моя цель состояла в том, чтобы убедиться, что все использование ссылок должно быть абсолютно безопасным, а проверка выполняется автоматически компилятором. Но я не мог устоять перед искушением вставить:—2—> ссылка, просто потому, что это было так легко осуществить. Это привело к бесчисленным ошибкам, уязвимостям и сбоям системы, которые, вероятно, причинили миллиард долларов боли и ущерба за последние сорок лет.
на видео-презентации идет глубже; это рекомендуемые часы.
является ли null экземпляром чего-либо?
к какому набору принадлежит ‘null’?
это один и единственный член типа null, где тип null определяется следующим образом:
» существует также специальный тип null, тип выражения null, который не имеет имени. Поскольку тип null не имеет имени, невозможно объявить переменную типа null или привести к типу null. Ссылка null является единственным возможным значением выражения типа null. Нулевая ссылка всегда может быть приведена к любому ссылочному типу. На практике программист может игнорировать тип null и просто притворяться, что null является просто специальным литерал, который может быть любого ссылочного типа.» JLS 4.1
см. выше. В некоторых контекстах, null используется для обозначения «нет объекта» или «неизвестно» или «недоступно», но эти значения специфичны для приложения.
это конкретная реализация, и вы не сможете увидеть представление null в чистом Java программа. (Но null представлен как нулевой адрес / указатель машины в большинстве, если не во всех реализациях Java.)
что такое null?
является ли null экземпляром чего-либо?
нет, поскольку это ничто, это не может быть экземпляром какой-либо вещи.
к какому набору принадлежит null?
нет никакого набора
как он представлен в памяти?
Если некоторые ориентиры к нему, как:
в памяти кучи некоторое пространство, назначенное new созданный объект. И o укажет на это место в памяти.
Это означает, что теперь не будет указывать, что область памяти объекта.
нет, это не экземпляр чего-либо, instanceof всегда будет ложным.
ключевое слово null является литералом, представляющим пустую ссылку, тот, который не относится ни к одному объекту. null-значение по умолчанию для переменных ссылочного типа.
также возможно посмотреть
в зависимости от параметров компилятора и модели памяти. NULL не является, строго говоря, частью самого C / C++.
null не является экземпляром какого-либо класса.
однако вы можете назначить null переменным любого типа (объекта или массива):
null является специальным значением, это не экземпляр ничего. По очевидной причине этого не может быть instanceof ничего.
представление байт-кода
в Java null имеет прямую поддержку JVM: для ее реализации используются три инструкции:
Глава 6 «Набор Инструкций Виртуальной Машины Java» затем упоминает последствия null на других инструкции: он бросает!—9—> для многих из них.
2.4. «Ссылочные типы и значения» также упоминает null в общих чертах:
ссылочное значение также может быть специальной нулевой ссылкой, ссылкой на объект no, которая будет обозначаться здесь null. Нулевая ссылка изначально не имеет типа времени выполнения, но может быть приведена к любому типу. По умолчанию значение типа null.
9 вещей о NULL в Java
Почему Вы должны узнать о null в Java?
Что есть null в Java
Зачастую, с этим встречаются программисты, перешедшие с других языков программирования, но при использовании современных IDE проблема становится незначительной. В наши дни, IDE вроде Eclipse или NetBeans могут исправлять эту ошибку пока Вы набираете код, но в эпоху Notepad, Vim и Emacs, это была распространенная проблема, которая могла съесть кучу драгоценного времени.
Так же, как каждый примитив имеет значение по умолчанию, например, у int это 0, у boolean это false, null это значение по умолчанию любых ссылочных типов, проще говоря, для всех объектов. Так же, как при создании логической переменной ее значение по умолчанию равно false, так и любые ссылочные переменные в Java по умолчанию будут равны null. Это истинно для всех типов переменных: переменной-члена или локальной переменной, переменной экземпляра или статической переменной, кроме того, компилятор будет ругаться, если Вы используете локальную переменную не проинициализировав ее.
Несмотря на распространенное заблуждение, null это не объект ( Object ) и ни тип. Это просто специальное значение, которое может быть назначено любому ссылочному типу, и Вы можете привести null к любому типу, как показано ниже:
Как Вы можете видеть, когда мы непосредственно присваиваем null примитиву, то получаем ошибку процесса компиляции, но, если присвоить null объекту класса-обертки, а затем присвоить этот объект соответствующему примитивному типу, компилятор не отреагирует, но мы будем вознаграждены null pointer exception во время выполнения. Это происходит из-за авто упаковки ( autoboxing ) в Java, и мы еще встретимся с ним в следующем пункте.
Но, когда Вы запустите данный фрагмент кода, в консоли Вы увидите
Оператор instanceof будет возвращать false если в качестве параметра указать любую ссылочную переменную со значением null или null сам по себе. Пример:
Вы можете послать null в качестве параметра метода, принимающего любой ссылочный тип, к примеру:
может быть вызван как
Что такое null в Java?
Является ли null экземпляром чего-либо?
В чем набор null принадлежит?
Как он представлен в памяти?
ОТВЕТЫ
Ответ 1
Является ли null экземпляром чего-либо?
15.20.2 Оператор сравнения типов instanceof
JLS 4.1 Виды типов и значений
Как сказано выше в JLS-цитате, на практике вы можете просто притвориться, что это «просто специальный литерал, который может быть любого ссылочного типа».
В Java null == null (это не всегда происходит на других языках). Заметим также, что по контракту он также обладает этим специальным свойством (от java.lang.Object ):
public boolean equals(Object obj)
Это также значение по умолчанию (для переменных, которые есть у них) для всех типов ссылок:
JLS 4.12.5 Начальные значения переменных
Как это используется, меняется. Вы можете использовать его, чтобы включить то, что называется ленивой инициализацией полей, где поле будет иметь начальное значение null до тех пор, пока оно фактически не будет использовано, где оно будет заменено на «реальное» значение (которое может быть дорогостоящим для вычисления).
Существуют и другие виды использования. Возьмем настоящий пример из java.lang.System :
Это очень распространенный шаблон использования: null используется для обозначения несуществующего объекта.
Вот еще один пример использования, на этот раз из java.io.BufferedReader :
public String readLine() throws IOException
Возьмем еще один пример, на этот раз из java.util.Map :
Вообще говоря, null используются как специальное значение для обозначения:
В Java? Ничего из вас. И это лучше всего сохранилось.
Есть ли null хорошая вещь?
Это огромная тема сама по себе, поэтому ее лучше обсудить как ответ на другой вопрос.
Я закончу это цитатой самого изобретателя null C.A.R Hoare (для быстрой сортировки):
Я называю это своей ошибкой в миллиард долларов. Это было изобретение справочника null в 1965 году. В то время я разрабатывал первую всеобъемлющую систему типов для ссылок в объектно-ориентированном языка (ALGOL W). Моя цель состояла в том, чтобы гарантировать, что все использование ссылок должно быть абсолютно безопасным, причем проверка выполняется автоматически компилятором. Но я не мог удержаться от соблазна поставить ссылку null просто потому, что ее было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и сбоям системы, которые, вероятно, вызвали миллиард долларов боли и ущерба за последние сорок лет.
Видео этой презентации идет глубже; это рекомендуемые часы.
Ответ 2
Является ли null экземпляром чего-либо?
Он является единственным и единственным членом нулевого типа, где нулевой тип определяется следующим образом:
См. выше. В некоторых контекстах null используется для обозначения «no object» или «unknown» или «unavailable», но эти значения являются специфичными для приложения.
Это специфичная реализация, и вы не сможете увидеть представление null в чистой программе Java. (Но null представляется как нулевой машинный адрес/указатель в большинстве, если не во всех реализациях Java.)
Ответ 3
Что такое null?
Является ли null экземпляром чего-либо?
Нет, как ничто. Это не может быть примером какой-либо вещи.
Какой набор имеет значение null?
Нет никакого набора
Как он представлен в памяти?
Если некоторые ориентиры указывают на это как:
В памяти кучи некоторое пространство присваивается новому созданному объекту. И o укажет на выделенное место в памяти.
Это означает, что теперь o не будет указывать на это пространство памяти объекта.
Ответ 4
Нет, это не экземпляр ничего, instanceof всегда будет false.
Ответ 5
Также, возможно, посмотрите
Ответ 6
в зависимости от параметров модели компилятора и модели памяти. NULL не является, строго говоря, частью самого C/С++.
В Java ™ «null» не является ключевым словом, а является специальным литералом типа null. Его можно использовать для любого ссылочного типа, но не для любого примитивного типа, такого как int или boolean. Нулевой литерал необязательно имеет значение 0. И невозможно применить к типу null или объявить переменную этого типа.
Ответ 7
Null не является экземпляром любого класса.
Однако вы можете присвоить значение null переменным любого типа (объекта или массива):
Ответ 8
Ответ 9
Ответ 10
Представление байткода
null имеет прямую поддержку JVM: для ее реализации используются три команды:
Глава 6 «Набор инструкций виртуальной машины Java» затем описывает эффекты null в других инструкциях: он выдает NullPointerException для многих из них.
2.4. «Типы ссылок и значения» также упоминает null в общих терминах:
Базовое значение также может быть специальной нулевой ссылкой, ссылкой на какой-либо объект, который будет обозначаться здесь нулем. Первоначальная нулевая ссылка не имеет типа времени выполнения, но может быть применена к любому типу. Значение по умолчанию для ссылочного типа равно null.
Ответ 11
Интересным способом увидеть null в java, на мой взгляд, является его просмотр как нечто, что НЕ означает отсутствие информации, а просто как буквальное значение, которое может быть присвоено ссылке любого типа. Если вы думаете об этом, если обозначить отсутствие информации, то для a1 == a2 быть истинным не имеет смысла (в случае, если им было присвоено значение null), поскольку они действительно могли бы указывать на ЛЮБОЙ объект (мы просто не знаю, на какие объекты они должны указывать). Кстати null == null возвращает true в java. Если java, например. будет похоже на SQL: 1999, тогда null == null вернет неизвестный (логическое значение в SQL: 1999 может принимать три значения: true, false и неизвестно, но на практике неизвестно реализовано как null в реальных системах). http://en.wikipedia.org/wiki/SQL
Ответ 12
В Java существуют две основные категории типов: примитивная и ссылка. Переменные, объявленные значения хранилища примитивного типа; переменные, объявленные ссылками хранилища ссылочного типа.
В этом случае оператор инициализации объявляет переменные «x». «x» хранит ссылку на String. Здесь null. Прежде всего, null не является допустимым экземпляром объекта, поэтому для него не выделяется память. Это просто значение, указывающее, что ссылка на объект в настоящее время не ссылается на объект.
Ответ 13
Короткий и точный ответ, который формально отвечает на все ваши вопросы из JLS:
Тип null имеет одно значение, нулевую ссылку, представленную null literal null, который формируется из символов ASCII.
Нулевой литерал всегда имеет нулевой тип.
Выделяется только ссылка типа, присвоенного нулевому значению. Вы не присваиваете ссылку на значение (объект). Такое распределение специфично для JVM, сколько ссылок потребуется и в какой области памяти будет выделено.
Ответ 14
null в Java аналогичен/аналогичен nullptr в С++.
Такая же программа в Java:
Теперь вы понимаете из кодов выше, что является нулевым в Java? Если нет, то я рекомендую вам изучить указатели на C/С++, а затем вы поймете.
Обратите внимание, что в C, в отличие от С++, nullptr является undefined, но вместо него используется NULL, который также может использоваться и на С++, но в С++ nullptr более предпочтителен, чем просто NULL, потому что NULL в C всегда связанный с указателями, и что он, поэтому в С++ суффикс «ptr» был добавлен к концу слова, а также все буквы теперь имеют строчные буквы, но это менее важно.
В С++ вы можете использовать указатели и значение nullptr для необязательных членов/переменных, то есть член/переменная, которая не имеет значения, и если она не имеет значения, то она равна nullptr, поэтому как null в Например, Java может использоваться.
Что такое нуль в Java?
Является ли null экземпляром чего-либо?
Как это представлено в памяти?
Является ли null экземпляром чего-либо?
Нет, не существует типа, который null является instanceof name__.
15.20.2 Оператор сравнения типов instanceof name __
Во время выполнения результатом оператора instanceof будет true name__, если значение RelationalExpression не равно null и ссылка может быть приведена к ReferenceType без поднятия ClassCastException name__. В противном случае результат будет false name__.
К какому набору принадлежит «ноль»?
JLS 4.1 Виды типов и значений
Как сказано в приведенной выше цитате JLS, на практике вы можете просто притвориться, что это «просто специальный литерал, который может иметь любой ссылочный тип».
В Java null == null (это не всегда так на других языках). Также обратите внимание, что по контракту оно также имеет это специальное свойство (из Java.lang.Object ):
public boolean equals(Object obj)
Это также значение по умолчанию (для переменных, у которых они есть) для всех ссылочных типов:
JLS 4.12.5 Начальные значения переменных
Как это используется, варьируется. Вы можете использовать его для включения так называемой отложенной инициализации полей, где поле будет иметь свое начальное значение null до его фактического использования, где оно будет заменено «реальным» значением (который может быть дорогим для вычисления).
Есть и другие варианты использования. Давайте возьмем реальный пример из Java.lang.System :
Возвращает : системная консоль, если есть, в противном случае null name__.
Это очень распространенный шаблон использования: null используется для обозначения несуществования объекта.
Вот еще один пример использования, на этот раз из Java.io.BufferedReader :
public String readLine() throws IOException
Возвращает : String name__, содержащий содержимое строки, не включая символы завершения строки, или null name__, если достигнут конец потока.
Итак, здесь readLine() будет возвращать instanceof String для каждой строки, пока, наконец, не вернет null для обозначения конца. Это позволяет обрабатывать каждую строку следующим образом:
Давайте возьмем другой пример, на этот раз из Java.util.Map :
Возвращает значение, которому сопоставлен указанный ключ, или null name__, если эта карта не содержит сопоставления для ключа.
Если эта карта допускает значения null name__, то возвращаемое значение null не обязательно указывает, что карта не содержит сопоставления для ключа; также возможно, что карта явно отображает ключ на null name__. Операция containsKey может использоваться для различения этих двух случаев.
Здесь мы начинаем видеть, как использование null может усложнить ситуацию. Первое утверждение говорит, что если ключ не сопоставлен, возвращается null name__. Второе утверждение говорит, что даже если ключ сопоставлен, null можно также вернуть.
Вообще говоря, null используются в качестве специального значения для обозначения:
Как это представлено в памяти?
На яве? Не твоя забота. И лучше всего так держать.
Это сейчас пограничный субъективный. Некоторые люди говорят, что null вызывает много ошибок программиста, которых можно было бы избежать. Некоторые говорят, что на языке, который перехватывает NullPointerException name__, например, Java, его хорошо использовать, потому что вы быстро справитесь с ошибками программиста. Некоторые люди избегают null name__, используя шаблон нулевого объекта и т.д.
Это огромная тема сама по себе, поэтому ее лучше обсуждать как ответ на другой вопрос.
Я закончу это цитатой самого изобретателя null name__, C.A.R Hoare (о славе быстрой сортировки):
Я называю это своей ошибкой в миллиард долларов. Это было изобретение ссылки null в 1965 году. В то время я разрабатывал первую комплексную систему типов для ссылок на объектно-ориентированном языке (ALGOL W). Моя цель состояла в том, чтобы гарантировать, что любое использование ссылок должно быть абсолютно безопасным, с проверкой, выполняемой автоматически компилятором. Но я не мог удержаться от соблазна вставить ссылку null просто потому, что это было легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и сбоям системы, которые, вероятно, причинили миллиард долларов боли и ущерба за последние сорок лет.
видео этой презентации идет глубже; это рекомендуемые часы.