티스토리 뷰
- Java의 모든 레퍼런스 타입은
null
을 가질 수 있다. - 그렇기 때문에
null
인 객체를 참조하면NullPointerException
이 발생한다. - 지금부터 Java 14에 추가된 유용한
NullPointerException
에 대해 살펴보자.
기존 NullPointerException
public class NullPointerExceptionsExample {
public static void main(String[] args) {
Song song = new Song();
song.genre = new Genre();
System.out.println(song.genre.name.toUpperCase());
}
static class Song {
Genre genre;
}
static class Genre {
String name;
}
}
- 위 코드를 실행하면 다음과 같은 결과가 나온다.
System.out.println(song.genre.name.toUpperCase());
에서song
,genre
,name
은 모두 레퍼런스 타입이기 때문에null
을 가질 수 있다.- 하지만 위의 코드에서는
song
,genre
,name
중에 어떤 변수가null
을 가지고 있는지 알 수 없다. NullPointerException
이 발생한 위치(라인 번호)만 나타난다.캡쳐는 위의 실행 코드와 상단에 패키지 경로가 포함되어 있어서 라인 넘버가 예제와 다를 수 있다.
Java 14의 Helpful NullPointerExceptions
- 예제는 위의 코드와 동일하다.
- 여기서 추가해야 할 옵션이 있다.
- java 명령어로 소스 코드를 실행할 때
-XX:+ShowCodeDetailsInExceptionMessages
옵션을 추가해서 실행해야 한다.- intellij를 사용할 경우
- Run/Debug Configurations에서 VM options에
-XX:+ShowCodeDetailsInExceptionMessages
를 추가하고 실행한다.
- Run/Debug Configurations에서 VM options에
- console, terminal 등에서 실행할 경우
java -XX:+ShowCodeDetailsInExceptionMessages 클래스파일
로 실행한다.
- intellij를 사용할 경우
- Java 14에서 기본적으로 이 기능은 꺼져있기 때문이다.
- java 명령어로 소스 코드를 실행할 때
- 옵션을 추가해서 예제 코드를 실행하면 다음과 같은 결과가 나온다.
- 이번에는
NullPointerException
이 발생한 위치(라인 번호) 뿐만 아니라Cannot invoke "String.toUpperCase()" because "song.genre.name" is null
도 출력된다. - 소스 코드의 일부를 수정해서 다시 실행해보자.
public class NullPointerExceptionsExample {
public static void main(String[] args) {
Song song = new Song();
// song.genre = new Genre();
System.out.println(song.genre.name.toUpperCase());
}
static class Song {
Genre genre;
}
static class Genre {
String name;
}
}
- 위 코드를 실행하면 다음과 같은 결과가 나온다.
- 이번에도
NullPointerException
이 발생한 위치(라인 번호) 뿐만 아니라Cannot read field "name" because "song.genre" is null
도 출력된다. - 이처럼 Java 14에 추가된 Helpful NullPointerExceptions를 사용하면 실제로
NullPointerException
이 발생한 변수를 알 수 있다.
복잡한 구조를 가지고 있는 소스 코드에서 NullPointerException
이 발생한다면 굉장히 골치가 아프다.
라인 번호만 가지고 NullPointerException
을 찾는다면 null
을 가질 수 있는 객체 모두를 검사해봐야 하기 때문에 시간이 걸린다.
Java 14에 추가된 기능을 잘 활용해보자.
References
'프로그래밍 > Java' 카테고리의 다른 글
[Stream API] 중간 연산 - distinct 메서드 (0) | 2020.12.31 |
---|---|
[Stream API] 중간 연산 - filter 메서드 (2) | 2020.12.30 |
Intellij IDEA에서 Gradle을 사용해 Java Preview 버전의 코드 테스트하기. (0) | 2020.10.28 |
[Java 14] Enhanced Switch Expressions (2) | 2020.08.04 |
Vector 클래스와 ArrayList 클래스 (0) | 2018.02.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 스트림
- flatMapToDouble
- mapToObj
- 계획
- 토이 프로젝트
- flaMap
- lambda
- flatMapToInt
- 자바
- modern java
- 목표
- flatMapToLong
- jdk14
- 충북 콕! 콕!
- 중간 연산
- Java8
- 개발자
- 람다
- #React #ReactJS #리액트
- #배열 #array #map 함수
- 변경사항
- import문
- #예제 #example #가계부 #Account Book
- 회고
- java14
- java
- IntelliJ
- 익명 클래스
- Stream API
- 다짐
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함