what is nullpointerexception java how avoid it
이 튜토리얼은 Java의 NullPointerException에 대한 모든 것을 설명합니다. Null 포인터 예외의 원인과이를 방지하는 방법에 대해 설명합니다.
Java의 NullPointerException은 런타임 예외입니다. Java는 개체 참조에 특별한 null 값을 할당합니다. 프로그램이 null 값으로 설정된 개체 참조를 사용하려고하면이 예외가 throw됩니다.
학습 내용 :
Java의 NullPointerException
null 값이있는 개체 참조가 NullPointerException을 throw하면 왜 null 값이 필요한가요?
널값은 일반적으로 참조 변수에 값이 지정되지 않았 음을 나타내는 데 사용됩니다. 둘째, 연결 목록 및 트리와 같은 컬렉션에 대해 null 노드를 나타 내기 위해 null 값이 필요합니다. 싱글 톤 패턴과 같은 디자인 패턴은 null 값을 사용합니다.
결론적으로 Java의 null 값은 많은 용도로 사용됩니다. Java의 특정 시나리오에서 널 포인터 예외가 발생합니다.
일부 시나리오는 다음과 같습니다.
- null 개체를 사용하여 호출 된 메서드입니다.
- null 개체의 필드 또는 데이터 멤버 액세스 또는 수정.
- 메서드에 대한 인수로 null 개체를 전달합니다.
- 널 배열의 길이 계산.
- 널 배열의 인덱스에 액세스합니다.
- null 개체를 동기화합니다.
- null 개체 던지기.
Null 포인터 예외는 RuntimeException 클래스에서 확장됩니다.
NullPointerException의 계층 구조는 다음과 같습니다.
위의 계층 구조에서 볼 수 있듯이 Null Pointer Exception은 Exception 클래스를 상속하는 RuntimeException에서 확장됩니다. 예외 클래스는 Object의 하위 클래스 인 Throwable 클래스에서 파생됩니다.
java.lang.NullPointerException 발생 원인
이제 위에 나열된 NullPointerException 발생의 각 시나리오를 설명합니다.
# 1) 메서드는 null 개체를 사용하여 호출됩니다.
다음 코드 예제를 고려하십시오. 여기에 두 가지 메서드를 제공하는 MyClass라는 클래스가 있습니다. 첫 번째 메소드 'initT'는 null 객체를 반환합니다. 메인 메소드에서 initT 메소드를 호출하여 MyClass의 객체를 생성합니다.
다음으로 MyClass의 print 메소드를 호출합니다. 여기서는 null 객체를 사용하여 print 메소드를 호출 할 때 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 } }
산출
char에서 int로 변환 C ++
이것은 NullPointerException의 또 다른 원인입니다. 여기서는 null 객체를 사용하여 클래스 멤버에 액세스하려고합니다. initT 메서드의 반환 값을 개체 t에 할당 한 다음 개체 t를 사용하여 numField에 액세스합니다. 그러나 initT가 널 객체를 반환하므로 객체 t는 널 객체입니다. 이 시점에서 java.lang.NullPointerException이 발생합니다.
# 3) 널 객체를 인자로 전달
이것이 java.lang.NullPointerException 발생의 일반적인 원인입니다. 다음 Java 프로그램을 고려하십시오. 여기에는 인수로 전달 된 String 개체를 소문자로 변환하는 'print_LowerCase'메서드가 있습니다.
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 객체가 null 일 수 없으므로 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을 할당합니다. 이 null 배열에서 length 속성을 사용하면 NullPointerException이 발생합니다.
# 5) 널 배열의 액세스 인덱스
길이와 유사하게 인덱스를 사용하여 null 배열의 값에 접근하려고하더라도 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)); } }
산출
위의 프로그램에서 null 배열의 인덱스 2에있는 값에 액세스하려고합니다.
# 6) null 개체에 대한 동기화
일반적으로 동시 액세스를 용이하게하기 위해 블록 또는 방법을 동기화합니다. 그러나 동기화에 사용하는 개체 참조는 null이 아니어야합니다. 널 오브젝트 인 경우 java.lang.NullPointerException이 발생합니다.
아래의 Java 프로그램이이를 보여줍니다. 보시다시피, null로 초기화 된 String 객체 'mutex'가 있습니다. 그런 다음 주 함수에서 뮤텍스가있는 동기화 된 블록을 개체 참조로 사용합니다. mutex가 null이므로 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이 throw됩니다. 이로 인해 Null 포인터 예외가 발생합니다.
Null 포인터 예외 방지
이제 NullPointerException 발생 원인을 확인 했으므로 프로그램에서도이를 방지해야합니다.
먼저, 프로그램에서 사용하는 객체가 제대로 초기화되었는지 확인하여 Null Pointer Exception을 발생시키는 null 객체의 사용을 피할 수 있도록해야합니다. 또한 프로그램에 사용 된 참조 변수가 유효한 값을 가리키고 실수로 null 값을 얻지 않도록주의해야합니다.
이러한 고려 사항 외에도 java.lang.NullPointerException을 방지하기 위해 사례별로 더 많은주의를 기울일 수 있습니다.
아래에서는 몇 가지 경우를 고려합니다.
# 1) 리터럴과 문자열 비교
문자열 변수와 리터럴 (실제 값 또는 열거 형 요소) 간의 비교는 Java 프로그램에서 매우 일반적인 작업입니다. 그러나 객체 인 String 변수가 null 인 경우이 null 객체를 리터럴과 비교하면 NullPointerException이 발생합니다.
따라서 해결책은 null이 될 수있는 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) 삼항 연산자를 사용하여 null 값 처리
삼항 연산자를 사용하여 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) Java에서 NullPointerException을 수정하려면 어떻게해야합니까?
대답: 프로그램에서 사용되는 모든 개체가 제대로 초기화되고 null 값이 없는지 확인해야합니다. 또한 참조 변수에는 null 값이 없어야합니다.
# 2) NullPointerException이 선택되어 있습니까?
대답: NullPointerException은 확인 된 예외가 아닙니다. RuntimeException의 자손이며 선택되지 않습니다.
# 3) NullPointerException을 어떻게 중지합니까?
대답: NullPointerException을 방지하기위한 몇 가지 모범 사례는 다음과 같습니다.
- null이 될 수있는 알 수없는 개체에 사용하는 대신 문자열 리터럴과 함께 equals () 및 equalsIgnoreCase () 메서드를 사용합니다.
- toString () 대신 valueOf () 사용; 둘 다 동일한 결과를 반환합니다.
- Java 주석 @NotNull 및 @Nullable을 사용하십시오.
# 4) Java에서 null 값은 무엇입니까?
대답: null 값은 개체 또는 변수를 참조하지 않습니다. 그것은 키워드이자 리터럴입니다. 널 참조를 나타냅니다.
# 5) Java에서 NullPointerException을 잡을 수 있습니까?
대답: 예외 java.lang.NullPointerException은 확인되지 않은 예외이며 RuntimeException 클래스를 확장합니다. 따라서 프로그래머가 그것을 잡을 강박이 없습니다.
결론
이 자습서에서는 Java의 NullPointerException에 대해 설명했습니다. 이것은 매우 위험한 예외이며 일반적으로 예상치 못한 경우에 나타날 수 있습니다. Null 포인터 예외는 대부분 null 개체 또는 null 참조로 인해 발생합니다. 우리는 이미 NullPointerException을 피하는 원인과 방법을 보았습니다.
프로그래머는 가능한 한 프로그램에서 Null 포인터 예외가 발생하지 않도록해야합니다. 이것은 확인되지 않은 런타임 예외이므로 응용 프로그램이 실행 중일 때 발생하지 않는지 확인해야합니다.
=> 처음부터 Java를 배우려면 여기를 방문하십시오.