Android java int null

Как общаться с null в Java и не страдать

Авторизуйтесь

Как общаться с null в Java и не страдать

Java и null неразрывно связаны. Трудно найти Java-программиста, который не сталкивался с NullPointerException . Если даже автор понятия нулевого указателя признал его «ошибкой на миллиард долларов», почему он сохранился в Java? null присутствует в Java уже давно, и я уверен, что разработчики языка знают, что он создает больше проблем, чем решает. Это удивительно, ведь философия Java — делать вещи как можно более простыми. Если разработчики отказались от указателей, перегрузки операторов и множественного наследования, то почему они оставили null ? Я не знаю ответа на этот вопрос. Однако не имеет значения, насколько много критики идет в адрес null в Java, нам придется с этим смириться. Вместо того, чтобы жаловаться, давайте лучше научимся правильно его использовать. Если быть недостаточно внимательным при использовании null , Java заставит вас страдать с помощью ужасного java.lang.NullPointerException . Наиболее частая причина NullPointerException — недостаточное понимание тонкостей использования null . Давайте вспомним самые важные вещи о нем в Java.

Что такое null в Java

Как мы уже выяснили, null очень важен в Java. Изначально он служил, чтобы обозначить отсутствие чего-либо, например, пользователя, ресурса и т. п. Но уже через год выяснилось, что он приносит много проблем. В этой статье мы рассмотрим основные вещи, которые следует знать о нулевом указателе в Java, чтобы свести к минимуму проверки на null и избежать неприятных NullPointerException .

1. В первую очередь, null — это ключевое слово в Java, как public , static или final . Оно регистрозависимо, поэтому вы не сможете написать Null или NULL , компилятор этого не поймет и выдаст ошибку:

Эта проблема часто возникает у программистов, которые переходят на Java с других языков, но с современными средами разработки это несущественно. Такие IDE, как Eclipse или Netbeans, исправляют эти ошибки, пока вы набираете код. Но во времена Блокнота, Vim или Emacs это было серьезной проблемой, которая отнимала много времени.

2. Так же, как и любой примитивный тип имеет значение по умолчанию (0 у int , false у boolean ), null — значение по умолчанию любого ссылочного типа, а значит, и для любого объекта. Если вы объявляете булеву переменную, ей присваивается значение false . Если вы объявляете ссылочную переменную, ей присваивается значение null , вне зависимости от области видимости и модификаторов доступа. Единственное, компилятор предупредит о попытке использовать неинициализированную локальную переменную. Для того, чтобы убедиться в этом, вы можете создать ссылочную переменную, не инициализируя ее, и вывести ее на экран:

Это справедливо как для статических, так и для нестатических переменных. В данном случае мы объявили myObj как статическую переменную для того, чтобы ее можно было использовать в статическом методе main .

4–5 декабря, Онлайн, Беcплатно

3. Несмотря на распространенное мнение, null не является ни объектом, ни типом. Это просто специальное значение, которое может быть присвоено любому ссылочному типу. Кроме того, вы также можете привести null к любому ссылочному типу:

Как видите, приведение null к ссылочному типу не вызывает ошибки ни при компиляции, ни при запуске. Также при запуске не будет NullPointerException , несмотря на распространенное заблуждение.

4. null может быть присвоен только переменной ссылочного типа. Примитивным типам — int , double , float или boolean — значение null присвоить нельзя. Компилятор не допустит этого и выдаст ошибку:

Итак, попытка присвоения значения null примитивному типу — ошибка времени компиляции, но вы можете присвоить null типу-обертке, а затем присвоить это значение соответствуему примитиву. Компилятор ругаться не будет, но при выполнении кода будет брошено NullPointerException . Это происходит из-за автоматического заворачивания (autoboxing) в Java

Читайте также:  Слот андроид реальные деньги

5. Любой объект класса-обертки со значением null кинет NullPointerException при разворачивании (unboxing). Некоторые программисты думают, что обертка автоматически присвоит примитиву значение по умолчанию (0 для int , false для boolean и т. д.), но это не так:

Если вы запустите этот код, вы увидите Exception in thread «main» java.lang.NullPointerException в консоли. Это часто случается при работе с HashMap с ключами типа Integer . Код ниже сломается, как только вы его запустите:

Этот код выглядит простым и понятным. Мы ищем, сколько каждое число встречается в массиве, это классический способ поиска дубликатов в массиве в Java. Мы берем предыдущее значение количества, инкрементируем его и кладем обратно в HashMap . Мы полагаем, что Integer позаботится о том, чтобы вернуть значение по умолчанию для int , однако если числа нет в HashMap , метод get() вернет null , а не 0. И при оборачивании выбросит NullPoinerException . Представьте, что этот код завернут в условие и недостаточно протестирован. Как только вы его запустите на продакшен – УПС!

6. Оператор instanceof вернет false , будучи примененным к переменной со значением null или к литералу null :

Это важное свойство оператора instanceof , которое делает его полезным при приведении типов.

7. Возможно, вы уже знаете, что если вызвать нестатический метод по ссылке со значением null , результатом будет NullPointerException . Но зато вы можете вызвать по ней статический метод класса:

Результат выполнения этого кода:

8. Вы можете передавать null в любой метод, который принимает ссылочный тип, например, public void print(Object obj) может быть вызван так: print(null) . С точки зрения компилятора ошибки здесь нет, но поведение такого кода целиком зависит от реализации метода. Безопасный метод не кидает NullPointerException в этом случае, а тихо завершает работу. Если бизнес-логика позволяет, лучше писать безопасные методы.

9. Вы можете сравнивать null , используя оператор == («равно») и != («не равно»), но не с арифметическими или логическими операторами (такими как «больше» или «меньше»). В отличие от SQL, в Java null == null вернет true :

Вывод этого кода:

Вот и все, что надо знать о null в Java. При наличии небольшого опыта и с помощью простых приемов вы можете сделать свой код безопасным. Поскольку null может рассматриваться как пустая или неинициализированная переменная, важно документировать поведение метода при получении null . Помните, что любая созданная и не проинициализированная переменная имеет по умолчанию значение null и что вы не можете вызвать метод объекта или обратиться к его полю, используя null .

Источник

Как установить значение int null? Java Android

что является лучшим способом, чтобы уже заданы определенными инт до null ?

поэтому я выбираю это

Тогда мне нужно что-то вроде :

И мой второй вопрос: Могу ли я безопасно привести целое число к int?

Спасибо за любой ответ.

4 ответа

Как установить значение null с org.json.JSONObject в java? Я, конечно, могу прочитать, если значение равно null, используя isNull — но кажется, что когда я ставлю null, он просто игнорирует меня: JSONObject o = new JSONObject(); o.put(key,null); o.isNull(key); // returns true, buuuut.

Если у меня есть int в Java, который я использую в качестве цвета Android (для рисования на холсте), как я могу манипулировать только альфа-компонентом этого int? Например, как я могу использовать операцию для этого: int myOpaqueColor = 0xFFFFFF; float factor = 0; int myTransparentColor =.

Вы не можете. int — это примитивный тип значения-нет такого понятия, как значение null для int .

Вы можете использовать null с Integer , потому что это класс , а не примитивное значение.

На самом деле не совсем ясно, чего пытается достичь ваш метод, но вы просто не можете представить null как int .

В этом случае я бы не стал использовать null все вместе.

Просто используйте -1 в качестве null

Если вам нужно, чтобы -1 было приемлемым (а не null) значением, вместо этого используйте float . Поскольку все ваши реальные ответы будут целыми числами, сделайте свой null 0.1

Читайте также:  Формат xls для андроид

Или найдите значение, которым x никогда не будет, например Integer.MAX_VALUE или что-то в этом роде.

Только объекты могут быть null. Примитивы (например, int ) не могут.

могу ли я безопасно привести целое число к int?

Вам не нужен гипс, вы можете положиться на автоматическую распаковку. Однако он может выбросить NullPointerException:

Ваш метод компилируется, но при попытке распаковать целое число будет выдавать NullPointerException.

Выбор между Integer и int зависит от того, чего вы пытаетесь достичь. Вам действительно нужно дополнительное состояние, указывающее «нет ценности»? Если это законное состояние, используйте Integer. В противном случае используйте int.

Похожие вопросы:

Для String s Я могу сделать String s = null , так как String -это объект в java. Для chars я могу сделать char c = ‘\u0000’; , потому что это символ null (я также мог бы использовать символ.

Как установить значение null с com.google.gson.JsonObject в java? Я, конечно, могу прочитать, если значение равно null, используя isNull — но кажется, что когда я ставлю null, он просто игнорирует.

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

Как установить значение null с org.json.JSONObject в java? Я, конечно, могу прочитать, если значение равно null, используя isNull — но кажется, что когда я ставлю null, он просто игнорирует меня.

Если у меня есть int в Java, который я использую в качестве цвета Android (для рисования на холсте), как я могу манипулировать только альфа-компонентом этого int? Например, как я могу использовать.

Как установить значение внешнего ключа в таблице 2 как NULL при удалении первичного ключа в таблице 1? Я создал 2 таблицы Item и order_item . Item(item_no(primary key),qty);.

int value=0; if (value == 0) < value = null; >Как я могу установить value на null выше? Любая помощь будет оценена по достоинству.

Можно ли присвоить значение null одному элементу внутри целочисленного массива? Например: int[] num = new int[3]; num[0] = 23; num[1] = null; num[2] = 12 Когда я попробовал это сделать, он выдал.

У меня есть эта колонка int : @Column(length = 4) private int contract_owner_id; Мне не нужно устанавливать значение всегда для каждой строки таблицы. Я получаю это исключение, когда делаю запрос.

У меня есть nullable int в модели, можно ли установить значение на некоторое значение, если получить null в качестве входных данных, в противном случае установите входящее значение как есть. Я.

Источник

9 вещей о NULL в Java

Почему Вы должны узнать о null в Java?

Что есть null в Java

Перво-наперво, null это ключевое слово в Java, так же как public , static или final . Регистр учитывается, Вы не можете писать null как Null или NULL, компилятор не распознает его и будет выброшена ошибка.

Зачастую, с этим встречаются программисты, перешедшие с других языков программирования, но при использовании современных IDE проблема становится незначительной. В наши дни, IDE вроде Eclipse или NetBeans могут исправлять эту ошибку пока Вы набираете код, но в эпоху Notepad, Vim и Emacs, это была распространенная проблема, которая могла съесть кучу драгоценного времени.

Так же, как каждый примитив имеет значение по умолчанию, например, у int это 0, у boolean это false, null это значение по умолчанию любых ссылочных типов, проще говоря, для всех объектов. Так же, как при создании логической переменной ее значение по умолчанию равно false, так и любые ссылочные переменные в Java по умолчанию будут равны null. Это истинно для всех типов переменных: переменной-члена или локальной переменной, переменной экземпляра или статической переменной, кроме того, компилятор будет ругаться, если Вы используете локальную переменную не проинициализировав ее.

Это истинно как для статических, так и для не статических объектов, как Вы можете видеть здесь, я сделал myObj статической ссылкой, так что я могу использовать ее непосредственно в методе main , который является статическим методом и не позволяет обращаться к не статическим переменным изнутри.

Читайте также:  Обзор rts для андроид

Несмотря на распространенное заблуждение, null это не объект ( Object ) и ни тип. Это просто специальное значение, которое может быть назначено любому ссылочному типу, и Вы можете привести null к любому типу, как показано ниже:

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

null может быть назначен только ссылочному типу, Вы не можете назначить null примитивной переменной вроде int , double , float или boolean . Компилятор выразит Вам свое недовольство если Вы сделаете как показано ниже:

Как Вы можете видеть, когда мы непосредственно присваиваем null примитиву, то получаем ошибку процесса компиляции, но, если присвоить null объекту класса-обертки, а затем присвоить этот объект соответствующему примитивному типу, компилятор не отреагирует, но мы будем вознаграждены null pointer exception во время выполнения. Это происходит из-за авто упаковки ( autoboxing ) в Java, и мы еще встретимся с ним в следующем пункте.

Любой класс-обертка со значением null будет выбрасывать java.lang.NullPointerException когда Java распакует( unbox ) его в примитивную переменную. Некоторые программисты делают ошибку допуская, что авто упаковка( autoboxing ) позаботится о конвертации null в значение по умолчанию для соответствующего примитивного типа, например, 0 для int , false для boolean и т.д., но это не верно, в чем можно убедиться ниже:

Но, когда Вы запустите данный фрагмент кода, в консоли Вы увидите

Это часто происходит при работе с HashMap и Integer key . Выполнение кода, показанного ниже прервется, как только Вы его запустите.

Этот код выглядит очень простым и безобидным. Вы просто подсчитываете сколько раз число встречается в массиве, классическая техника нахождения дубликатов. Разработчик берет предыдущее подсчитанное количество, увеличивает его на единицу и вставляет обратно в Map . Он мог бы подумать, что авто-упаковка позаботится о преобразовании Integer в int , как это делается в момент вызова метода put() , но он забывает, что если для числа подсчет еще не проводился, метод get() вернет из HashMap null, не ноль, потому что значение по умолчанию для Integer это null, а не 0, и авто-упаковка выбросит null pointer exception при попытке сконвертировать Integer в переменную int .

Оператор instanceof будет возвращать false если в качестве параметра указать любую ссылочную переменную со значением null или null сам по себе. Пример:

Это важное свойство оператора instanceof , которое делает его полезным для проверки приведения типов.

Вы знаете, что Вы не можете вызвать нестатический метод у ссылочной переменной со значением null, это вызовет NullPointerException , но Вы можете не знать, что Вы можете вызвать статический метода у ссылочной переменной со значением null. Т.к. статические методы используют статическое связывание, они не выбрасывают NullPointerException . Вот пример:

Вы можете послать null в качестве параметра метода, принимающего любой ссылочный тип, к примеру:

может быть вызван как

Это нормально с точки зрения компилятора, но дальнейшее поведение полностью зависит от метода. Null-безопасный метод не выбросит NullPointerException , а просто корректно завершится. Если бизнес логика позволяет, рекомендуется писать null-безопасные методы.

Вы можете сравнивать null используя операторы == (равно) и != (не равно), но не можете использовать его с другими арифметическими или логическими операторами, вроде (меньше) или > (больше). В отличии от SQL, в Java null == null вернет true, как показано ниже:

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

Источник

Оцените статью