NullPointException : Cannot invoke "" because "" is null
개인 과제 중에
오류가 나왔다.
해석해보면 orderList는 null이기 때문에 List.add(Object) 메서드를 부를 수 없다..? 라는 것 같다.
왜 비어있는 상태인데 add를 못하지? 싶어서 찾아보았다.
NullPointerException : Cannot invoke "java.util.List.add(Object)" because "" is null
Student 클래스 MainTest 클래스 에러 Cannot invoke "java.util.List.add(Object)" because "this.enrollments" is null java.util.List.add(Object) 때문에 "this.enrollments"가 비어있다는 뜻인 거 같네요! Student클래스에서 List 멤버변
spyair.tistory.com
List는 선언할 때 초기화를 해주지 않으면 add시킬 수가 없다..!
new ArrayList<>();로 초기화 시켜주니 잘 작동하는 것을 알 수 있었다.
자료구조와 배열은 가능한 멤버변수 선언과 동시에 초기화를 해야 NullPointerException을 방지할 수 있다고 한다.
정확히 NullPointerException이 뭐지..? 하고 생각해보니 예전에 String을 선언만 하고 할당을 시키지 않아 초기화는 시켜주지 않은 상태에서 String a += 2; 를 했더니 a가 null2가 되는 경험을 했었던 게 기억이 났다. null의 의미는 단순히 비어있는 것 정도라고 생각했는데 그런 것이 아니구나를 그 때 깨달았다. NullPointException의 예방에 관한 글이 있어서 읽어보았다.
[Java] NullPointException 원인, 예방, 해결하기
[Java] NullPointException 원인, 예방, 해결하기 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ NullPointException 원인, 예방, 해결하기 ] 입니다. : ) 이번 회사 업무를 진행 하는 도중 별도의 과제를 받은 것
goddaehee.tistory.com
null로 발생된 에러는 시간이 지날수록 더욱 더 디버깅하기 어려워지므로 처음부터 NPE를 발생시키지 않도록 코딩하는게 현업에서는 아주 중요한 것 같았다. 앞으로 코드를 짤 때 필시 유념해야 할 것 같다.
Exception in thread "main" java.lang.StackOverFlowError
나의 경우와 같은 오류가 생기는 테스트 코드를 짜보았다. 사실 이것 때문에 오류가 생긴게 맞나? 해서 짜본건데 다행히 오류가 난다.
Test 클래스 내에서 객체 생성의 무한 루프에 빠져 걸리는 오류였다. 오류만 봐도 7번 줄에서 계속 돌고 있다.
메서드 안에 놔두면 StackOverflow에러가 나지 않는데 왜 밖에 놔두었는가를 설명 해보자면 test1과 test2를 전역변수로 쓰고 싶었기 때문이다. 매니저님의 조언과 구글링으로 test1과 test2를 static으로 바꿔주어서 해결하였다..!!
이 페이지에서는 static으로 바꾸진 않았지만 이 코드의 오류를 이해하는데 참고하였다.
Exception in thread "main" java.lang.StackOverflowError (Create Breakpoint)
It is a simple library code where books are added in library list. find method that returns boolean values. borrowed method that delete book from libraryList and moves book to borrowedList. return ...
stackoverflow.com
Class class = new Class(); 라는 코드를 단순히 Class의 메서드를 쓸 수 있게끔 해주는 코드로 이해를 했기 때문에 코드에 대한 이해도가 낮아서 이렇게 짜버린 것이었다.
매니저님의 조언을 받아서 Test 안에서 생성시킨 Test 객체 test1과 test2를 static으로 바꿔주어 해결하였다. 전역변수로 쓰고 싶다면 static을 붙여서 객체를 생성하고, 그러지 않고 한 메서드에서만 사용한다면 지역변수로 하여 오류가 나지 않도록 해야겠다!
그리고 또 다른 기록.
너무나 당연한거겠지만 난 이 당연한 걸 이해를 못하고 있었기에 기록해 놓는다. 흑흑
사실 나는 Test test = new Test();라는 코드를 객체를 생성한다기 보다 그냥 Test의 메서드를 쓸 수 있게끔 하는 코드. 정도로 인식을 하고 있었기 때문에
만약 A라는 클래스에서 Test 타입으로 test 객체를 생성하고 B라는 클래스에서 Test 타입으로 test 객체를 생성한다면 A, B 클래스에서 같은 test를 공유하고 있다는 것으로 생각했다.(이름이 같아서..) 근데 아니다!! 당연히 아니다.. 그럼 메이플 닉네임 마냥 하루종일 클래스 닉네임을 생각하고 있어야 할 것이다..
과제를 하다가 중간에 그걸 알아버려서 다시 코드를 약간 엎었고(다행히 어제처럼 구조적인 문제가 크지 않아서 싸그리싹싹 엎진 않아도 됐다.. 어제 한 건 다 엎었다.. 상속이 꼬여서) 빠르게 과제 완!!!
일단은 필수 옵션만 구현한 것이라서 선택 옵션을 추가적으로 더 구현해보아야겠다. 끝-