what is nullpointerexception java how avoid it
Цей посібник пояснить все про NullPointerException у Java. Ми обговоримо причини винятку нульового вказівника та способи його уникнення:
NullPointerException у Java є винятком для виконання. Java призначає спеціальне нульове значення посилання на об'єкт. Коли програма намагається використати посилання на об'єкт, встановлене на нульове значення, тоді цей виняток видається.
=> Зверніть увагу на прості навчальні серії Java тут.
Що ви дізнаєтесь:
NullPointerException в Java
Якщо посилання на об'єкт із нульовим значенням викидає NullPointerException, тоді навіщо нам нульове значення?
Нульове значення зазвичай використовується для позначення того, що посилальній змінній не було призначено значення. По-друге, нам потрібні нульові значення для колекцій, таких як зв’язані списки та дерева, щоб вказати нульові вузли. Шаблони дизайну, як одиночні, використовують нульові значення.
На закінчення слід сказати, що нульове значення в Java має багато застосувань. Виняток Null Pointer створюється у певних сценаріях Java.
Деякі з таких сценаріїв:
- Метод, викликаний за допомогою нульового об'єкта.
- Доступ або зміна поля або члена даних нульового об'єкта.
- Передача нульового об'єкта як аргументу методу.
- Обчислення довжини нульового масиву.
- Доступ до індексу нульового масиву.
- Синхронізація нульового об’єкта.
- Кидання нульового об'єкта.
Виняток Null Pointer поширюється на клас RuntimeException.
Ієрархія NullPointerException наведена нижче.

Як показано у наведеній вище ієрархії, виняток Null Pointer поширюється на RuntimeException, який успадковує клас винятків. Клас винятків, у свою чергу, походить від класу Throwable, який є підкласом Object.
Причини виникнення java.lang.NullPointerException
Тепер ми продемонструємо кожен із сценаріїв появи NullPointerException, які ми перерахували вище.
# 1) Метод викликається за допомогою нульового об'єкта
Розглянемо наступний приклад коду. Тут ми маємо клас MyClass, який надає два методи. Перший метод ‘initT’ повертає нульовий об’єкт. В основному методі ми створюємо об'єкт MyClass із викликом методу initT.
Далі ми називаємо метод друку MyClass. Тут викидається java.lang.NullPointerException, оскільки ми викликаємо метод print за допомогою нульового об'єкта.
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 } }Вихідні дані

як розпочати проект в затемненні
Це ще одна причина 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, тобто відсутність даних. Коли ми використовуємо властивість length для цього нульового масиву, викидається 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’, ініціалізований нулем. Тоді в основній функції ми використовуємо синхронізований блок з mutex як посилання на об’єкт. Оскільки 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) Кидаючи нуль
public class Main { public static void main(String() args) { throw null; //throw null } }Вихід:

У наведеному вище прикладі програми замість викидання дійсного об'єкта викидається null. Це призводить до винятку Null Pointer.
Уникнення винятку з нульовим покажчиком
Тепер, коли ми побачили причини виникнення NullPointerException, ми також повинні спробувати уникнути цього в нашій програмі.
По-перше, ми повинні переконатися, що об’єкти, які ми використовуємо в наших програмах, ініціалізовані належним чином, щоб ми могли уникнути використання нульових об’єктів, що призводять до винятку Null Pointer. Ми також повинні подбати про те, щоб посилальні змінні, що використовуються в програмі, вказували на допустимі значення і не випадково отримували нульові значення.
Окрім цих міркувань, ми також можемо проявляти більше обережності в кожному конкретному випадку, щоб уникнути 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); } Вихідні дані

Часті запитання
Q # 1) Як виправити NullPointerException у Java?
Відповідь: Ми повинні переконатися, що всі об’єкти, що використовуються в програмі, ініціалізовані належним чином і вони не мають нульових значень. Крім того, посилальні змінні не повинні мати нульових значень.
# 2) Чи встановлено або вимкнено NullPointerException?
Відповідь: NullPointerException не є перевіреним винятком. Це нащадок RuntimeException і не позначений.
# 3) Як зупинити NullPointerException?
Відповідь: Деякі з найкращих практик уникнення NullPointerException:
- Використовуйте метод equals () та equalsIgnoreCase () із літералом String, замість того, щоб використовувати його на невідомому об'єкті, який може бути нульовим.
- Використовуйте valueOf () замість toString (); і обидва повертають однаковий результат.
- Використовуйте анотацію Java @NotNull та @Nullable.
# 4) Що таке нульове значення в Java?
Відповідь: Нульове значення не стосується жодного об’єкта чи змінної. Це ключове слово та літерал. Він являє собою нульове посилання.
# 5) Чи можемо ми зловити NullPointerException в Java?
Відповідь: Виняток java.lang.NullPointerException є неперевіреним винятком і поширює клас RuntimeException. Отже, програміст не зобов’язаний його ловити.
Висновок
У цьому підручнику ми обговорили NullPointerException у Java. Це досить небезпечний виняток і зазвичай може з’явитися тоді, коли ми цього найменше очікуємо. Виняток нульового вказівника здебільшого відбувається через нульовий об'єкт або нульове посилання. Ми вже бачили причини та способи уникнення NullPointerException.
Наскільки це можливо, програміст повинен намагатися уникати виникнення винятків Null Pointer у програмі. Оскільки це неперевірений виняток виконання, ми повинні бачити, що він не виникає під час запуску програми.
=> Завітайте сюди, щоб вивчити Java з нуля.
Рекомендована література
- Винятки Java та обробка винятків з прикладами
- Як обробляти ArrayIndexOutOfBoundsException у Java?
- Підручник з обробки винятків C # із прикладами коду
- Повне керівництво по обробці винятків PL SQL з прикладами
- Як обробляти винятки у скриптах Groovy SoapUI - Підручник No11 з SoapUI
- Python Try Except - обробка винятків Python на прикладах
- Обробка винятків JDBC - Як обробляти винятки SQL
- Обробка винятків у C ++