1. 직접 처리
해당 메서드 내에서 try ~ catch 블럭 처리
public static String readString1() {
byte [] bf = new byte[100];
System.out.println("readString1 ) 문자를 입력하세요.");
System.in.read(bf);
//컴파일 오류 : Unhandled exception…
}
Java의 system.in.read()메서드는 입력 스트림에서 바이트를 읽어들이는 과정에서 다양한 예외가 발생할 수 있기 때문에 이를 처리할 필요가 있다. 입력 및 출력 작업 중에 발생하는 예외로, 스트림이 닫혔거나, 입출력 장치가 사용 불가능한 경우에 발생 → IOException
즉 system.in.read 는 IOException 을 던질 수 있기 때문에 try - catch 가 필요하다.
없다면 컴파일 오류가 발생한다.
IOException 은 Checked Exception 임으로 try—catch 가 필수.
public static String readString1() {
byte [] bf = new byte[100];
System.out.println("readString1 ) 문자를 입력하세요.");
try {
System.in.read(bf);
} catch (Exception e) {
System.out.println("catch , Exception(toString) : "+e.toString() );
//Exception 이라고 하면 괜찮으나 , runtimeException 으로는 대체가 불가하다 계보가 같지 않기 때문,
//정확하게 IOException ( 만약 IOException 으로 사용시 import 필수)
}
return new String(bf) ;
}
2. 위임 처리 (throws Exception)
Exception 처리를 상위 메서드로 위임(떠넘기기)
방법 : header 에 thows를 추가
떠넘겼을 경우 , 메인에서 메서드를 사용하게 될 경우 오류 발생.
메인 메서드의 사용시 try - catch를 의무 사용해야한다.
메인 메서드 또한 떠넘기기가 가능하다.
메임 메서드 내에서 발생할 수 있는 예외를 호출자(즉, JVM)에게 전달.
예외를 메인 메서드에서 직접 처리하지 않고, 해당 예외를 상위 호출자에게 위임한다.
public static void main (String[] args) throws Exception {
System.out.println("main ) readString 2 : "+readString2());
}
예외를 직접 처리하지 않고 상위 호출자인 JVM에 예외를 전달한다.
이는 프로그램이 예외 상황에서 종료될 수 있음을 의미.
일반적으로 메인 메서드에서는 중요한 예외를 잡아서 사용자에게 적절한 메시지를 보여주거나 프로그램을 안정적으로 종료하기 위한 처리를 하는 것이 좋다.
런타임 오류의 Exception 처리에 대하여
java 의 컴파일러가 Exception 처리 확인하지 않음
즉, 반드시 try ~ catch 구문 을 적용하지 않아도 됨.
그러나 필요시엔 throws 로 처리 가능
상위의 메서드에서도 Exception 처리가 의무조항은 아님
즉, 반드시 try ~ catch 구문 구현 하지 않아도 컴파일 오류 없음.
public static void intByZero() throws ArithmeticException{
int i = 10/0;
}//byZero
public static void arrayIndex() throws ArrayIndexOutOfBoundsException{
int arr[] =new int[3];
arr[3] =100;
}//ArrayIndexOutOfBounds
unchecked Exception 은 throws 했어도 call 한 메서드 내의 try-catch 구현은 의무가 아님
계속 상위로의 위임도 가능하다.
→ throws 했어도 try-catch 의 의무가 없음 . Exception 발생시 비정상 종료가 생김.
throw 생성
예외생성
throw : 예외(Exception) 생성하기 (사전던지다)
throws: 예외(Exception) 전달하기 (떠넘기기, 사전던지다)
- Unchecked Exception 생성
System.out.println("program 시작");
throw new RuntimeException();
- Checked Exception 생성
throw new Exception();
try catch 블럭안에 없다면 , checked Exception 임으로 바로 오류발생.
System.out.println("program 시작");
try {
throw new Exception();
} catch (Exception e) {
System.out.println("catch block ,throw new Exception();,
Exception(toString) : "+e.toString() );
}
System.out.println("program 종료");
- 조건을 활용하여 Exception 생성
내가 원하는 특정 상황에 대한 Exception 으로 정의 할 수 있음.
인스턴스를 정의 할 수 있고 , 일회적으로 사용한다면 인스턴스 없이 사용할 수 있다.
[ ✔️ 1 회적 사용의 Exception(none instance) ]
System.out.println("program 시작");
try {
double result = 1.5/0.0 ;
if(Double.isInfinite(result)) {
throw new Exception("인자를 통한 message 입력도 가능하다 result = "+ result);
}
System.out.println("reult = "+result); //if 로 빠지면 실행되지 않음의 구문
} catch (Exception e) {
System.out.println("catch block , Exception(toString) : "+e.toString() );
}
System.out.println("program 종료");
[ ✔️ 다회적 사용의 Exception (instance) ]
Exception myE = new Exception("인자를 통한 message 입력도 가능하다 result = "+ result);
throw myE ;
사용자 정의 Exception
1 . unchecked 할 것인지 checked 할 것인지 결정.
2 . Exception 정의 → 클래스 생성하여 Exception을 상속받는다.
3 . 생성자 메서드를 통해 정의하여 준다.
[ ✔️사용자 정의 Exception 정의 ]
//1 .unchecked Exception
class AgeException extends RuntimeException {
private static final long serialVersionUID = 1L;
public AgeException() {
super("나이 값이 범위를 벗어남");
}
public AgeException(String s) {
super(s);
}
}
//2. checked Exception
class AgeExceptionck extends Exception {
private static final long serialVersionUID = 1L;
public AgeExceptionck() {
super("나이 값이 범위를 벗어남");
}
public AgeExceptionck(String s) {
super(s);
}
}
[ ✔️메서드 정의 , 조건에 부합하지 않으면 사용자 정의 Exception 발생 ]
//1 .unchecked Exception
public static int readAge() {
System.out.println("unchecked 나이를 입력하세요");
int age =Integer.parseInt(sc.nextLine());
if(age <19 || age> 50) throw new AgeException();
return age;
}
//2. checked Exception
public static int readAgeck() throws AgeExceptionck{
System.out.println("checked 나이를 입력하세요");
int age =Integer.parseInt(sc.nextLine());
if(age <19 || age> 50) throw new AgeExceptionck("점심 뭐먹지 ?");
return age;
}
[ ✔️실행 - unchecked Exception ]
public static void main(String[] args) {
readAge();
}
[ ✔️실행 - checked Exception ]
public static void main(String[] args) {
try {
readAgeck();
}catch (AgeExceptionck e) {
System.out.println("main -> AgeExceptionck :"+e.toString());
}catch (Exception e) {
System.out.println("main -> Exception :"+e.toString());
}
}
'Developer > JAVA' 카테고리의 다른 글
JAVA , JAVA와 데이터베이스 연동을 통한 데이터 처리 (2) | 2024.10.30 |
---|---|
JAVA , 인터페이스 , 인터페이스와 추상클래스의 차이 (1) | 2024.10.28 |
Java , 예외 처리 Exception , try-catch (0) | 2024.09.22 |
JAVA , 열거형 클래스 enum ! (1) | 2024.09.21 |
JAVA , 추상 클래스의 다형성 보기 (1) | 2024.08.08 |