1.1 프로그램 오류
컴파일 에러(compile-time error) : 컴파일할 때 발생하는 에러
런타임 에러(runtime error) : 실행할 때 발생하는 에러
자바의 런타임 에러
에러(error) : 프로그램 코드에 의해 수습될 수 없는 심각한 오류
예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 >> 예외는 처리해야 함
1.2 예외처리의 정의와 목적
예외처리(exception handling)
: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성
: 프로그램의 비정상 종료를 막고, 정상적인 실행 상태를 유지
1.3 예외처리 구문 try-catch문
public stsatic void main(String[] args){
try{
try {
} catch(Exception e){
//...
}
} catch(Excepiton e){
try{
}catch(Exceptione){ // 컴파일 에러 발생
//...
}
} // try-catch문 끝
} // main 메서드 끝
try 블럭 내에서 예외가 발생한 경우
1) 예외가 발생한 즉시 발생한 예외와 일치하는 catch 블럭이 있는지 확인(그 이후 try 블럭 내 문장을 실행하지 않음)
2) 일치하는 catch 블럭을 찾으면, 그 catch 블럭을 수행하고 전체 try-catch문을 빠져 나가 다음 문장을 계속해서 수행
2) 일치하는 블럭을 찾지 못하면 예외 처리 불가능 >> 에러 발생
try 블럭 내에서 예외가 발생하지 않는 경우
1) catch 블럭을 거치지 않고 전체 try-catch문을 빠져 나가 수행을 계속함
package day12;
public class ExceptionTest1 {
public static void main(String[] args) {
String str1 = null;
String str2 = "hong";
//System.out.println(str1.toString()); // NullPointerException 발생 >> null은 toString 즉, 문자열로 바꿀 문자 자체가 없음 (주소값을 가지고 있지 않음(
System.out.println(str2.toString());
int[] arr = new int[5];
try{
System.out.println(str1.toString()); // 에러 발생 >> catch문으로 이동 >> NullPoint 에러이므로 맞는 catch문으로 이동
for(int i = 0; i<=arr.length; i++){ // 에러 발생 >> ArrayIndexOutOfBoundsException catch문으로 이동해야 함
arr[i] = i*10;
}
}catch (NullPointerException e1){
System.out.println(e1.getMessage()); // 어떤 에러인지 에러 메시지 출력
//e.printStackTrace(); // 어디서 에러가 발새했는지 출력
}catch(ArrayIndexOutOfBoundsException e2){
System.out.println(e2.getMessage());
//e.printStackTrace();
}
System.out.println("종료");
}
}
1.4 예외 발생시키기
1) 연산자 new 를 이용해 발생하려는 예외 클래스의 객체를 만든 다음
2) 키워드 throw를 이용해서 예외를 발생
try{
Exception e = new Exception("고의 발생");
throw e; // 예외 발생
throw new Exception("고의 발생"); // 선언과 동시에 예외를 던질 수 있음
}catch(Exception e){
System.out.println("에러 메시지 : "+e.getMessage()); //발생한 에러 e에 대한 메시지 출력
e.printStackTrace(); // 발생한 에러 e가 어디서 발생했는지 추적
}
1.5 예외 클래스 계층구조
RuntimeException 클래스 : 프로그래머의 실수로 발생하는 예외 (예외 처리 필수)
Exception 클래스 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 (예외 처리 선택) >> 예외의 최상위 클래스 Exception


- try문에서 예외가 발생했을 때 catch 블럭 중 Exception을 처리하는 catch 블럭은 반드시 마지막이어야 함
- 발생한 예외 객체를 catch 블럭 참조 변수로 접근 가능
1.6 finally 블럭
try{
// 예외가 발생할 가능성이 있는 문장
} catch(Exception e1) {
// 예외 처리를 위한 문장
} finally{
// 예외 발생 여부 관계없이 항상 수행되어야 하는 문장
// finally 블럭은 try-catch문 맨 마지막에 위치
}
- 예외 발생여부와 상관없이 실행되어야 하는 코드가 들어가며, 선택적으로 사용이 가능
- 예외 발생 시 try - catch - finally, 예외 미발생시 try-finally 순서로 실행
- try, catch 블럭에서 return문을 만나도 finally 블럭은 수행됨
1.7 메서드 예외 선언
void method() throws Exception1, Exception2, ... ExceptionN{
// 메서드 내용
}
- 예외를 처리하는 또 다른 방법응로, 예외를 처리하는 것이 아니라 호출한 메서드로 전달
- 호출한 메서드에서 예외처리를 해야하는 경우에만 사용 가능
package day12;
import java.io.IOException;
public class ExceptionTest6 {
static void method() throws IOException, Exception{
boolean flag = false;
if(flag){
throw new IOException("입출력 예외");
}else{
throw new Exception("모든 예외");
}
}
public static void main(String[] args) {
try{
method();
}catch (IOException e){
System.out.println(e.getMessage());
//e.printStackTrace();
//e.getMessage();
} catch (Exception e) {
System.out.println(e.getMessage());
//e.getMessage();
//e.printStackTrace();
}
}
}
1.8 예외 되던지기
- 예외를 처리한 후 다시 예외를 생성해서 호출한 메서드로 전달할 수 있음
- 예외가 발생한 메서드와 호출한 메서드, 양쪽에서 예외를 처리해야 하는 경우 사용
1.9 사용자정의 예외 만들기
- 기존의 예외 클래스를 상속받아 새로운 예외 클래스 정의가 가능함
- 에러 코드를 저장할 수 있도록 ERR_CODE와 getErrCode()를 멤버로 추가가 가능함
class MyException extends Exception{
private final int ERR_CODE; // 에러 코드 값 저장을 위한 필드 추가
MyException(String msg){ // 문자열을 매개변수로 받는 생성자
super(msg); // 조상인 Exception 클래스의 생성자 호출
}
public int getErrCode(){ // 이 메서드는 주로 getMessage()와 함께 사용함
return ERR_CODE;
}
}
'Kosta 교육' 카테고리의 다른 글
| [Day12 - JAVA] chap9. lang 패키지_1 (0) | 2023.08.29 |
|---|---|
| [Day8 - JAVA] chap6. 객체지향언어1_2 (0) | 2023.08.28 |
| [Day7 - JAVA] chap6. 객체지향언어1_1 (0) | 2023.08.28 |
| [Day3 - Java] 반복문 연습문제 - 피보나치 수열 나열하기 (0) | 2023.08.11 |
| [Day1 - JAVA] 자바 소개 (0) | 2023.08.09 |