예외처리
RuntimeException 클래스들 (unchecked예외) | 프로그래머의 실수로 발생하는 예외 |
Exception 클래스들 (checked예외) | 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 |
예외처리하기 - try - catch문
예외처리란?
정의 - 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것
목적 - 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
예시코드
class ExceptionEx1 {
public static void main(String[] args)
{
try {
try { } catch (Exception e) { }
} catch (Exception e) {
try { } catch (Exception e) { } // 에러. 변수 e가 중복 선언
}
try {
} catch (Exception e) {
}
}
}
class ExceptionEx3 {
public static void main(String args[]) {
int number=100;
int result=0;
for(int i=0; i<10; i++){
try{
result = number / (int)(Math.random()*10);
System.out.println(result);
} catch (ArithmeticException e) { // ArithmeticException이 발생하면 실행되는 코드
System.out.println("0");
}
}
}
}
* try 블럭 내에서 예외가 발생한 경우,
1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
2. 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계
속해서 수행. 만일 일치하는 catch블럭을 못찾으면 예외는 처리되지 못함.
* try 블럭 내에서 예외가 발생하지 않은 경우,
1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속함.
예외의 발생과 catch블럭
- catch블럭의 괄호() 내에는 처리하고자 하는 예외와 같은 타입의 참조변수 하나를 선언해야 한다.
- 예외가 발생하면, 발생한 예외에 해당하는 클래스의 인스턴스가 만들어 진다.
- 예외를 찾을 때 예외 클래스의 인스턴스에 instanceof 연산자를 이용해서 검사함.
printStackTrace() | 예외발생 당시의 호출스택에 있었던 메서드 정보와 예외 메시지를 화면에 출력 |
getMessage() | 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다. |
-> 발생원인 파악 가능
멀티 catch블럭
try{
} catch (ExceptionA e) {
e.printStackTrace();
} catch (ExceptionB e) {
e2.printStackTrace();
}
//same
try{
} catch (ExceptionA | ExceptionB e) {
e.printStackTrace();
}
* 여기서 사용된 "|"는 논리연산자가 아닌 기호이다.
예외 발생시키기
1. 먼저, new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception([String]);
2. 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
메서드에 예외 선언하기
void method() throws Exception1, Exception2, ... ExceptionN {
//method 내용
}
예외를 넘겨준다는 것은 예외가 처리된 것이 아니라, 예외를 단순히 전달만 하는 것.
finally 블럭
: try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용됨.
try -> catch -> finally 의 순서로 구성
* return문을 만나도 finally 블럭은 실행됨.
자동 자원 반환 _ try-with-resources문
??? 이해 제대로 x
사용자정의 예외 만들기
class MyException extends Exception {
MyException(String msg) { // 문자열을 매개변수로 받는 생성자
super(msg); // 조상인 Exception클래스의 생성자를 호출
}
}
예외 되던지기
1. 예외가 발생할 가능성이 있는 메서드에서 try-catch문을 사용해서 예외를 처리해주고 catch문에서 필요한 작업을 행한 후에
throw문을 사용해서 예외를 다시 발생 시킴.
2. 다시 발생한 예외는 이 메서드를 호출한 메서드에게 전달되고 호출한 메서드의 try-catch문에서 예외를 또다시 처리
-> 예외 발생한 메서드와 이를 호출한 메서드 양쪽 모두에서 처리해줘야 할 작업이 있을 때 사용
clas ExceptionEx17 {
public static void main(String[] args)
{
try {
method1();
} catch (Exception e) {
System.out.pirntln("main메서드에서 예외가 처리되었습니다.");
}
}
static void method1() throws Exception {
try {
throw new Exception();
} catch (Exception e) {
System.out.println("method1메서드에서 예외가 처리되었습니다.");
throw e;
}
}
}
연결된 예외
예외 A가 예외 B를 발생시켰다면, A를 B의 '원인 예외'라고 한다.
initCause()은 Exception클래스의 조상인 Throwable클래스에 정의됨
Throwable initCause(Throwable cause) | 지정한 예외를 원인 예외로 등록 |
Throwable getCause() | 원인 예외를 반환 |
1. 예외가 원인 예외를 포함시키기 위함
2. checked예외를 unchecked예외롤 바꾸기 위함
static void startInstall() throws SpaceException {
if(!enoughSpace()) {
throw new SpaceException("설치공간부족");
}
if(!enoughMemory()) {
throw new RuntimeException(new MemoryException("메모리부족"));
}
}
Runtime 예외가 Memory예외를 감싸버림 -> Memory 예외가 unchecked예외가 됨.
'Language > java' 카테고리의 다른 글
Java_Study_ java.lang 패키지(String클래스) (0) | 2022.07.12 |
---|---|
Java_Study_ java.lang 패키지(Object클래스) (0) | 2022.07.12 |
Java_Study 객체지향 프로그래밍_내부 클래스 (0) | 2022.07.07 |
Java_Study 객체지향 프로그래밍_인터페이스 (0) | 2022.07.07 |
Java_Study 객체지향 프로그래밍_추상클래스 (0) | 2022.07.07 |
댓글