'예외처리'에 해당되는 글 2건

  1. 2018.09.10 java.lang.NullPointerException 해결법 1
  2. 2018.09.10 java.lang.ArrayIndexOutOfBoundsException 해결법


자바에서 NullPointerException은 RuntimeException입니다. 특수한 널 값은 객체 참조에 할당할 수 있습니다. 

프로그램에 널값을 가지는 객체 참조를 사용하려고하면 NullPointerException이 throw됩니다.


null에 대해

- null이란 아무것도 없음을 의미합니다.(0또는 공백 : "")

- 모든 참조유형에 대한 기본 값은 null입니다.

- null은 유효한 객체 인스턴스가 아니므로 할당 되는 메모리가 없습니다.


+ 예외가 발생하는 경우

- null 객체에서 method를 호출하는 경우

- null 객체의 필드에 접근하거나 값을 변경하는 경우

- null 의 길이를 배열처럼 취하는 경우

- null 을 throw 하는 경우

- null 을 통해 동기화 할 경우


+ 그럼에도 null 값이 필요한 이유? 

- 널은 자바에서 사용되는 특수 값입니다. 주로 참조 변수의 값이 할당되지 않았음을 나타내는데 사용됩니다.

- Null Object 패턴(로그 시스템) 및 Singleton 패턴에 사용됩니다.

- 연결된 목록 및 트리와 같은 데이터 구조를 구현하는 데 사용됩니다.


+ NullPointerException을 피하는 방법

1. 문자열 비교 : String 변수와 리티럴문자를 비교할 때 다음과 같은 오류가 발생할 수 있습니다.


String ptr = null;

if (ptr.equal("abc") // NullPointerException 발생!

{

System.out.println("SAME!");

}

else

{

System.out.println("NOT SAME!");

}


이는 다음과 같이 null객체 대신 리터럴문자에서 equal 메소드를 호출함으로써 해결할 수 있습니다.


String ptr = null;

if ("abc".equals(ptr))

{

System.out.println("SAME!");

}

else

{

System.out.println("NOT SAME!"); // "NOT SAME" 출력

}


2. try - catch문 사용 : 다음과 같이 예외처리문을 사용가능합니다.


public class Main {

public static void main(String[] arg) {

String 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(); 

}


3. 삼항 연산자 사용 : null 값은 == 또는 != 의 연산자가 적용되기 때문이 이를 이용하여 다음과 같이 코드를 작성할 수 있습니다.


public class Main {

public static void main(String[] arg) {

String s = null; 

System.out.println(s.length()); // NullPointerException 발생!!

        

}


위 코드를 아래와 같이 수정합니다.


public class Main {

public static void main(String[] arg) {

String s = null; 

System.out.println((s == null) ? "0" : s.length()); // "0" 출력

        

}


이상 java.lang.NullPointerException에 대해 알아보았습니다.

자바 예외에 대해 더 알고싶은 분은 여기를 참고하세요.

또한 본 게시글에 대한 오류나 질문사항은 아래 댓글로 남겨주세요.

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.



자바는 배열의 작성 및 조작을 데이터 구조로 지원합니다. 

배열의 크기를 n이라고 했을 때 배열의 인덱스는 1부터 n까지가 아닌 0부터 n-1까지입니다. 

프로그래밍 중 ArrayIndexOutOfBoundsException이 가장 많이 발생하는 이유중 하나죠.

C/C++과 달리 자바는 인덱스가 배열의 크기보다 크거나 음수 인덱스에 대한 요청이 있으면 자바는 위의 예외를 발생시킵니다.

또한 이 예외는 자바 컴파일러는 검사하지않고 항상 런타임(실행도중)에 예외를 발생시킵니다.


다음은 Exception 발생의 예입니다.


int[] arr = {0, 1, 2, 3, 4};

arr[5] = 4; // 예외 발생!!


해당 프로그램 실행 시 다음과 같은 오류가 발생합니다.


Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 

at average.Main.main(Main.java:9)


arr이란 배열의 크기는 5입니다. 따라서 인덱스는 0부터 4(n-1)까지입니다.

하지만 배열의 5번째 인덱스에 접근하려고 시도했기 때문에 자바는 해당 예외를 throw한 것입니다.


또 다른 Exception 발생의 예입니다.


ArrayList<String> list = new ArrayList<>();

list.add("Hello");

list.add("Wolrd");

list.get(2); // 예외 발생!!


해당 프로그램 실행 시 다음과 같은 오류가 발생합니다.


Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 

at java.util.ArrayList.rangeCheck(ArrayList.java:657)

at java.util.ArrayList.get(ArrayList.java:433)

at average.Main.main(Main.java:11)


위 코드를 보시면 list 객체를 생성하고 2번 add해주었습니다. (list의 크기 = 2)

list의 크기가 2이므로 접근 가능한 인덱스는 0부터 1(2-1)까지입니다. 따라서 list의 2번째 인덱스에 접근하려고 했기 때문에 해당 예외를 throw한 것입니다.

그렇다면 프로그래머는 어떤식으로 이런 예외에 대해 올바르게 예외처리를 수행할 수 있을까요?


☞ 배열에 올바르게 접근하는 방법


반복문에서 다음과 같이 사용합니다.


for(int i = 0; i < arr.length; i++) { ... }


또한 foreach문을 사용할 수 있습니다. (foreach문에 대한 설명)


for(int i : arr) { ... }


Try-Catch문 사용하기 : 다음과 같이 사용 가능합니다.


import java.util.ArrayList;


public class Main {

public static void main(String[] arg) {

try {

ArrayList<String> list = new ArrayList<>();

list.add("Hello");

list.add("Wolrd");

list.get(2);

}

catch(IndexOutOfBoundsException e) {

System.out.println(e);

}

}

}


이상 java.lang.ArrayIndexOutOfBoundsException에 대해 알아보았습니다.

자바 예외에 대해 더 알고싶은 분은 여기를 참고하세요.

또한 본 게시글에 대한 오류나 질문사항은 아래 댓글로 남겨주세요.

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.



to Top