[예외란?]
:프로그램 실행 중 발생하는 오류 중 처리가 가능한 것을 의미
- 에러: 개발자가 조치를 취할 수 없는 수준 ex) 메모리 부족, JVM 동작 이상
- 컴파일 에러: 컴파일 시 발생하는 에러 ex)오타, 잘못된 자료형 등
- 런타임 에러: 프로그램 실행 도중에 발생하는 에러
- 로직 에러: 실행은 되지만 의도와는 다르게 동작하는 에러
- 예외: 다른 방식으로 처리 가능한 오류 ex) 입력값 오류, 네트워크 문제
*예외가 발생할 때 이를 적절히 처리하여 프로그램이 비정상적으로 종료되는 것을 막기 위해 예외처리를 해야한다.
[try-catch-finally]
-사용법-
try{
예외가 발생할 수 있는 명령;
try문에서 예외가 발생한다면, 즉시 catch문으로 이동한다
} catch(발생할 수 있는 예외 클래스명){
예외 발생 시 실행할 명령;
예외가 발생하지 않는다면 catch문으로 이동하지 않는다.
} finally{
예외가 발생하든 안하든 무조건 실행하는 명령;
사용하지 않아도 이상없음;
}
[객체로서의 예외]
-모든 예외 클래스들은 Exception클래스를 상속받으므로 Exception으로 한번에 처리가 가능하다.
-catch문안에서 예외들의 객체가 생성되므로 Exception클래스의 메서드가 사용가능하다.
ex)getMessage(), toString(), printStackTrace()..
1. throw 예외발생
:프로그래머가 고의로 예외를 발생 시킬 때 사용하는 방법
<사용법>
Exception e = new Exception("오류메시지");
throw e;
->Exception 클래스는 생성자 오버로딩이 되어있어 오류메시지가 강제되지 않는다.
class MyException extends Exception{
MyException(String message){
super(message);
}
}
public class Test03 {
public static void main(String[] args) {
MyException myExcep = new MyException("1~3이외의 입력은 불가능합니다.");
Scanner sc=new Scanner(System.in);
while(true) {
System.out.print("입력>> "); // 1~3
try {
int num=sc.nextInt();
if(num<1 || 3<num) {
throw myExcep;
// throw는 일부러 예외를 발생시키기때문에,
// 반드시 try-catch가 필요함!!!
}
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
//결과
//입력>> 5
//1~3이외의 입력은 불가능합니다.
-> 예외클래스를 상속받아서 나만의 예외클래스를 정의
기존에는 예외가 아니었던 사항을 예외처리한다.
- 상세설명(message) 설정강제==> Exception은 기본 생성자가 제공되고있기에 강제x
- 미확인 예외들(Exception)과 섞임 방지
2.throws 예외던지기
:예외가 발생했을 경우 현재 메서드가 예외를 처리하지 않고 자신을 호출 한 쪽으로 예외 처리에 대한 책임을 넘기는 것
<사용법>
void method() throws Exception{}
예외 던지기시, 메서드 선언부에 throws키워드를 붙여, 메서드 호출하는 부분에서 처리하도록 한다.
예외처리에 대한 로직이 여러개 중복 될 수 있기 때문에 예외처리를 미루어 한곳에서 처리함으로 유지보수성이 증가한다.
public class Test02 {
static void func1() throws Exception{
// 예외처리를, 호출한 대상에게,공간으로 미루겠습니다!
int a=10,b=0;
System.out.println(a/b);
System.out.println("func1()함수 종료!");
}
static void func2() throws Exception {
Exception excep=new Exception("예외!!!");
throw excep;
}
// 예외처리에 대한 로직이 여러개 중복될수있기때문에, => 유지보수에 굉장히 불리함!!!!!
// 예외처리를 미루어처리합니다.
public static void main(String[] args) {
try {
func2();
func1();
} catch (Exception e) {
System.out.println(e.getMessage());
}
// func1()함수는, 현재 예외처리를 미루어 main메서드에서 처리해 주어야한다.
}
}
'JAVA' 카테고리의 다른 글
day15) MVC패턴 기본구조 (0) | 2022.01.14 |
---|---|
day14) 파일 입출력 (0) | 2022.01.14 |
day12) 컬렉션 프레임워크2 (0) | 2022.01.11 |
day11)[컬렉션 프레임워크]ArrayList (0) | 2022.01.10 |
day09) 인터페이스 (0) | 2022.01.02 |
댓글