일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- LANG
- 공개키 암호
- java
- 자료구조
- HTML
- 객체
- OOP
- 재귀호출기본
- 프로그래밍
- try&catch
- jvm
- 소수판정
- class
- 백준 알고리즘
- 현대암호
- 2884
- bubble-sort
- BufferedWrite
- JSP
- lang package
- 형변환 연산자
- 연결된 예외
- 알고리즘
- 디렉티브
- 객체지향
- 예외처리
- 클래스 패스
- 백준
- 암호론
- 자동 형변환
- Today
- Total
코드일기장
[Java] try-catch문(예외처리 1-2) 본문
프로그래머는 예외에 대한 처리를 해줘야 프로그램이 비정상적인 종료를 방지할 수 있다.
예외처리(exception handing)란, 프로그램 실행 시 발생할 수 있는 예기치 못한 예외 발생에 대비한 코드를 작성하는 것이다.
예외처리의 목적은 예외 발생으로 실행 중인 프로그램의 갑작스러운 비정상 종료를 막는 것이다.
exception handing 정의 프로그램 실행시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것 목적 프로그램의 비정상 종료 막기, 정상적인 실행상태 유지 |
예외 처리를 못하면 프로그램 비정상 종료 후, 처리 못한 예외를 JVM의 예외 처리기가 받아서 예외의 원인을 화면에 출력시켜준다.
예외 처리하기 위해서는 try-catch문을 사용한다.
try {
//예외 발생 가능성이 있는 코드 작성
}catch(Exception e){
//Exception이 발생했을 경우, 이를 처리하기 위한 코드 실행
//몇개든 상관없다.
}catch(Exception2 e2) {
//Exception2 가 발생했을 경우, 이를 처리하기 위한 코드 실행
//몇개든 상관없다.
}
하나의 try블록 다음에는 catch블록은 몇 개가 오든 상관없다. 단, catch() 안에 있는 예외의 종류가 일치하는 단 한 개의 catch블록만 수행한다. 만약, 발생한 예외가 catch블록의 예외가 일치하지 않으면 예외는 처리되지 않는다.
try블럭 내에서 예외발생 1. 발생한 예외와 일치하는 catch블럭이 있는지 확인. 2. 일치하는 catch블럭을 찾게 되면, catch블럭 내에 있는 문장 수행한 후 try-catch문을 벗어난 후 그 다음 문장을 계속해 서 수행 try블럭 내에서 예외가 발생하지 않은 경우 1. catch블럭 거치지 않고, 전체 try-catch문을 빠져나가서 수행을 계속한다. |
예제 코드)
public static void main(String args[]){
try {
System.out.println(5);
System.out.println(0/0);
}catch(Exception e) {
System.out.println(4);
System.out.println(3);
}
System.out.println(2);
System.out.println(1);
}
실행결과)
try문 2번째 코드는 Java에서 0을 나누는 것은 예외이다. 그 이후 catch(Exception) Exception 일치하므로 catch블록 안에 있는 문장 실행
class Main{
public static void main(String args[]){
try {
System.out.println(5);
System.out.println(4);
}catch(Exception e) {
System.out.println(3);
System.out.println(2);
}
System.out.println(1);
}
}
try블록에서 예외가 발생하지 않아서 catch블록은 실행시키지 않는다. 5 4 ->1 출력
catch블록에 대해
catch블록은 (), {} 두 부분으로 나누어진다. 괄호() 안에는 처리하고자 하는 예외와 같은 타입의 참조 변수 하나를 선언하면 된다.
catch블록은 여러 개 적을 수 있는데 첫 번째 catch블록부터 차례로 내려가면서 catch블럭 괄호() 내에 선언된 참조 변수의 종류와 생성된 예외처리 클래스의 인스턴스에 instanceof연산자를 이용해 검사하게 된다. 검사 결과가 true이면 catch블록 실행 fasle이면 아래의 catch문으로 넘어가는 방식이다. true가 하나도 없으면 try-catch문을 벗어난다.
참고로, catch() 괄호 안에 있는 클래스중 모든 예외는 Exception이 조상이므로 어떤 예외든 Exception클래스는 true이다. 하지만 저 자손인 예외 클래스를 instanceof연산자로 검사하게 하는 것이 좋다.
catch(Exception)은 모든 catch블록에 제일 밑에 가야 한다. 밑에 있지 않으면 프로그램 실행이 안된다.
class Main{
public static void main(String args[]){
try {
System.out.println(args[0]);
}catch(ArrayIndexOutOfBoundsException arre) {
if(arre instanceof ArrayIndexOutOfBoundsException) {
System.out.println("예외발생");
}
System.out.println("예외");
}catch(Exception e) {
System.out.println("실행 x");
}
System.out.println("Java");
}
}
args [0]은 초기화되지 않은 상태이다. try문에서 ArrayIndexOutOfBoundsException이 발생하게 된다.
인스턴스 arre와 예외처리 클래스가 일치하는 catch문은 instanceof연산자로 true가 된다. 그러므로 "예외 발생"이 출력이 된다. 그 후 "예외"도 출력이 되며, catch이 한번 실행했으므로 try-catch문을 벗어나고 "Java"를 출력한다.
(catch(Exception)은 try-catch문에 제일 아래에 있어야 한다.)
class Main{
public static void main(String args[]){
try {
System.out.println(0/0);
}catch(ArithmeticException a) {
System.out.println("0을 나누었다.");
}catch(Exception e) {
System.out.println("실행 x");
}
System.out.println("Java");
}
}
printStackTrace()와 getMessage()
예외가 발생되면 예외 클래스의 인스턴스에 예외에 대한 정보가 담겨 있다. 위 두 메서드로 그 정보를 읽을 수 있다.
printStackTrace() 예외 발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMeassage() 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
class Main{
public static void main(String args[]){
try {
System.out.println(0/0);
}catch(ArithmeticException a) {
a.printStackTrace();
System.out.println("=====");
System.out.printf("예외 메시지:%s\n\n\n",a.getMessage());
}
System.out.print("시스템 종료");
}
}
🎈 다음 글 보기 (예외처리 1-3)
🚀 이전 글 보기 (예외처리 1-1)
'Java' 카테고리의 다른 글
[Java] JVM메모리 구조, 기본 재귀호출-팩토리얼 (0) | 2022.01.11 |
---|---|
[Java] 멀티 catch 블럭, 예외 발생, checked와 unchecked (예외처리1-3) (0) | 2022.01.05 |
Java_예외 처리(예외처리 1-1) (0) | 2021.12.23 |
Java 타입간의 변환과 형변환 연산자 자동 형변환 (0) | 2021.11.22 |
Java_BufferedReader /BufferedWrite (0) | 2021.10.06 |