throw : 명시적으로 예외를 발생시킬 때 사용하는 키워드
예외를 강제로 발생시킨 후, 상위 블럭이나 catch 문으로 예외를 던진다!!!!!📝예제
public static void main(String[] args) {
try {
Exception e = new Exception("고의로 예외 발생"); // 예외 클래스 객체 생성
throw e; // 예외 발생 -> throw new Exception("고의로 예외 발생"); 로 줄여 쓸 수 있음
} catch(Exception e) {
System.out.println("예외메시지 : " + e.getMessage());
e.printStackTrace();
}
}
💻출력 결과
예외메시지 : 고의로 예외 발생
java.lang.Exception: 고의로 예외 발생
at week04.sample01.Sample.main(Sample.java:6)
throws : 메서드 호출시 발생가능한 예외를 호출하는 쪽에서 처리하도록 한다
throws Exception1, Exception2,....,ExceptionN { // 메서드내용 }📝예시
public static void thisMethodIsDangerous() throws Exception {
throw new Exception("메소드에서 예외 던짐");
}
public static void main(String[] args) {
try {
thisMethodIsDangerous();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
thisMethodIsDangerous() 메서드에 예외를 선언 main() 메서드에서 thisMethodIsDangerous() 호출시 예외 처리에 대한 경고 알려줌main() 메서드에서 try-cath 로 예외처리 진행사용자가 집적 예외 클래스를 정의
Exception과 RuntimeException 중에서 선택하여 상속받는다.
문자열을 매개변수로 받는 생성자 있어야 한다.
📝정의
//사용자 정의 예외 클래스 정의
class MyException extends Exception{
MyException(String msg){ // 문자열을 매개변수로 받는 생성자
super(msg); // 부모인 Exception 클래스의 생성자를 호출
}
}
예외를 처리한 후 다시 예외를 발생시키는 것
호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것
📝예제
static void myException() throws Exception { //예외 선언
try {
throw new Exception("예외 던지기");
} catch (Exception e) {
System.out.println("메소드에서 예외 처리하기");
throw e; // 예외 다시 던지기(예외 다시 발생)
}
}
public static void main(String[] args) {
try {
myException();
} catch (Exception e) {
System.out.println("main에서 다시 예외 처리하기");
}
}
💻출력 결과
메소드에서 예외 처리하기
main에서 다시 예외 처리하기
myException()
1. throw new Exception("예외 던지기"); 예외 발생
2. 메소드 catch 블럭에서 예외 처리
3. throw e; 다시 예외 발생 → 호출한 쪽으로 예외 넘기기
main()
4. catch 블럭에서 다시 예외 처리
한 예외가 다른 예외를 발생시킬 수 있다.(예외 A가 예외 B를 발생시키면 A는 B의 원인 예외)
사용하는 이유
Throwable initCause(Throwable cause) : 지정한 예외를 원인 예외로 등록
Throwable getCause() : 원인 예외를 반환
📝예제
public class Throwable implements Serializable {
private Throwable cause = this; // 객체 자기자신을 원인 예외로 등록
public synchronized Throwable initCause(Throwable cause){
this.cause = cause; // cause를 원인 예외로 등록
return this;
}
}
void install() throws InstallException{
try{
starInstall(); // SpaceException 발생(저장공간이 부족해서)
copyFiles();
}catch(SpaceException e){
InstallException ie = new InstallException("설치중 예외발생"); //예외 생성
ie.initCase(e); //InstallException의 원인 예외를 SpaceException으로 지정
throw ie; //InstallException을 발생
}
}
프로그램 설치를 하는 install() 이라는 메서드라고 할때
1. startInstall() 에서 SpaceException이 발생 -> catch 블록이 처리
2. catch 블록(SpaceException e) -> 새로운 예외 B를 생성(InstallException)
3. ie.initCase(e); -> SpaceException 을 InstallException의 원인 예외로 등록해줬다
4. throw ie; -> InstallException을 발생
SpaceException - InstallException : 연결된 예외!