예외와 예외 클래스
- 오류의 종류
1) 에러
- 하드웨어의 잘못된 동작 또는 고장으로 인한 오류
- 에러가 발생되면 프로그램 종료
- 정상 실행 상태로 돌아갈 수 없음
2) 예외(Exception)
- 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류
- 예외가 발생되면 프로그램 종료
- 예외 처리 추가하면 정상 실행 상태로 돌아갈 수 있음
3) 구분
- checked exception : 일반(컴파일 체크) 예외
예외 처리 코드 없으면 컴파일 오류 발생
- unchecked exception : 실행 예외
예외 처리 코드를 생략하더라도 컴파일이 되는 예외
경험에 따라 예외 처리 코드 작성이 필요
RuntimeExeption
- 예외 처리 코드
1) 예외 발생시 프로그램 종료를 막고 정상 실행될 수 있도록 처리
- 일반 예외 : 반드시 작성해야 컴파일 가능
- 실행 예외 : 컴파일러가 체크해주지 않아 개발자 경험에 의해 작성
2) 기본 형식
try{
예외 발생 가능 코드
}catch(예외클래스선언 변수e){
예외 발생시 대응할 코드
}finally{
try{} 문에서 예외가 발생하든 안하든 실행할 코드
}
- 예외 처리 순서
1) 기본 내용 코드 실행
2) 예외가 발생했을 때, 예외 처리 복사
3) try{}catch{}문 작성
- 다중 예외 처리
1) 하위 예외부터 처리하고, 상위 계층의 예외는 최종으로 처리한다.
String name = null;
try {
System.out.println(name.toString());
System.out.println(args[1]);
System.out.println(1/0);
// 다중 예외 처리 : 상위 계층의 예외는 최종으로 처리한다
}catch(NullPointerException e) {
System.out.println("예외1 :"+e.getMessage());
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("예외2 :"+e.getMessage());
}catch(Exception e) {
System.out.println("예외3(상위)"+e.getMessage());
}finally{
}
- 예외 위임(Throws)
1) 메서드별로 현재 예외 처리를 이 메서드를 호출하는 곳에서 처리하게 위임시키는 것을 말한다.
2) 예외를 각 메서드별로 처리하기보다 호출되는 곳에서 한번에 처리할 때 활용한다
3) 위임 형식
public void 메서드명() throws 위임할예외1, 위임할예외2...{}
static void call01() throws ArithmeticException{ //예외 위임
System.out.println("메서드1");
System.out.println(1/0);
}
static void call02() throws ArithmeticException{ //예외 위임
System.out.println("메서드2");
System.out.println(1/0);
}
try { //위임받은 예외 한번에 처리
call01();
call02();
}catch(ArithmeticException e) {
System.out.println(e.getMessage());
}
강제 예외 발생시키기
- 프로그램적으로 특정한 경우에 조건/반복문/특정프로세스 안에서 강제로 예외를 발생시켜 처리하는 내용을 말한다.
- 기본 형식
throw new 내장된() / 사용자 정의 예외 던지는 처리
try {
// 특정한 조건에서 예외 던지기
for(int cnt=1;cnt<=10;cnt++) {
System.out.println("번호:"+cnt);
if(cnt==5)
throw new NullPointerException("예외 막 던지기");
}
}catch(NullPointerException e) {
System.out.println("예외 내용"+e.getMessage());
}
사용자 정의 예외
- 자바 표준 api에서 제공하지 않는 예외를 선언하여 사용
- 형식
public class @@@Exception extends Exception(or RuntimeException)
public @@@Exception(){}
public @@@Exception(String message){
super(message);
}
}
- 주요 메서드
1) getMessage() : 예외 발생시킬 때, 생성자의 매개값으로 사용한 메시지 리턴
throw new @@@Exception("예외메시지")
원인을 세분화하기 위해 예외 코드 포함
catch() 절에서 활용
catch(Exception e){
String msg = e.getMessage();
}
2) printStackTrace() :
예외발생코드를 추적한 내용을 모두 콘솔에 출력한다
for(int cnt=1;cnt<=10;cnt++) {
try {
if(cnt%3==0) {
throw new UserException(cnt+" 번호 예외 던짐");
}
}catch(UserException e) {
System.out.println("#예외 잡기#");
System.out.println("참조변수 호출 : "+e);
System.out.println("메시지 : "+e.getMessage());
e.printStackTrace();
}
}
class UserException extends Exception{
// 생성자
public UserException() {
super();
}
public UserException(String message) {
super(message);
}
// 기능메서드의 재정의 선언
@Override
public String getMessage() {
// TODO Auto-generated method stub
return "[재정의 메시지] "+super.getMessage();
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "[재정의 참조값] "+super.toString();
}
@Override
public void printStackTrace() {
System.out.println("# 재정의 출력 #");
super.printStackTrace();
}
}