Изузетак Нулл Поинтер у Јави
НуллПоинтерЕкцептион у Јави је РунтимеЕкцептион. Јавља се када програм покуша да користи референцу објекта која има нулту вредност. У Јави 'нулл' је посебна вредност која се може доделити референцама на објекте како би се указало на одсуство вредности.
Разлози за изузетак Нулл Поинтер
НуллПоинтерЕкцептион се јавља из следећих разлога:
- Позивање методе из нултог објекта.
- Приступ или измена поља нултог објекта.
- Узимање дужине нуле као да је низ.
- Приступ или модификовање утора нултих објеката као да је низ.
- Бацање нуле као да је вредност која се може бацати.
- Када покушате да извршите синхронизацију преко нултог објекта.
Пример:
Java public class Geeks { public static void main ( String [] args ) { // Reference set to null String s = null ; System . out . println ( s . length ()); } }
Излаз:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)Објашњење: У овом примеру референца на стринг 'с' је нула. Када програм покуша да позове методу ленгтх(), он избацује НуллПоинтерЕкцептион јер не постоји стварни објекат.
Зашто се нулл користи у Јави?
Нулл вредност служи као чувар места и означава да референтној променљивој није додељена ниједна вредност. Уобичајене апликације укључују:
- Повезане структуре података : Представља крај листе или гране стабла.
- Десигн Паттернс : Ово се користи у обрасцима као што су Нулл Објецт Паттерн или Синглетон Паттерн.
Како избећи НуллПоинтерЕкцептион
Да бисмо избегли НуллПоинтерЕкцептион, морамо да обезбедимо да су сви објекти правилно иницијализовани пре него што их употребимо. Када декларишемо референтну променљиву, морамо да проверимо да објекат није нулл пре него што затражимо метод или поље од објеката.
1. Коришћење стринг литерала у екуалс()
Веома чест проблем случаја укључује поређење између стринг променљиве и литерала. Литерал може бити стринг или елемент енума. Уместо позивања методе из нултог објекта, размислите о томе да га позовете из литерала.
Пример:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // Initializing String variable with null value String s = null ; // Checking if s.equals null try { // This line of code throws NullPointerException because s is null if ( s . equals ( 'gfg' )) System . out . print ( 'Same' ); else System . out . print ( 'Not Same' ); } catch ( NullPointerException e ) { System . out . print ( 'NullPointerException Caught' ); } } }
Излаз
NullPointerException Caught
НуллПоинтерЕкцептион можемо избећи позивањем једнаких на литерал, а не на објекат.
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // Initializing String variable with null value String s = null ; // Checking if s is null using try catch try { if ( 'gfg' . equals ( s )) System . out . print ( 'Same' ); else System . out . print ( 'Not Same' ); } catch ( NullPointerException e ) { System . out . print ( 'Caught NullPointerException' ); } } }
Излаз
Not Same
Напомена : Увек позовите једнакости на литерал да бисте избегли позивање методе на нултој референци.
2. Провера аргумената методе
Пре извршавања тела нове методе прво треба да проверимо њене аргументе за нулте вредности и да наставимо са извршавањем методе само када су аргументи исправно проверени. У супротном ће бацити изузетак ИллегалАргументЕкцептион и обавестити метод који позива да нешто није у реду са прослеђеним аргументима.
Пример:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // String s set an empty string and calling getLength() String s = '' ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } // String s set to a value and calling getLength() s = 'GeeksforGeeks' ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } // Setting s as null and calling getLength() s = null ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } } public static int getLength ( String s ) { if ( s == null ) throw new IllegalArgumentException ( 'The argument cannot be null' ); return s . length (); } }
Излаз
0 13 IllegalArgumentException caught
3. Користите тернарни оператор
Тернарни оператор се може користити за избегавање НуллПоинтерЕкцептион. Прво се процењује Булов израз. Ако је израз тачан онда се враћа вредност1, иначе се враћа вредност2. Можемо користити тернарни оператор за руковање нултим показивачима.
Пример:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { String s = null ; String m = ( s == null ) ? '' : s . substring ( 0 5 ); System . out . println ( m ); s = 'Geeksforgeeks' ; m = ( s == null ) ? '' : s . substring ( 0 5 ); System . out . println ( m ); } }
Излаз
Geeks
Објашњење : Тернарни оператор помаже у провери нулте и избегавању операција на нултим референцама.
4. Коришћење опционе класе (Јава 8+)
У Јави 8 Опциона класа је уведена као контејнерски објекат који може, али и не мора да садржи вредност која није нулта. Помаже у избегавању НуллПоинтерЕкцептион присиљавањем да се експлицитно рукује случајем када је вредност одсутна.
Пример:
Java import java.util.Optional ; public class OptionalExample { public static void main ( String [] args ) { Optional < String > name = Optional . ofNullable ( null ); // Safe way to access System . out . println ( name . orElse ( 'Default Name' )); // prints: Default Name } }
Излаз
Default Name
Објашњење: Опционално.офНуллабле(валуе) обавија вредност која може бити нулл. орЕлсе() обезбеђује резервни део ако вредност није присутна.