what is nullpointerexception java how avoid it
Овај водич ће објаснити све о НуллПоинтерЕкцептион у Јави. Разговараћемо о узроцима изузетка од нулл показивача и начинима како то избећи:
НуллПоинтерЕкцептион у Јави је рунтиме изузетак. Јава додељује посебну нулл вредност референци објекта. Када програм покуша да користи референцу објекта постављену на нулл вредност, тада се овај изузетак баца.
=> Овде припазите на једноставну серију Јава тренинга.
Шта ћете научити:
НуллПоинтерЕкцептион у Јави
Ако референца на објекат са нулл вредношћу баца НуллПоинтерЕкцептион, зашто нам онда треба нулл вредност?
Нулл вредност се обично користи да означи да референтној променљивој није додељена вредност. Друго, потребне су нам нуле вредности за колекције попут повезаних листа и стабала како би се назначиле нул-чворови. Узорци дизајна попут једнобојних узорака користе нулл вредности.
Да закључимо, нулл вредност у Јави има много примена. Нулл Поинтер Екцептион се баца у одређеним сценаријима на Јави.
Неки од сценарија су сљедећи:
- Метода која се позива помоћу нулл објекта.
- Приступање или измена поља или члана података нултог објекта.
- Прослеђивање нулл објекта као аргумента методе.
- Израчунавање дужине нултог низа.
- Приступ индексу нултог низа.
- Синхронизација нултог објекта.
- Бацање нултих предмета.
Изузетак Нулл Поинтер се протеже од класе РунтимеЕкцептион.
Хијерархија НуллПоинтерЕкцептион је дата у наставку.
Као што је приказано у горњој хијерархији, изузетак нулл показивача протеже се од РунтимеЕкцептион који наслеђује класу Екцептион. Класа изузетака је заузврат изведена из класе Тхровабле која је подкласа објекта.
Узроци појављивања јава.ланг.НуллПоинтерЕкцептион
Сада ћемо показати сваки од сценарија појаве НуллПоинтерЕкцептион који смо горе навели.
# 1) Метода се позива помоћу нулл објекта
Размотрите следећи пример кода. Овде имамо класу МиЦласс која пружа две методе. Прва метода „инитТ“ враћа нулл објекат. У главној методи креирамо објекат МиЦласс позивом на инитТ методу.
Даље, називамо методу штампања МиЦласс. Овде се баца јава.ланг.НуллПоинтерЕкцептион док позивамо методу штампања помоћу нулл објекта.
class MyClass { public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) t.print('Hello, World!'); //invoke method using null object } }
Оутпут
# 2) Приступно поље нултог објекта
class MyClass { int numField = 100; public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) int num = t.numField; //access MyClass member using null object } }
Оутпут
Питања и одговори за интервјуе за старије програмере
Ово је још један узрок НуллПоинтерЕкцептион. Овде покушавамо да приступимо члану класе помоћу нулл објекта. Објекту т додељујемо повратну вредност методе инитТ, а затим приступимо нумФиелду користећи објекат т. Али објекат т је нулти објект јер инитТ враћа нулти објекат. У овом тренутку је покренут јава.ланг.НуллПоинтерЕкцептион.
# 3) Прослеђивање нултог објекта као аргумента
Ово је уобичајени узрок појаве јава.ланг.НуллПоинтерЕкцептион. Размотрите следећи Јава програм. Овде имамо методу ‘принт_ЛоверЦасе’ која конвертује објект Стринг прослеђен као аргумент у мало слово.
public class Main { public static void print_LowerCase(String s) { System.out.println(s.toLowerCase()); } public static void main(String() args) { print_LowerCase(null); //pass null object as argument to the method } }
Оутпут
У главној методи позивамо ову методу и као аргумент прослеђујемо нулу. Како објект Стринг не може бити нулл, баца се јава.ланг.НуллПоинтерЕкцептион.
# 4) Добијање дужине нултог низа
Покушај израчунавања дужине нулл низа такође резултира бацањем јава.ланг.НуллПоинтерЕкцептион.
Програм у наставку то показује.
public class Main { public static void main(String() args) { int() dataArray = null; //Array is null; no data System.out.println('Array Length:' + dataArray.length); //print array length } }
Оутпут
У горњем програму декларишемо низ и додељујемо му нулу, тј. Нема података. Када користимо својство ленгтх на овом нулл низу, баца се НуллПоинтерЕкцептион.
# 5) Индекс приступа нултог низа
Слично дужини, чак и ако покушавамо да приступимо вредности у нул-низу помоћу индекса, то је узрок јава.ланг.НуллПоинтерЕкцептион.
public class Main { public static void main(String() args) { int() dataArray = null; //Array set to null //access value at index 2 System.out.println('Value at index 2:' + dataArray(2)); } }
Оутпут
У горњем програму покушавамо да приступимо вредности у индексу 2 нултог низа.
# 6) Синхронизација на нулл објекту
Обично синхронизујемо блок или методу како бисмо олакшали истовремени приступ. Међутим, референца објекта коју користимо за синхронизацију не би требало да буде нула. Ако је то нулл објекат, онда резултира јава.ланг.НуллПоинтерЕкцептион.
То показује доњи Јава програм. Као што видимо, имамо Стринг објект ‘мутек’ иницијализован за нулу. Тада у главној функцији користимо синхронизовани блок са мутексом као референцом објекта. Како је мутек нулл, подиже се јава.ланг.НуллПоинтерЕкцептион.
public class Main { public static String mutex = null; //mutex variable set to null public static void main(String() args) { synchronized(mutex) { //synchronized block for null mutex System.out.println('synchronized block'); } } }
Оутпут
# 7) Бацањем нулл
public class Main { public static void main(String() args) { throw null; //throw null } }
Излаз:
У горњем примеру програма, уместо да се баци важећи објекат, баца се нулл. Ово резултира изузећем Нулл Поинтер.
Избегавање изузетака нулл показивача
Сад кад смо видели узроке појаве НуллПоинтерЕкцептион, такође морамо да покушамо да је избегнемо у нашем програму.
Прво, морамо осигурати да се објекти које користимо у нашим програмима правилно иницијализују како бисмо могли да избегнемо употребу нултих објеката који резултирају Нулл Поинтер Екцептион-ом. Такође треба водити рачуна да референтне променљиве коришћене у програму буду усмерене на важеће вредности и да случајно не добијају нулл вредности.
Поред ових разматрања, такође можемо бити опрезнији од случаја до случаја како бисмо избегли јава.ланг.НуллПоинтерЕкцептион.
У наставку разматрамо неколико случајева.
# 1) Поређење низа са литералима
Поређење између променљиве низа и литерала (стварна вредност или елемент набрајања) врло је честа операција у Јава програмима. Али ако је променљива Стринг која је објекат нулл, упоређивање овог нултог објекта са литералима бациће НуллПоинтерЕкцептион.
Дакле, решење је позвати методу поређења из литерала уместо Стринг објекта који може бити нулл.
Следећи програм показује како можемо позвати методе упоређивања из литерала и избећи јава.ланг.НуллПоинтерЕкцептион.
class Main { public static void main (String() args) { // String set to null String myStr = null; // Checking if myStr is null using try catch. try { if ('Hello'.equals(myStr)) //use equals method with literal System.out.print('Two strings are same'); else System.out.print('Strings are not equal'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
Оутпут
# 2) Обавежите аргументе неке методе
Проверите аргументе методе како бисте се уверили да нису нулл вредности. Ако аргументи нису у складу са спецификацијом, тада ће код избацити ИллегалАргументЕкцептион да укаже да аргументи нису онакви какви се очекују.
Ово је приказано у доњем Јава програму.
import java.io.*; class Main { public static void main (String() args) { // set String to empty value String myStr = ''; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to a proper value and call getLength myStr = 'Far from home'; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to null and call getLength() myStr = null; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } } // Method that returns length of the String public static int getLength(String myStr) { if (myStr == null) //throw Exception if String is null throw new IllegalArgumentException('The String argument cannot be null'); return myStr.length(); } }
Оутпут
# 3) Употреба Тернарног оператора за бригу о нулл вредностима
Можемо користити тернарни оператор да бисмо избегли јава.ланг.НуллПоинтерЕкцептион. Тернарни оператер има три оператора. Први је логички израз који вреднује тачно или нетачно. Ако је израз тачан, тада се враћа други оператор или трећи оператор.
Следећи програм приказује употребу тернарног оператора да би се избегло НуллПоинтерЕкцептион.
import java.io.*; class Main { public static void main (String() args) { // Initialize String with null value String myStr = null; //return a substring for this String using ternary oprator String myVal = (myStr == null) ? '' : myStr.substring(0,5); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); // Now set a value for String myStr = 'SoftwareTestingHelp'; //return a substring for this String using ternary oprator myVal = (myStr == null) ? '' : myStr.substring(0,8); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); }
Оутпут
Често постављана питања
П # 1) Како да поправим НуллПоинтерЕкцептион у Јави?
Одговор: Морамо осигурати да су сви објекти кориштени у програму правилно иницијализирани и да немају нулл вриједности. Такође, референтне променљиве не би требало да имају нулл вредности.
# 2) Да ли је НуллПоинтерЕкцептион означен или није?
Одговор: НуллПоинтерЕкцептион није проверени изузетак. Потомак је РунтимеЕкцептион и није означен.
# 3) Како да зауставим НуллПоинтерЕкцептион?
Одговор: Неке од најбољих пракси за избегавање НуллПоинтерЕкцептион су:
- Користите методе екуалс () и екуалсИгнореЦасе () са Стринг литерал-ом, уместо да га користите на непознатом објекту који може бити нулл.
- Користите валуеОф () уместо тоСтринг (); и оба враћају исти резултат.
- Користите Јава напомене @НотНулл и @Нуллабле.
# 4) Која је нулл вредност у Јави?
Одговор: Нулл вредност се не односи на било који објекат или променљиву. То је кључна реч и дословно. Представља нулу референцу.
# 5) Можемо ли ухватити НуллПоинтерЕкцептион у Јави?
Одговор: Изузетак јава.ланг.НуллПоинтерЕкцептион је непроверени изузетак и проширује класу РунтимеЕкцептион. Стога програмер не мора да је присили.
Закључак
У овом упутству смо разговарали о НуллПоинтерЕкцептион у Јави. Ово је прилично опасан изузетак и обично се може појавити када се најмање надамо. Изузетак нулл показивача углавном се јавља због нултог објекта или нулл референце. Већ смо видели узроке и начине за избегавање НуллПоинтерЕкцептион.
Што је више могуће, програмер треба да покуша да избегне појаву Нулл Поинтер Екцептион у програму. Будући да је ово непроверени изузетак током извршавања, требало би да видимо да се то не дешава када апликација ради.
=> Посетите овде да бисте научили Јаву из нуле.
Препоручено читање
- Јава изузеци и руковање изузецима са примерима
- Како поступати са АрраиИндекОутОфБоундсЕкцептион у Јави?
- Водич за руковање изузецима за Ц # са примерима кода
- Комплетан водич за руковање изузецима ПЛ СКЛ-а са примерима
- Како се рукује изузетком у СоапУИ Гроови скриптама - Водич за СоапУИ бр. 11
- Питхон Три Екцепт - Питхон рукује изузетком са примерима
- Руковање изузецима ЈДБЦ - Како се рукује СКЛ изузецима
- Руковање изузецима у Ц ++