what is nullpointerexception java how avoid it
Този урок ще обясни всичко за NullPointerException в Java. Ще обсъдим причините за изключението от нулевия указател и начините да го избегнем:
NullPointerException в Java е изключение по време на изпълнение. Java присвоява специална нулева стойност на препратка към обект. Когато програма се опитва да използва препратка към обект, зададена на нулева стойност, това изключение се изхвърля.
=> Внимавайте тук за простия сериал за обучение на Java.
Какво ще научите:
NullPointerException В Java
Ако препратка към обект с нулева стойност изхвърля NullPointerException, тогава защо се нуждаем от нулева стойност?
Нулевата стойност обикновено се използва, за да покаже, че не е присвоена стойност на референтна променлива. На второ място, ние се нуждаем от нулеви стойности за колекции като свързани списъци и дървета, за да посочим нулеви възли. Моделите на дизайна като единични модели използват нулеви стойности.
В заключение, нулевата стойност в Java има много приложения. Null Pointer Exception се изхвърля в специфични сценарии в Java.
Някои от сценариите са както следва:
- Метод, извикан с помощта на нулев обект.
- Достъп или промяна на поле или член от данни на нулевия обект.
- Предаване на нулев обект като аргумент на метод.
- Изчисляване на дължината на нулев масив.
- Достъп до индекс на нулев масив.
- Синхронизиране на нулев обект.
- Хвърляне на нулев обект.
Null Pointer Exception се простира от класа RuntimeException.
Йерархията на NullPointerException е дадена по-долу.
Както е показано в горната йерархия, Null Pointer Exception се простира от RuntimeException, който наследява класа на изключението. Класът на изключения от своя страна се извлича от класа Throwable, който е подклас на Object.
Причини за появата на java.lang.NullPointerException
Сега ще демонстрираме всеки от сценариите за възникване на NullPointerException, които изброихме по-горе.
# 1) Методът се извиква с помощта на нулев обект
Обмислете следния пример за код. Тук имаме клас MyClass, който предоставя два метода. Първият метод ‘initT’ връща нулев обект. В основния метод създаваме обект на MyClass с извикване на метода initT.
След това извикваме метода за печат на MyClass. Тук се хвърля java.lang.NullPointerException, тъй като извикваме метода на печат, използвайки нулев обект.
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 } }
Изход
безплатен блокиращ прозорец за Google Chrome
Това е друга причина за NullPointerException. Тук се опитваме да получим достъп до член на клас, използвайки нулев обект. Присвояваме връщаната стойност на метода initT на обекта t и след това осъществяваме достъп до numField с помощта на обект t. Но обектът t е нулев обект, тъй като initT връща нулев обект. В този момент се издига java.lang.NullPointerException.
# 3) Предаване на нулев обект като аргумент
Това е честата причина за появата на java.lang.NullPointerException. Помислете за следната програма Java. Тук имаме метод ‘print_LowerCase’, който преобразува обекта String, предаден като аргумент, в малка буква.
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 } }
Изход
В основния метод извикваме този метод и предаваме null като аргумент. Тъй като обектът String не може да бъде нула, java.lang.NullPointerException се хвърля.
# 4) Получаване на дължината на нулев масив
Опитът за изчисляване на дължината на нулев масив също води до изхвърляне на java.lang.NullPointerException.
Програмата по-долу демонстрира това.
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 } }
Изход
В горната програма декларираме масив и му присвояваме null, т.е. няма данни. Когато използваме свойството дължина на този нулев масив, се изхвърля NullPointerException.
# 5) Индекс за достъп на нулев масив
Подобно на дължината, дори ако се опитаме да получим достъп до стойност в нулев масив с помощта на индекс, това е причината за java.lang.NullPointerException.
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) Синхронизация на нулев обект
Обикновено синхронизираме блок или метод, за да улесним едновременния достъп. Препратката към обект, която използваме за синхронизация, обаче не трябва да е нула. Ако това е нулев обект, това води до java.lang.NullPointerException.
Долната програма Java демонстрира това. Както виждаме, имаме String обект ‘mutex’, инициализиран до null. След това в основната функция използваме синхронизиран блок с мютекс като препратка към обекта. Тъй като mutex е нула, java.lang.NullPointerException се издига.
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) Чрез хвърляне на null
public class Main { public static void main(String[] args) { throw null; //throw null } }
Изход:
В горната примерна програма, вместо да хвърля валиден обект, се изхвърля null. Това води до Null Pointer Exception.
Избягване на изключение от нулев указател
След като видяхме причините за появата на NullPointerException, трябва да се опитаме да го избегнем и в нашата програма.
Първо, трябва да гарантираме, че обектите, които използваме в нашите програми, се инициализират правилно, за да можем да избегнем използването на нулеви обекти, които водят до Null Pointer Exception. Също така трябва да се погрижим референтните променливи, използвани в програмата, да са насочени към валидни стойности и да не получават случайно нулеви стойности.
Освен тези съображения, ние също можем да проявяваме повече внимание за всеки отделен случай, за да избегнем java.lang.NullPointerException.
По-долу разглеждаме няколко случая.
# 1) Сравнение на низове с литерали
Сравнението между низовата променлива и литерала (действителната стойност или елемент на преброяването) е много често срещана операция в Java програмите. Но ако променливата String, която е обект, е нула, тогава сравняването на този нулев обект с литерали ще хвърли NullPointerException.
Така че решението е да се извика методът за сравнение от литерала вместо обекта String, който може да бъде нулев.
Следващата програма показва как можем да извикаме методи за сравнение от литерали и да избегнем java.lang.NullPointerException.
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) Пазете проверка на аргументите на даден метод
Проверете аргументите на метода, за да се уверите, че те не са нулеви стойности. Ако аргументите не са според спецификацията, тогава кодът ще изхвърли IllegalArgumentException, за да покаже, че аргументите не са както се очаква.
Това е показано в долната програма Java.
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) Използване на тернарен оператор, за да се грижи за нулевите стойности
Можем да използваме тройния оператор, за да избегнем java.lang.NullPointerException. Троичният оператор има три оператора. Първият е булев израз, който оценява на true или false. Ако изразът е истина, тогава се връща вторият оператор или третият оператор.
Следващата програма показва използването на тернарен оператор, за да се избегне NullPointerException.
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) Как да поправя NullPointerException в Java?
Отговор: Трябва да гарантираме, че всички обекти, използвани в програмата, се инициализират правилно и нямат нулеви стойности. Също така референтните променливи не трябва да имат нулеви стойности.
# 2) Проверено ли е или е отметнато NullPointerException?
Отговор: NullPointerException не е проверено изключение. Той е потомък на RuntimeException и не е отметнат.
# 3) Как да спра NullPointerException?
Отговор: Някои от най-добрите практики за избягване на NullPointerException са:
- Използвайте метода equals () и equalsIgnoreCase () с Stral literal, вместо да го използвате върху неизвестния обект, който може да бъде нулев.
- Използвайте valueOf () вместо toString (); и двете връщат един и същ резултат.
- Използвайте Java анотация @NotNull и @Nullable.
# 4) Каква е нулевата стойност в Java?
Отговор: Нулевата стойност не се отнася до обект или променлива. Това е ключова дума и буквал. Той представлява нулева препратка.
# 5) Можем ли да хванем NullPointerException в Java?
Отговор: Изключението java.lang.NullPointerException е непроверено изключение и разширява класа RuntimeException. Следователно няма принуда програмистът да го хване.
Заключение
В този урок обсъдихме NullPointerException в Java. Това е доста опасно изключение и обикновено може да се появи, когато най-малко го очакваме. Null Pointer Exception се появява най-вече поради нулевия обект или нулевата препратка. Вече видяхме причините и начините за избягване на NullPointerException.
Доколкото е възможно, програмистът трябва да се опита да избегне появата на Null Pointer Exception в програма. Тъй като това е непроверено изключение по време на изпълнение, трябва да видим, че то не се появява, когато приложението работи.
=> Посетете тук, за да научите Java от нулата.
Препоръчително четене
- Изключения на Java и обработка на изключения с примери
- Как да се справя с ArrayIndexOutOfBoundsException в Java?
- C # Урок за обработка на изключения с примери за кодове
- Пълно ръководство за PL SQL обработка на изключения с примери
- Как да се справя с изключенията в скриптове Groap на SoapUI - Урок № 11 за SoapUI
- Python Try Except - Python обработва изключение с примери
- Обработка на изключения JDBC - Как да се справя с SQL изключенията
- Обработка на изключения в C ++