Java
TIL | Java - 예외처리
개발 공부
2022. 10. 19. 13:35
예외처리
예외란?
1. 컴파일 에러 : 문법적으로 틀린 에러
2. 런타임 에러 : 실행 에러
- Errror : 심각한 에러 (프로그램내에서 처리할 수 있는 에러가 아님)
ex) StackOverflowError 등 - Exception : 미약한 에러 (프로그램 내에서 처리 가능한 에러)
예외처리란?
에러에 대한 처리, 사전에 에러가 발생할 때를 대비하여 처리 방안을 제시
주요 실행 에러(예외)
- NullPointerException (NPE) : 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수
- ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
- NumberFormatException : 문자열로 되어 있는 데이터를 숫자로 변경하는 경우에 발생
- ClassCastException : 형변환은 부모클래스 - 자식클래스, 인터페이스 - 구현 클래스의 관계가 아니라면 다른 클래스로 타입을 변환할 수 없다.
외울 필요까지는 없다.
예외 처리 방법
1. try~ catch~ finally
- try 블록 : 예외 발생 가능성이 있는 코드 작성
- catch 블록 : 에러 발생시 처리 내용
다중 catch 블록 작성 가능합니다.( 단, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 합니다. 아래 예외 처리 클래스 상속 참고 ) - finally 블록 : 에러이든 아니든 상관없이 실행되는 블록
❗️ 🔗 scan 무한루프 탈출하기
public static void main(String[] args) {
String[] arr = {"홍길동","이순신","홍길자"};
int i = 0;
while(i < 4) {
try {
System.out.println(arr[i]);
} catch (Exception e) {
System.out.println("범위를 벗어났습니다.");
} finally {
System.out.println("이 문장은 예외 여부와 상관없이 항상 실행됨");
}
i++;
}
}
2. throws : 예외 떠넘기기
- 메서드 안에서의 예외처리
- 메서드나 생성자를 호출한 곳으로 예외를 떠넘기는 코드
- throws가 붙어있는 반드시 메서드는 try 블록 내부에서 호출되어야 한다.
- throws가 있다면 "예외가 발생될 수 있는 코드이니 호출시 try catch로 묶어 사용하세요"라고 강요하는 코드
//*** throws Exception과 try catch 구문의 차이!
public ThrowsEx02_test() throws Exception{
System.out.println("생성자 호출");
aaa();
System.out.println("생성자 종료");
}
public void aaa() throws Exception{
System.out.println("aaa 시작");
bbb(1);
System.out.println("aaa 종료");
}
public void bbb(int i) throws Exception{
System.out.println("bbb 시작");
//*try {
// System.out.println(i/0);//예외
//} catch (Exception e) {
// System.out.println("0으로 나눌 수 없습니다");
//}
System.out.println(i/0);
System.out.println("bbb 종료");
}
}
public static void main(String[] args) {
//생성자에 대한 예외처리!
try {
ThrowsEx02 ex = new ThrowsEx02();
} catch (Exception e) {
System.out.println("0으로 나눌 수 없습니다");
//e.printStackTrace();
}
}
3. throw : 예외 강제 발생 시키기
- throw 구문은 강제 예외를 발생시키며 메서드를 종료한다.throws 예외 떠넘기기 구문으로 함께 처리한다.
public class TrowEx01 {
public static void main(String[] args) {
try {
System.out.println(clac(10));
System.out.println(clac(-10));
} catch (Exception e) {
e.printStackTrace(); //예외 내용을 로그로 출력해주는 기능
System.out.println(e.getMessage()); //예외 생성시에 만들어진 메세지를 확인할 수 있음
}
}
public static int clac(int n)throws Exception{
if(n < 0) {
throw new Exception("0이상으로 값을 전달하세요!!"); //예외 강제생성 -> 예외를 생성하면 예외처리 구문이 필요합니다.
//예외 객체 생성
//return; 반환값이 없기에 오류
}
int sum = 0;
for(int i = 0; i <= n; i++){
sum+=i;
}
return sum;
}
}
//잘못된 값이 전달되면 예외를 만들어서 메서드를 강제종료하세요
🏁 QUIZ
* 1. 스캐너로 정수 2개를 입력받습니다.
* 2. 입력된 값이 정수라면 합계를 반환합니다.
* 3. 예외가 발생될 수 있는 상황이라면 throw를 이용해서 메서드를 종료하고 예외메세지를 전달해주시면 됩니다.
* 4. scan.close()는 finally 문장에서 사용하세요.
public static int input() throws Exception{
Scanner scan = null; //지역변수라 초기화 필요! / 멤버변수는 자동 초기화!
try {
scan = new Scanner(System.in);
int num1 = scan.nextInt();
int num2= scan.nextInt();
return num1 + num2;
} catch (Exception e) {
throw new Exception("숫자로 입력하세요");//예외생성
} finally {
scan.close();
//문제는 딱히 없지만 형식상 해주는게 좋다.
}
}