예외(Exception)
-> 문법적으로는 맞지만 작동이 이상하거나 결과에 악영향을 미칠 수 있는 실행에서 발생한 오류를 예외라고 함.
예를 들어, 정수를 0으로 나누는 경우
int div1 = 5;
int div2 = 0;
System.out.println("나누기 결과: " + div1 / div2); //값을 0으로 나눌 수 없기 때문에 예외 발생.
예외 처리 코드
try {
//예외가 발생할 가능성이 있는 실행문
}
catch (처리할 예외 타입 e) {
//예외 처리문
}
finally {
//예외 발생 여부와 상관없이 실행되는 문장
}
//다중 catch도 가능함.
try {
//예외가 발생할 가능성이 있는 실행문
} catch (처리할 예외 타입 e) {
//예외 처리문1
} catch (처리할 예외 타입 e) {
//예외 처리문2
}
* 주의
-> 다중 캐치 사용 시, 더 넓은 범위의 예외 클래스일수록 마지막 catch문에 사용해야 함. 만약 넓은 범위의 예외 클래스가 첫 번째 catch문에 사용되면 그다음 catch문은 쓸 필요가 없게 됨.
try {
//예외가 발생할 가능성이 있는 실행문
} catch (NullPointerException e) {
//예외 처리1
} catch (Exception e) {
//예외 처리2
} //이런 순서로 사용해야 함.
연습문제
public class ExceptionEx {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 }; //크기가 5인 배열 생성
for (int i = 0; i < 10; i++) {
System.out.println(arr[i]); //배열을 0부터 9까지 출력하라는 반복문
}
}
}
--> 범위를 벗어났기에 예외처리가 필요함.
- try - catch문 사용하여 예외 처리
public class ExceptionEx {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
try {
for (int i = 0; i < 10; i++) {
System.out.println(arr[i]);
}
} catch (Exception e) {
System.out.println("예외 처리 발생!");
System.out.println(e);
}
}
}
예외 클래스
예외 클래스 | 예외 발생 경우 | 패키지 |
ArithmeticException | 정수를 0으로 나눌 때 발생 | java.lang |
NullPotnterException | null 레퍼런스를 참조할 때 발생 | java.lang |
ClassCastException | 변환할 수 없는 타입으로 객체를 변환할 때 발생 | java.lang |
IOException | 입출력 동작 실패 시 발생 | java.io |
NumberFormatException | 일치하지 않는 타입의 숫자로 문자열을 변환할 때 발생 | java.lang |
InputMismatchException | Scanner 클래스로 정수를 입력 받고자 했지만, 문자를 입력한 경우 발생 | java.util |
예외 떠넘기기 (throws)
-> 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할을 함.
연습문제
- 예외 발생
public class ThrowsEx {
public static void main(String[] args) {
int n1 = 10;
int n2 = 0;
System.out.println(n1/n2);
}
}
- try-catch문으로 예외 처리 해결
public class ThrowsEx {
public static void main(String[] args) {
int n1 = 10;
int n2 = 0;
try {
System.out.println(n1/n2);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
}
}
}
- throws 사용하여 예외 처리할 메소드 정하기
public class ThrowsEx {
public static void divEx(int x, int y) throws ArithmeticException {
System.out.println(x/y);
}
public static void main(String[] args) {
int n1 = 10;
int n2 = 0;
try {
divEx(n1, n2);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
}
}
}
* printStackTrace() : 예외 발생 코드를 추적하여 내용을 모두 콘솔에 출력, 프로그램 테스트에서 오류를 찾을 때 유용.
try {
divEx(n1, n2);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
e.printStackTrace();
}
감사합니다!
2021.07.13
'JAVA' 카테고리의 다른 글
[Java] 오름차순, 내림차순 정렬 (0) | 2022.08.17 |
---|---|
[자바] 싱글톤 패턴(Singleton pattern) (0) | 2021.07.14 |
[자바] 공격 프로그램 구현해보기 (0) | 2021.07.11 |
[자바] 상속 (0) | 2021.07.09 |
[자바] 업캐스팅, 다운캐스팅 / instanceof 연산자 (0) | 2021.07.08 |