Содержание
Избегайте исключений Null Pointer в Java и Java Советы и лучшие практики, чтобы избежать NullPointerException в Java.
Как Java-разработчик , я уверен, что вы столкнулись с Null Pointer Exception (NPE), начиная с первого дня. В большинстве случаев исключение NPE показывает четкую трассировку стека, которая указывает на основную причину того же, но в случае большого приложения уровня предприятия, в котором у вас есть сотни классов, выяснение реальной первопричины становится кошмаром.
Что такое NPE?
NullPointerException (NPE) это исключение, которое возникает, когда вы пытаетесь использовать ссылку, которая указывает на отсутствие места в памяти (ноль), как если бы оно ссылалось на объект. Вызов метода на null ссылка или попытка получить доступ к полю нулевой ссылки вызовет NPE. Это самая распространенная причина.
Согласно JavaDoc, ниже приведены основные причины возникновения NPE:
- Бросание
nullкак будто это былоThrowableзначение. - Вызов метода экземпляра
nullобъект. - Доступ или изменение поля
nullобъект. - Принимая длину
nullкак будто это был массив. - Доступ или изменение слотов
nullкак будто это был массив.
Теперь реальный вопрос — как избежать java.lang.NullPointerException во время выполнения ? В этом уроке мы рассмотрим несколько примеров, которые создают NPE во время выполнения, и шаги, которые нам нужно выполнить, чтобы решить эту проблему.
Давайте создадим NPE во время выполнения 1-го. Посмотрите на приведенный ниже пример CrunchifyNullPointerExceptionTips.java
Мы создадим NPE 3 разными способами
- NPE будет брошен, если вы пытаетесь получить доступ к нулевому объекту
- NPE будет брошен, если вы пытаетесь конвертировать нулевую строку
- NPE будет брошен, если вы пытаетесь получить доступ к нулевому объекту во время инициализации класса
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
пакет ком . crunchify. учебник ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyNullPointerExceptionTips {
общественности статический недействительным main ( Строка [ ] аргументы ) {
пытаться {
// Пример 1: NPE будет брошен, если вы пытаетесь получить доступ к нулевому объекту
CrunchifyNPE1 ( ) ;
} ловить ( NullPointerException npe1 ) {
Система. вне. println ( «Исключение в CrunchifyNPE1 ()» ) ;
npe1 . printStackTrace ( ) ;
}
пытаться {
// Пример 2: NPE будет брошен, если вы пытаетесь преобразовать пустую строку
CrunchifyNPE2 ( ) ;
} ловить ( NullPointerException npe2 ) {
Система. вне. println ( / nException in CrunchifyNPE2 () ) ;
нпэ2 . printStackTrace ( ) ;
}
пытаться {
// Пример 3: NPE будет брошен, если вы пытаетесь получить доступ к нулевому объекту во время инициализации класса
CrunchifyNPETest NPE знак равно новый CrunchifyNPETest ( ) ;
нп . getName ( ) ;
} ловить ( NullPointerException npe3 ) {
Система. вне. println ( / n Исключение в CrunchifyNPETest () ) ;
npe3 . printStackTrace ( ) ;
}
}
частный статический недействительным CrunchifyNPE1 ( ) {
объект crunchifyObj знак равно ноль ;
crunchifyObj . hashCode ( ) ;
}
частный статический недействительным CrunchifyNPE2 ( ) {
строка crunchifyString ;
crunchifyString знак равно https://crunchify.com ;
// Строка 40 объявляет переменную с именем «crunchifyString», но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип
// Строка
// который является ссылочным типом). Так как вы еще не сказали, что указывать на Java, установите его в null, что означает «я ни на что не указываю».
// В строке 41 ключевое слово new используется для создания экземпляра (или создания) объекта типа String, и переменной-указателю crunchifyString назначается эта
// объект. Теперь вы можете ссылаться на объект с помощью оператора разыменования. (точка).
Система. вне. println ( / nvalue: + crunchifyString . toString ( ) + , длина: + crunchifyString . длина ( ) ) ;
Система. вне. println ( «Нет исключений NPE в строке 51» ) ;
// Теперь давайте создадим NPE
строка crunchifyString2 знак равно ноль ;
Система. вне. println ( crunchifyString2 . toString ( ) ) ;
}
}
учебный класс CrunchifyNPETest {
частный строка crunchifyName ;
общественности недействительным setName ( String имя ) {
это. crunchifyName знак равно имя ;
}
общественности недействительным getName ( ) {
printName ( crunchifyName ) ;
}
частный недействительным printName ( String с ) {
Система. вне. println ( s + ( + с . длина ( ) + ) ) ;
}
}
|
Результат:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Исключение в CrunchifyNPE1 ( )
Java. яз. Исключение нулевого указателя
на ком . crunchify. учебник . CrunchifyNullPointerExceptionTips . CrunchifyNPE1 ( CrunchifyNullPointerExceptionTips . Java : 39 )
на ком . crunchify. учебник . CrunchifyNullPointerExceptionTips . main ( CrunchifyNullPointerExceptionTips . java : 12 )
значение : https : //crunchify.com, длина: 20
Нет исключений NPE на линии 51
Исключение в CrunchifyNPE2 ( )
Java. яз. Исключение нулевого указателя
на ком . crunchify. учебник . CrunchifyNullPointerExceptionTips . CrunchifyNPE2 ( CrunchifyNullPointerExceptionTips . Java : 56 )
на ком . crunchify. учебник . CrunchifyNullPointerExceptionTips . main ( CrunchifyNullPointerExceptionTips . java : 20 )
Исключение в CrunchifyNPETest ( )
Java. яз. Исключение нулевого указателя
на ком . crunchify. учебник . CrunchifyNPETest . printName ( CrunchifyNullPointerExceptionTips . java : 73 )
на ком . crunchify. учебник . CrunchifyNPETest . getName ( CrunchifyNullPointerExceptionTips . java : 69 )
на ком . crunchify. учебник . CrunchifyNullPointerExceptionTips . main ( CrunchifyNullPointerExceptionTips . java : 29 )
|
Ну, есть несколько советов и приемов, которые мы могли бы использовать, чтобы избежать исключения NullPointerException во время выполнения . Давайте взглянем.
Подсказка 1:
Eclipse / IntelliJ IDE попытается показать NPE в рабочей области. Исправляйте свой код только во время разработки .
Подсказка 2:
добавлять crunchifyIsNullorEmpty() проверить перед операцией на объекте. Добавьте это к CrunchifyNullPointerExceptionTips.java
|
1
2
3
4
5
6
7
8
|
общественности статический логический crunchifyIsNullOrEmpty ( String crunchifyStr ) {
если ( crunchifyStr == ноль )
вернуть правда ;
еще если ( crunchifyStr . trim ( ) . equals ( ) )
вернуть правда ;
еще
вернуть ложь ;
}
|
В приведенной выше строке программы Java 55 и 56 будут заменены этим.
|
1
2
3
4
5
6
|
строка crunchifyString2 знак равно ноль ;
если ( ! crunchifyIsNullOrEmpty ( crunchifyString2 ) ) {
Система. вне. println ( crunchifyString2 . toString ( ) ) ;
} еще {
Система. вне. println ( crunchifyString2 is null ) ;
}
|
Подсказка 3:
Проверьте, является ли строка null пустого после trim() операция.
|
1
2
3
|
общественности статический логический isNullOrEmptyAfterTrim ( String crunchifyStr ) {
вернуть ( crunchifyStr == ноль | | crunchifyStr . отделка ( ) . длина ( ) == 0 ) ;
}
|
Подсказка 4:
Всегда используйте Try Catch block для того, чтобы предотвратить непрерывный процесс выполнения .
|
1
2
3
4
5
|
пытаться {
CrunchifyNPE1 ( ) ;
} ловить ( NullPointerException npe ) {
Система. вне. println ( «Исключение в CrunchifyNPE1 ()» + нпэ ) ;
}
|
Подсказка 5:
Collections.emptyList() предпочтительнее из-за лучшей обработки дженериков.
Подсказка 6:
использование Java Assertions
Утверждение — это утверждение, которое позволяет вам проверить ваши предположения о вашем коде. Например, если вы напишите метод, который возвращает имя в системе, вы можете утверждать, что возвращающий otherName, если String равен нулю. Основное использование утверждений будет:
|
1
2
3
4
5
6
7
8
|
утверждать < Выражение > ; // или другое использование
утверждать < Expression1 > : < Expression2 > ;
// в нашей программе добавьте строку ниже.
частный недействительным printName ( String с ) {
утверждать ( с ! знак равно ноль ) : «Имя должно быть не нулевым» ;
Система. вне. println ( s + ( + с . длина ( ) + ) ) ;
}
|
Но есть одна загвоздка: Assertion недоступна в производственной среде, и мы не должны использовать Assertion с какой-либо бизнес-логикой.
Подсказка 7:
Попробуй использовать containsKey() , containsValue() , contains() чеки.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
пакет ком . crunchify. учебник ;
Импортировать Java. Util. * ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyContainsKeyExample {
общественности статический недействительным главная ( Строка args [ ] ) {
HashMap < Integer , Строка > crunchifyMap знак равно новый HashMap < Integer , Строка > ( ) ;
// заполнить хеш-карту
crunchifyMap . положить ( 1 , Хруст ) ;
crunchifyMap . положить ( 2 , WordPress ) ;
crunchifyMap . положить ( 3 , Java-учебники ) ;
// проверяем наличие ключа 4
если ( crunchifyMap . containsKey ( 4 ) ) {
Система. вне. println ( «Проверьте, существует ли ключ 2:» + crunchifyMap . получить ( 4 ) ) ;
} еще {
Система. вне. println ( «NPE для значения 4 избегается» ) ;
}
}
}
|
Подсказка 8:
В заключение, всегда полезно позаботиться о NPE во время разработки, а не отлаживать в процессе производства. Есть ряд других советов и приемов, доступных с помощью Spring Framework Annotation , Factory Pattern , Null Object Pattern и т.д. Но я сейчас прерву это.
Появится новый урок, вероятно, через неделю по этому. Оставайтесь в курсе. Если вы хотите что-то добавить к этому уроку ИЛИ обнаружили проблему, пожалуйста, сообщите об этом и оставьте свои комментарии.
0.00 (0%) 0 votes







