Статьи

Избегайте исключений нулевого указателя в Java

Null Pointer Exception — самое распространенное и раздражающее исключение в Java. В этом посте я хочу избежать этого нежелательного исключения.

Сначала давайте создадим пример, который вызывает исключение 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

1- Пустая коллекция

Пустая коллекция — это коллекция, в которой нет элементов. Некоторые разработчики возвращают нулевое значение для 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 .