Java의 널 포인터 예외
Java의 NullPointerException은 RuntimeException입니다. 프로그램이 null 값을 가진 개체 참조를 사용하려고 할 때 발생합니다. Java에서 'null'은 값이 없음을 나타내기 위해 객체 참조에 할당할 수 있는 특수 값입니다.
널 포인터 예외가 발생하는 이유
NullPointerException은 다음과 같은 이유로 발생합니다.
- null 개체에서 메서드를 호출합니다.
- null 개체의 필드에 액세스하거나 수정합니다.
- null의 길이를 마치 배열인 것처럼 사용합니다.
- 마치 배열인 것처럼 null 개체의 슬롯에 액세스하거나 수정합니다.
- Throwable 값인 것처럼 null을 던집니다.
- null 개체에 대해 동기화를 시도하는 경우.
예:
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)설명: 이 예에서 문자열 참조 's'는 null입니다. 프로그램이 length() 메소드를 호출하려고 하면 실제 객체가 없기 때문에 NullPointerException이 발생합니다.
Java에서 null이 사용되는 이유는 무엇입니까?
null 값은 자리 표시자 역할을 하며 참조 변수에 할당된 값이 없음을 나타냅니다. 일반적인 응용 분야는 다음과 같습니다.
- 연결된 데이터 구조 : 목록이나 트리 가지의 끝을 나타냅니다.
- 디자인 패턴 : Null Object Pattern이나 Singleton Pattern과 같은 패턴에 사용됩니다.
NullPointerException을 피하는 방법
NullPointerException을 방지하려면 모든 객체를 사용하기 전에 적절하게 초기화되었는지 확인해야 합니다. 참조 변수를 선언할 때 객체에서 메서드나 필드를 요청하기 전에 객체가 null이 아닌지 확인해야 합니다.
1. equals()에서 문자열 리터럴 사용
매우 일반적인 사례 문제는 문자열 변수와 리터럴 간의 비교와 관련됩니다. 리터럴은 문자열이거나 Enum의 요소일 수 있습니다. null 개체에서 메서드를 호출하는 대신 리터럴에서 메서드를 호출하는 것이 좋습니다.
예:
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
객체가 아닌 리터럴에서 같음을 호출하면 NullPointerException을 피할 수 있습니다.
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
메모 : null 참조에서 메서드를 호출하지 않으려면 항상 리터럴에서 같음을 호출하세요.
2. 메서드 인수 확인
새 메서드의 본문을 실행하기 전에 먼저 해당 인수에 null 값이 있는지 확인하고 인수가 제대로 확인된 경우에만 메서드 실행을 계속해야 합니다. 그렇지 않으면 IllegalArgumentException이 발생하고 전달된 인수에 문제가 있음을 호출 메서드에 알립니다.
예:
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. 삼항 연산자 사용
NullPointerException을 방지하기 위해 삼항 연산자를 사용할 수 있습니다. 먼저 부울 표현식이 평가됩니다. 표현식이 true이면 value1이 반환되고 그렇지 않으면 value2가 반환됩니다. 널 포인터를 처리하기 위해 삼항 연산자를 사용할 수 있습니다.
예:
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
설명 : 삼항 연산자는 null을 확인하고 null 참조에 대한 작업을 방지하는 데 도움이 됩니다.
4. 선택적 클래스 사용(Java 8+)
Java 8에서는 Optional 클래스가 null이 아닌 값을 포함하거나 포함하지 않을 수 있는 컨테이너 객체로 도입되었습니다. 피하는데 도움이 됩니다 NullPointer예외 값이 없는 경우를 명시적으로 처리하도록 강제합니다.
예:
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
설명: Optional.ofNullable(value)은 null일 수 있는 값을 래핑합니다. orElse()는 값이 없는 경우 대체를 제공합니다.