자바 예외처리(Exception Handling)
예외처리
예외처리하기 : try - catch문
예제
public static void main(String[] args) {
System.out.println(1);
try {
System.out.println(2);
System.out.println(0/0);
System.out.println(3); //실행 xXXX
}
catch (ArithmeticException ae) {
if (ae instanceof ArithmeticException) {
System.out.println(4);
}
System.out.println(5);
}
catch (Exception e) {
System.out.println(6); //실행 XXX 이미 catch구문이 앞에서 걸림
}
System.out.println(7);
}
try-catch문의 예제이다.
1. 1,2 는 출력되고 0/0에러 에러가 발생하여 3이실행되지않는다.
2. 에러가 발생한 이유가 ArithmeticException이므로 catch(Ar~~ ae) {} 문으로 가게되고 instanceof가 true임으로 4,5가 출력된다.
3. catch문은 하나만 실행됨으로 밑에있는 catch(Exception e){}는 실행되지 않는다.
4. 7이 출력된다.
예외처리 정보얻기
printStackTrace() : 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메세지를 화면에 출력
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.
예제
try {
System.out.println(2);
System.out.println(0 / 0);
System.out.println(3); //실행 xXXX
} catch (ArithmeticException ae) {
if (ae instanceof ArithmeticException) {
System.out.println(4);
}
System.out.println(5);
ae.printStackTrace();
System.out.println(ae.getMessage());
1
2
4
5
/ by zero
java.lang.ArithmeticException: / by zero
at chapter8.main(chapter8.java:6)
이처럼 에러메세지에 대한 정보를 얻을 수 있다.
예외발생시키기
1. Exception e= new Exception("고의발생") //객체만들기
2. throw e;
try {
Exception e = new Exception("고의발생");
throw e;
}
catch (Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
단,
throw new RuntimeException();
과 같이 RuntimeException의 경우에는 사용자 실수와 관련된 에러이기 때문에 예외처리를 하지 않아도 컴파일은 된다.
하지만 Exception과 그 자손들은 예외처리를 해주어야한다.
메서드에 예외 선언하기
사용법 : void method() throws Exception1,Exceoptib2 { }
public static void main(String[] args) throws Exception {
method1();
}
static void method1() throws Exception {
method2();
}
static void method2() throws Exception{
throw new Exception();
}
다음을 보면
1. method2()에서 throw new Exception으로 인해 강제적으로 예외가 발생하였으나 method2()에는 try -catch문이없음
2. method2()를 호출한 method1()로 가서 try-catch문을 찾음
3. method1()을 호출한 main으로가서 try-catch문을 찾음 -> 없음. 컴파일 에러.
finally 구문
finally는 예외 발생에 상관없이 무조건 수행됨 . try-catch-finally
chapter8.method1();
System.out.println("main끝");
}
static void method1() {
try{
System.out.println("method1");
return; //메서드 종료
}
catch (Exception e){
e.printStackTrace();
}
finally {
System.out.println("finally구문");
}
}
다음과 같이 try구문에 return이있어서 메서드를 종료해도 finally에있는것은 무조건 실행됨
결과
method1
finally구문
main끝
try-with-resources문 이라는 것도 존재한다.
사용자가 예외 만들기
사용자가 예외구문도 만들수있다. (요즘엔 RuntimeException을 상속받아서 사용한다.)
예제
public static void main(String[] args) throws Exception {
try {
startInstall();
copyFiles();
} catch (SpaceException e) {
System.out.println(e.getMessage());
System.out.println("공간확보 필요"
);
} catch (MemoryException me) {
System.out.println(me.getMessage());
System.out.println("다시 설치를 시도");
} finally {
deleteTempFiles();
}
}
static void startInstall() throws SpaceException, MemoryException { //생성한 예외처리 호출
if (!enoughMeory()) {
throw new MemoryException("메모리 확보");
}
if (!enoughSpace()) {
throw new SpaceException("공간 부족");
}
}
static void copyFiles() {
}
static void deleteTempFiles() {
}
static boolean enoughSpace() {
return true;
}
static boolean enoughMeory() {
return false;
}
}
class SpaceException extends RuntimeException {
SpaceException(String msg){ //spaceException의생성자
super(msg); //조상인 RunTime의 생성자 호출
}
}
class MemoryException extends RuntimeException {
MemoryException(String msg){
super(msg);
}
}
'IT 관련 > JAVA' 카테고리의 다른 글
자바 java.lang 패키지(2) (0) | 2022.07.26 |
---|---|
자바(java) java.lang패키지(1) (0) | 2022.07.26 |
자바 객체지향II (추상화, 인터페이스) (0) | 2022.06.30 |
자바 객체지향언어II(제어자 ,다형성) (0) | 2022.06.29 |
자바 객체지향언어II(상속,오버라이딩,super (0) | 2022.06.28 |