Классы 03 и последующие в SQLSTATE описывают различные ошибочные ситуации подклассы специфицируют как стандартные ситуации, так и определяемые приложением.
Что такое NULL и для чего он нужен
Эту строку, которая повергла меня в шок много лет назад, я приведу в данной статье. А сейчас мы попробуем разобраться с тем, что представляет собой NULL , как он используется и можно ли заменить его «обычным» нулём.
NULL — это макрос, определение которого содержится в библиотеке stdlib.h . Его значением является адрес, доступ к которому не предусмотрен. Программа, в которой используется макрос NULL , никогда не размещает никаких данных по этому адресу.
Значение NULL может быть присвоено указателю любого типа, в том числе, и нетипизированному. Например, все следующие присвоения корректны:
Указатель, содержащий значение NULL , называется нулевым. Таким образом, указатели p1 , p2 и p3 , описанные выше, – нулевые.
Давайте теперь рассмотрим ситуации, в которых используются макрос NULL и нулевые указатели.
Функции динамического выделения памяти обычно обычно возвращают адрес выделенного участка в случае успеха, а в случае неудачи возвращают NULL . Именно таким образом ведёт себя, например, библиотечная функция malloc() . Благодаря этому, код, вызывающий такую функцию, может корректно обработать ситуацию, в которой память выделить не удалось; проиллюстрируем это следующим примером:
2-я строка в этом примере — это как раз та, которую я упоминал в начале статьи.
В более общем случае, функции, генерирующие некоторые данные, динамически выделяющие под них память, заполняющие её этими данными и возвращающие адрес выделенного участка, могут возвращать NULL и как признак того, что данные сгенерировать не удалось, например, вследствие ошибки в переданных функции параметрах.
Другой пример: указателю был присвоен адрес динамически выделенного участка памяти. Через некоторое время выделенная память была утилизирована. Теперь обращение по адресу, хранящемуся в указателе, может привести к непредсказуемым последствиям. Чтобы избежать этого, указателю присваивают значение NULL , как индикатор того, что разыменовывать указатель нельзя.
Кстати, библиотечная функция free() , занимающаяся освобождением динамически выделенной памяти и принимающая в качестве аргумента адрес выделенного участка, корректно обрабатывает значение NULL . Таким образом, если передать ей нулевой указатель, то ничего страшного не произойдёт. Между прочим, не произойдёт вообще ничего!
Промокоды на Займер на скидки
Этот нулевой указатель будет являться признаком того, что узел, в котором он содержится, — последний в списке. Данным признаком очень удобно пользоваться во время перебора всех узлов списка в цикле: мы переходим от узла к узлу, пока не «наткнёмся» на нулевой указатель. На этом цикл заканчивается.
Пусть, например, тип узла описывается следующим образом:
Тогда функция, печатающая на отдельной строке содержимое каждого узла, может выглядеть так:
Как только указатель на следующий узел окажется равным NULL , итерации прекращаются.
Как мы видим, NULL можно использовать в программе везде, где можно использовать адреса. NULL можно присваивать указателям, возвращать из функций, передавать в функции. Правда, в последнем случае нужно быть уверенным, что функция «умеет» корректно обрабатывать NULL . Например, функция free() таким умением обладает, а приведённая выше функция print() — нет.
NULL в SQL — Энциклопедия программирования
Так как мы использовали конструктор по умолчанию, то свойство Phone не определено имеет значение null и, соответственно, Company тоже равно null.
Оператор ??
Про этот оператор мы не говорили, когда разбирали логические операторы C#. Оператор ?? называется оператором null-объединения . Обычно, оператор null-объединения используется для того, чтобы установить для переменных ссылочного типа значение по умолчанию.
Принцип действия оператора null-объекдинения: оператор ?? возвращает левый операнд, если этот операнд не равен null . Иначе вычисляется правый операнд и возвращается его значение. То есть, слева от ?? всегда должна быть переменная ссылочного типа, т.е. «уметь» принимать значение null , например:
В примере с объектов x на экран будет выведена строка « Переменной X присвоено значение null » так как x у нас равен null . Во втором случае, с переменной z на экран будет выведено значение 200 так как переменной z присвоено значение отличное от null .
Здесь переменная x представляет тип значений ( int ) и не может принимать значение null , поэтому в качестве левого операнда в операции ?? она использоваться не может.
Оператор объединения с null?
Оператор условного null
При работе с объектами, которые принимают значение null , довольно часто (особенно новички), могут столкнуться со следующей ошибкой: попытка обратиться к объекту вызывает ошибку, так как этот объект фактически равен null . Например, пусть у нас есть следующая система классов:
Здесь объект User содержит ссылку на объект Phone , который, в свою очередь, содержит ссылку на объект Company . Теоретически, мы можем получить из объекта User название компании, например:
Так как мы использовали конструктор по умолчанию, то свойство Phone не определено (имеет значение null ) и, соответственно, Company тоже равно null . Поэтому, если мы попытаемся получить значение Company , то столкнемся с исключением NullReferenceException . Чтобы избежать такой ошибки мы могли бы использовать условный оператор if для проверки на null свойств у User и Phone , например:
В итоге код будет работать, исключения не возникнет, но многоуровневая конструкция с нагромождением if наш код не красит, поэтому её можно сократить и написать вот так, используя наши знания по логическим операциям C#:
Здесь мы уже задействовали условное логическое И. Конструкция, в итоге, получилась намного проще, но все равно довольно большой. Чтобы ее упростить, в C# имеется оператор условного null:
В отличие от ссылочного массива, в новом массиве значений каждый элемент имеет свою закрепленную ячейку памяти, где все биты ячейки изначально установлены в 0.
Может ли «this» когда-либо иметь значение null в Java?
Увидел эту строку в методе класса, и моей первой реакцией было высмеять разработчика, который ее написал . Но потом я подумал, что сначала должен убедиться, что я прав.
Всегда сначала высмеивайте, а потом задавайте вопросы. Легче извиниться, чем использовать прекрасную возможность разорвать кого-то в шквале серы.
ну в C # он может быть нулевым. В некоторых крайних случаях. У меня был такой же порыв: высмеять лоха, но потом я просто успокоился. Посмотрите здесь: stackoverflow.com/questions/2464097/…
Нет, не может. Если вы используете this , значит, вы находитесь в экземпляре, поэтому this он не равен нулю.
При использовании в качестве основного выражения ключевое слово this обозначает значение, которое является ссылкой на объект, для которого был вызван метод экземпляра (§15.12), или на создаваемый объект.
Если вы вызвали метод из объекта, то объект существует или у вас будет NullPointerException ранее (или это статический метод, но тогда вы не можете использовать this ).
Я плохо разбираюсь в Java, но в C ++ this метод экземпляра может иметь значение NULL. Поэтому я не совсем уверен, что это достаточная причина для Java.
исключение нулевого указателя в чем-то вроде foo.bar() будет выброшено, когда foo будет обнаружено null . это действительно происходит до входа в метод, но на самом деле нет метода, который можно было бы вызвать.
@KennyTM: в Java этого достаточно. Если вы используете this ключевое слово, и оно компилируется, оно не равно нулю, когда вы его наблюдаете. Но, как говорят другие, это не предотвращает NPE при попытке вызвать метод, например, но это полностью вне вашего контроля как метода, и проверка на null внутри метода ничего не изменит.
@Kenny: Не обошлось и без неопределенного поведения , хотя, если вы знаете детали своей реализации, вы могли бы ее использовать.
Я бы не подписался под этим окончательным ответом, даже если он имеет полный смысл. У меня есть отчеты о сбоях для приложения Android, где this == null, когда метод экземпляра вызывается сразу после того, как переменная обнуляется из другого потока. Фактический вызов выполняется, даже если переменная имеет значение NULL, и происходит сбой при попытке прочитать член экземпляра 🙂
Это как спрашивать себя: «Я жив?» this никогда не может быть нулевым
Вы говорите, что это this != null было само собой разумеющимся. Это не так — в C ++, например, this вполне может быть NULL , для невиртуального метода.
@nikie В каком-то смысле это само собой разумеющееся. Даже в C ++ любая программа, в которой это происходит, имеет неопределенное поведение. Это также может произойти с виртуальными функциями на GCC: ideone.com/W7RmU .
@ JohannesSchaub-litb Неправда, что поведение программы на C ++ с нулевой ссылкой для этого не определено. Это определено, если вы не разыменовываете это
Нет никогда , ключевое слово this само по себе представляет текущий активный экземпляр (объект) этого класса в рамках этого класса, с помощью которого вы можете получить доступ ко всем его полям и членам (включая конструкторы), а также к видимым полям его родительского класса.
Может ли «this» когда-либо иметь значение null в Java?
Микрофинансирование → Микрокредиты → Специальные предложения → Скачать файлы → Обзор Быстроденег → Предмет договора → Ответственность сторон → Отличные наличные→ Экспресс займы