Сначала давайте создадим пример, который вызывает исключение Null Pointer
1
2
3
4
5
6
7
|
private Boolean isFinished(String status) { if (status.equalsIgnoreCase( "Finish" )) { return Boolean.TRUE; } else { return Boolean.FALSE; } } |
В предыдущем методе, если мы передадим значение переменной status как null, это вызовет исключение Null Pointer в строке ниже
1
|
if (status.equalsIgnoreCase( "Finish" )) { |
Поэтому мы должны изменить мой код на код ниже, чтобы избежать исключения Null Pointer
1
2
3
4
5
6
7
|
private Boolean isFinished(String status) { if ( "Finish" .equalsIgnoreCase(status)) { return Boolean.TRUE; } else { return Boolean.FALSE; } } |
В предыдущем методе, если мы указали значение переменной «status» как null, это не вызовет исключения Null Pointer Exception.
Если у вас есть object.equals («literal»), вы должны заменить его на «literal» .equals (object) .
Если у вас есть object.equals (Enum.enumElement), вы должны заменить на
Enum.enumElement.equals (объект).
Вообще, выставьте метод equals объекта, который, как вы уверены, не имеет нулевого значения.
Я буду продолжать предоставлять больше лучших практик и советов.
В части 1 поста я перечислил, как избежать NPE в методе и перечислителе equalsIgnoreCase () , сегодня я напишу о следующих случаях
1- Пустая коллекция
2- Используйте некоторые методы
3- Утвердить ключевое слово
4- Класс утверждения
5- Обработка исключений
6 — Слишком много точечного синтаксиса
7- Класс StringUtils
Пустая коллекция — это коллекция, в которой нет элементов. Некоторые разработчики возвращают нулевое значение для Collection, которая не имеет элементов, но это ложно, вы должны вернуть Collections.EMPTY_LIST, Collections.EMPTY_SET и Collections.EMPTY_MAP.
Неправильный код
1
2
3
4
|
public static List getEmployees() { List list = null ; return list; } |
Правильный код
1
2
3
4
|
public static List getEmployees() { List list = Collections.EMPTY_LIST; return list; } |
2- Используйте какой-то метод
Используйте некоторые методы, чтобы гарантировать, что нулевое значение не существует, например, содержит (), indexOf (), isEmpty (), containsKey (), containsValue () и hasNext ().
пример
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
String myName = "Mahmoud A. El-Sayed" ; List list = Collections.EMPTY_LIST; boolean exist = list.contains(myName); int index = list.indexOf(myName); boolean isEmpty =list.isEmpty(); Map map =Collections.EMPTY_MAP; exist=map.containsKey(myName); exist=map.containsValue(myName); isEmpty=map.isEmpty(); Set set=Collections.EMPTY_SET; exist=set.contains(myName); isEmpty=set.isEmpty(); Iterator iterator; exist = iterator.hasNext(); |
3- Утвердить ключевое слово
assert — это ключевое слово, предоставляемое в Java 1.4, которое позволяет вам проверить свои предположения о коде.
Синтаксис ключевого слова assert
1
|
assert expression1 ; |
expression1 — логическое выражение, которое оценивается, и если оно ложно, система выдаст ошибку AssertionError без подробного сообщения.
1
|
assert expression1 : expression2 ; |
expression1 — логическое выражение, которое оценивается, и если оно ложно, система выдает AssertionError, а подробное сообщение — expression2.
Например, в своем посте я хочу утверждать, что выражение не является нулевым, тогда я должен написать ниже код
1
2
3
4
|
public static String getManager(String employeeId) { assert (employeeId != null ) : "employeeId must be not null" ; return "Mahmoud A. El-Sayed" ; } |
Если я пытаюсь вызвать метод getManager, используя getManager (null);
Это вызовет «java.lang.AssertionError: employeeId должен быть не нулевым»
Обратите внимание на использование -enableassertion в вашем параметре java при запуске кода, чтобы включить подтверждение.
4- Класс утверждения
Класс Assert существует в пакете com.bea.core.repackaged.springframework.util и имеет много методов, используемых в утверждении.
пример
1
2
3
4
5
|
public static String getManager(String employeeId) { Assert.notNull(employeeId, "employeeId must be not null" ); Assert.hasLength(employeeId, "employeeId must has length greater than 0" ); return "Mahmoud A. El-Sayed" ; } |
Если я пытаюсь вызвать метод getManager, используя getManager (null);
Это вызовет «java.lang.IllegalArgumentException: employeeId должен быть не нулевым»
5- Обработка исключений
Я должен позаботиться об обработке исключений, используя оператор try catch или проверку нулевого значения переменных
Например
1
2
3
|
public static String getManager(String employeeId) { return null ; } |
Я буду звонить, используя приведенный ниже код
1
2
|
String managerId = getManager( "A015" ); System.out.println(managerId.toString()); |
Это вызовет «java.lang.NullPointerException» , поэтому для обработки этого исключения я должен использовать try catch или проверку нулевых значений
попробуйте поймать заявление
Я поменяю код вызова на код ниже
1
2
3
4
5
6
|
String managerId = getManager( "A015" ); try { System.out.println(managerId.toString()); } catch (NullPointerException npe) { //write your code here } |
б- проверка нулевых значений
Я поменяю код вызова на код ниже
1
2
3
4
5
6
|
String managerId = getManager( "A015" ); if (managerId != null ) { System.out.println(managerId.toString()); } else { //write your code here } |
6 — Слишком много точечного синтаксиса
Некоторые разработчики используют этот подход, поскольку он пишет меньше кода, но в будущем не будет проще для обслуживания и обработки исключений
Неправильный код
1
|
String attrValue = (String)findViewObject( "VO_NAME" ).getCurrentRow().getAttribute( "Attribute_NAME" ); |
Правильный код
1
2
3
|
ViewObject vo = findViewObject( "VO_NAME" ); Row row = vo.getCurrentRow(); String attrValue = (String)row.getAttribute( "Attribute_NAME" ); |
7- Класс StringUtils
Класс StringUtils является частью пакета org.apache.commons.lang , я могу использовать его, чтобы избежать использования NPE, особенно если все его методы абсолютно безопасны
Например StringUtils. IsEmpty (), StringUtils. IsBlank (), StringUtils.equals () и многое другое.
Вы можете прочитать спецификацию этого класса здесь
Заключение Всегда обращайте внимание на исключение NullPointerException при написании кода и угадывайте, как он будет добавлен в ваш код, и пишите // TODO в своем коде для его решения позже, если у вас нет больше времени.
Ссылка: Избегайте исключений нулевого указателя, часть 1 , Избегайте исключений нулевого указателя, часть 2 от нашего партнера JCG Махмуда А. Эль-Сайеда в блоге Dive in Oracle .