Java/Java

자바[Java] 예외처리(Exeption)란? 개념정리 및 종류

백엔드 신입사원( soft 5.10 입사) 2021. 10. 19. 14:39
반응형

예외처리 오류 종류

Error(오류)
  하드웨어의 잘못된 동작, 고장으로 인한 오류 에러가 발생되면 프로그램 종료 정상 실행 상태로 사용불가
Exception(예외)
  사용자의 잘못된 조작, 개발자의 잘못된 코딩으로 인한 오류 예외가 발생되면 프로그램 종료되나 예외 처리를 추가하면 정상 실행할 수 있음.
 

 

Exception의 종류 

일반 예외
  예외 처리 코드가 없으면 컴파일 오류 발생
실행 예외
  예외 처리 코드를 생략하더라도 컴파일이 되는 예외, 경험 따라 예외 처리 코드 작성 필요
Throwable는 예외 처리할 수 있는 클래스중 최상위 클래스입니다. 다음으로는 Exception이 있습니다.
toString()은 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드

실행 예외 아래 코드는 예시 코드입니다.

NullPointerException 객체 참조가 없는 상태.
ArrayindexOutOfBoundsException  배열이 인덱스 범위를 초과하여 사용할 경우 발생
ClassCastException 타입 변환이 되지 않을 경우 발생
NumberFormatException 숫자형 포맷 오류, 문자를 숫자로 변경하려다 발생하는 오류.
nullpointer 오류는 객체 참조가 없어 오류가 발생한다.
array 오류는 받을 args의 값이 없기 때문에 발생한다.
classcast 오류는 Cat라는 타입이 변환되지 못하니 발생한다.
number 오류는 data2의 값이 a100이기에 문자열을 숫자로 사용할 수 없기에 발생한다.

 

public class NullPointerExceptionExample {  
public static void main(String[] args) {  
String date = null; // String타입의 date의 값은 unll이다.  
System.out.println(data.toString()); // Date의 값을 출력한다  
// (NullPointerExceptionExample.java:6) 해당 오류가 표시된다.  
}  
}
public class ArrayIndexOutOfBoundsExceptionExample {  
  
public static void main(String[] args) {  
if(args.length == 2) { // args의값이 2개일때.  
String data1 = args[0]; // String타입의 data1과 2를 만들고  
String data2 = args[1]; // 각각 args의 0번째와 1번째의 값을 각각 저장한다  
System.out.println("args[0]" + data1);  
System.out.println("args[0]" + data2); // 출력한다.  
} else { // 그렇지 않으면 (위에가 다를경우)  
System.out.println("실행 방법");  
System.out.println("java ArrayIndexOutOfBoundsExceptionExample");  
System.out.println("값1, 값2");  
}  
}  
  
}
public class ClassCastExceptionExample {  
  
public static void main(String[] args) {  
Dog dog = new Dog(); // Dog와 Cat 사용하기위해 선언한다.  
changeDog(dog);  
Cat cat = new Cat();  
changeDog(cat);  
  
  
}  
public static void changeDog(Animal animal) {  
Dog dog = (Dog) animal;  
  
}  
  
}  
  
class Animal { // 사용할 클래스를 추가로 만들고  
  
}  
class Dog extends Animal{ // Animal의 클래스를 상속받을 Dog 와 Cat의 클래스를 만들어준다.  
  
}  
class Cat extends Animal{  
  
}
public static void main(String[] args) {  
String data1 = "100"; // string 타입의 data1과 2의 값을 주고  
String data2 = "a100";  
  
int value1 = Integer.parseInt(data1);  
// 숫자형의 문자열을 받아서 intger형으로 반환(변환)시키고.  
int value2 = Integer.parseInt(data2);  
  
int result = value1 + value2; // int타입의 result를 추가해 반환된 value1과 2의 값을 result에 저장한다  
System.out.println(data1 + "+" + data2 + "=" + result); // 값을 출력한다.  
// 실행시 (NumberFormatExceptionExample.java:11) 해당 오류가 뜬다.  
}  
  
}

예외처리 코드(try-catch-finally)

예외 발생 시 프로그램 종료를 막고, 정상 실행 유지할 수 있도록 처리합니다. 아래 코드는 예시 코드입니다.

일반 예외 : 반드시 작성해야 컴파일이 가능
실행 예외: 컴파일러가 체크해주지 않고, 개발자 경험에 의해 작성
try-catch-finally 블록을 이용해 예외처리 코드 작성

 

try {  
// 예외 발생하는 코드  
} catch(발생하는 예외 e) {  
// 해당 예외가 발생하면 어떻게 처리할지  
} finally {  
// 예외 여부와 관계없이 실행시킬 코드  
}
 

 

다중 catch

  try블록에서 다발적으로 예외가 발생하지는 않고, catch가 여러 개 있다 하더라도 하나의 예외가 발생하면 발생하는 catch 블록으로 이동한다. catch의 발생하는 예외는 하위 예외 클래스가 항상 상위 예외 클래스보다 위에 있어야 합니다. 예를 들어 NullPointerException 객체 참조가 없는 오류가 발생하고 , ClassCastException 타입으로 변환되지 않는 상태라 할 때 둘 중 하나의 오류는 Exception 오류처리 코드로 작성합니다.

try {  
// 예외 발생하는 코드  
} catch(**NullPointerException**  e) {  
// 해당 예외가 발생하면 어떻게 처리할지  
} catch(**Exception**  e){  
// 나오는 모든 예외가 발생하면 어떻게 처리할지  
}finally {  
// 예외 여부와 관계없이 실행시킬 코드  
}

 

멀티(multi) catch는 catch 블록 하나로 여러 개의 예외처리도 가능합니다.

  예를 들어 NullPointerException 객체 참조가 없는 오류가 발생하고 , ClassCastException 타입으로 변환되지 않는 상태라면  | 로 연결시킨다.

try {  
// 예외 발생하는 코드  
} catch(NullPointerException  **|**  ClassCastException e) {  
// 해당 예외가 발생하면 어떻게 처리할지  
} finally {  
// 예외 여부와 관계없이 실행시킬 코드  
}

자동 리소스 닫기

  try-with-resources를 사용하기 위해서는 리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 합니다. try- with-resources는 바로 close()메소드를 자동 호출합니다.

public class FileInputStream implements AutoCloseable {  
private String file;  
  
public FileInputStream(String file) {  
this.file = file;  
}  
  
public void read() {  
System.out.println(file + "을 읽습니다.");  
}  
  
@Override  
public void close() throws Exception{  
System.out.println(file + "을 닫습니다.");  
}  
}

public class FileTryWithResourceExample {  
public static void main(String[] args) {  
try(FileInputStream fis = new FileInputStream("file.txt") ){  
fis.read();  
throw new Exception();  
} catch(Exception e) {  
System.out.println("예외 처리 코드가 실행되었습니다.");  
}  
}  
}
반응형