예외
예외는 프로그램 실행중 발생하는 오류중에서 처리가 가능한것(= 프로그램 중지X)을 말한다.
개발자가 조치할 수 없는 수준의 오류를 에러(Error), 수습될 수 있는 비교적 덜 심각한 오류를 예외(Exception)이라고 한다.
예외처리
예외가 발생했을때 적절히 처리하여 프로그램이 비정상적으로 종료되는 것을 막는것이다.
try - catch / finally
try - catch는 예외를 처리하기 위한 구문으로, 예외가 발생할수 있는곳에 try를 넣고 catch는 예외가 발생할 경우의 처리 방법을 작성한다.
try { // try가 해당 영역의 오류발생을 감시
int a = 0;
int b = 3;
int c = b/a; // 3을 0으로 나누려 시도하면 오류발생
}
catch(Exception e) { // 오류가 발생하면 자동으로 catch가 실행되며, 프로그램이 끝나지 않음
System.out.println("산술 오류발생"); // 오류메시지 출력
}
위의 코드는 숫자를 0으로 나누게 되면 by zero 에러가 뜨면서 프로그램이 중지되어야하지만
try - catch를 이용하여 try 범위 안에서 오류 발생을 감지하게 되면 catch가 자동으로 실행되어
프로그램 중지를 막고, 오류메시지를 출력하게 하는 코드이다.
try - catch의 특징으로는 try에서 오류가 발생하면 오류가 발생한 줄 다음에 있는 코드는 건너 뛰고
바로 catch로 넘어가기 때문에 오류가 나더라도 반드시 출력해야 하는 코드를 사용할때 주의해야한다.
또한 자바에서는 에러와 예외를 객체를 이용해 관리하기 때문에,
모든 예외는 Exception 클래스의 자식이다.
그렇기 때문에 catch로 잡아낼 데이터 타입을 Exception으로 지정하면,
대부분의 예외를 catch로 처리할 수 있다.
이는 다형성에서 B 클래스가 A 클래스의 자식일 때,
매개변수의 데이터 타입을 A로 지정하면 B 객체를 처리할 수 있는 것과 같은 개념이다.
finally문
finally문은 try - catch문에 선택적으로 적용되며, try문에서 오류가 발생하던 안하던 상관없이 실행되는 코드이다.
바로 위의 try - catch문의 반드시 사용해야하는 코드를 처리하기에 좋다.
예시)
Scanner sc = new Scanner(System.in); // 스캐너 명령어로 스캐너 사용
try {
System.out.println("나이를 입력하세요"); // 나이를 입력 하라는 안내문
int age = sc.nextInt(); // 입력 : "가나다"
System.out.println("안녕하세요"); // 위에서 오류가 발생하여 출력되지 않음
}
catch(Exception e) { // try에서 오류 발견시 즉시 실행
System.out.println("오류발생"); // 오류메시지 출력
}
finally {
sc.close(); // 스캐너 종료
System.out.println("finally는 반드시 실행")
}
위와같이 finally는 닫지 않으면 메모리 낭비로 이어질수 있는 스캐너문 종료 등을 오류 여부와 상관없이 실행 하기 위해서 사용한다.
throw(예외 발생)
프로그래머가 고의로 예외를 발생시킬수도 있는데, 대표적으로 입력받은 값이 허용범위를 넘겼을때가 있다.
사용자로부터 나이를 입력받을때 1이상의 정수면 입력을 받는다고 제한했다고 가정하면
age 변수에 말도 안되는 숫자를 입력 받을 가능성이 있다.
이런 경우에 고의로 프로그램에 예외를 발생시켜 사용자로 부터 다시 값을 입력받도록 한다.
고의로 예외를 발생하게 하는 명령어는 throw로,
사용 방법으로는
try{
Exception e = new Exception("고의 예외");
throw e; // 예외 발생
}
catch(Exception e) {
System.out.println("예외 발생")
System.out.println(e.getMessage()); // 출력 : 고의 예외
}
위와 같은 방식으로 사용한다.
throws(예외 던지기)
예외 던지기는 예외가 발생할때 바로 처리하지 않고 자신을 호출한 쪽으로 예외 처리를 넘긴다.
public class test {
void methodA() throws Exception { // 예외 발생시 호출자에게 넘김
methodB(); // 메서드 A에서 메서드 B 호출
}
void methodB() throws Exception { // 예외 발생시 호출자에게 넘김
Exception e = new Exception();
throw e; // 메서드 B 예외발생
}
public static void main(String[] args) {
try {
methodA(); // 메인 메서드에서 메서드A 호출
}
catch(Exception e) { // 메인 메서드에서 예외 처리
System.out.println("main 메서드에서 처리");
}
}
}
위의 코드가 실행되는 순서를 알아보자면
코드는 항상 메인메서드부터 시작되고, 메서드A를 호출한다.
호출된 메서드A에서는 메서드B를 호출한다.
메서드B에서 예외가 발생하였으며, 메서드B는 throws에 의해 메서드A에게 예외 처리를 넘긴다.
메서드A도 throws 처리가 되어있어 메인메서드로 예외처리를 넘긴다.
예외처리를 넘겨받은 메인메서드에서 try와 catch를 이용해 예외를 처리한다.
throws를 이용해 예외 처리를 넘길경우 예외를 한곳에 모아서 처리할수 있지만,
예외를 넘기는 중에 손실이 일어날수 있으므로 가급적 사용하지 않는게 좋다.
'프로그래밍 공부' 카테고리의 다른 글
2025.01.24 java 공부 (0) | 2025.01.24 |
---|---|
2025.01.23 java 공부 (0) | 2025.01.23 |
2025.01.21 java 공부 (0) | 2025.01.21 |
2025.01.20 java 정리 (0) | 2025.01.20 |
2025.01.17 java 공부 (0) | 2025.01.17 |