NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
С тех пор DateTime
struct
, не class
, Вы добираетесь DateTime
объект , не ссылка , когда Вы объявляете поле или переменную того типа.
И, таким же образом как int
не может быть null
, таким образом, этот DateTime
объект никогда не может быть null
, потому что это не ссылка.
Добавление вопросительного знака превращает его в nullable тип , что означает, что или это DateTime
объект, , или это null
.
DateTime?
синтаксический сахар для [1 111], где Nullable
самостоятельно struct
.
Это - nullable DateTime. ?
после того, как тип примитива / структура указывает, что это - nullable версия.
DateTime является структурой, которая никогда не может быть пустой. От MSDN:
тип значения DateTime представляет даты и время со значениями в пределах от 12:00:00 полуночи, 1 января, 0001 нашей эры, или нашей эры (также известный как Наша эра или C.E.) в течение 23:59:59, 31 декабря, 9999 нашей эры (C.E).
DateTime?
может быть пустым как бы то ни было.
? , поскольку суффикс для типа значения допускает пустые присвоения, которые были бы othwerwise невозможный.
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
Представляет объект, базовый тип которого является типом значения, которому можно также присвоить нулевая ссылка.
Это означает, что можно записать что-то вроде этого:
DateTime? a = null;
if (!a.HasValue)
{
a = DateTime.Now;
if (a.HasValue)
{
Console.WriteLine(a.Value);
}
}
DateTime? синтетически эквивалентно [1 110] Nullable< DateTime> .
Это эквивалентно Nullable< DateTime>. Можно ли добавить"?" к любому типу примитива или структуре.
это в основном дает Вам дополнительное состояние для примитивов. Это может быть значение, или это может быть пустым. Может быть полезно в ситуациях, где значение не должно быть присвоено. Так вместо того, чтобы использовать, например, datetime.min или макс., можно присвоить его пустой для представления значения.