[throw, throws의 차이]
- throw: 에러를 고의로 발생시킬 때 사용
- throws: 자신을 호출한 상위 메소드로 에러 처리의 책임을 전가 시킴.
[throw]
예외를 강제로 발생시킨 후 catch문을 통해 예외를 처리한다.
public static void main(String[] args) {
middleMethod();
}
private static void middleMethod() {
myException();
}
public static void myException() {
try{
throw new Exception();
}catch (Exception e){
System.err.println("myException 메서드에 오류 발생!");
}
}
//실행결과 : myException에서 예외처리
myException 메서드에 오류 발생!
[throws]
예제1: 메인메서드에서 myException의 예외처리를 하기
public static void main(String[] args){
try{
myException();
}catch (Exception e){
e.printStackTrace();
System.err.println("메인메서드에서 처리를 진행함.");
}
}
//익셉션이 발생한다는 것을 알려주지 않았기 때문에 throws를 명시하지 않으면 오류가 난다.
//throws를 통해 상위 메서드에 처리를 넘겨야 한다.
public static void myException() throws Exception{
throw new Exception("myException 메서드에 오류 발생!");
}
//실행결과 : 메인메서드에서 예외처리를 진행함.
java.lang.Exception: myException 메서드에 오류 발생!
at ThrowExceptionPractice.myException(ThrowExceptionPractice.java:16)
at ThrowExceptionPractice.main(ThrowExceptionPractice.java:6)
메인메서드에서 처리를 진행함.
예제2: throws를 받는 경우 예외처리를 진행해주기
public static void main(String[] args){
middleMethod();
}
//여기에서 myException 메서드에서 발생하는 예외를 처리해주고 있어서 메인메서드에서는 오류가 나지 않는다.
private static void middleMethod() {
try{
myException();
}catch (Exception e){
e.printStackTrace();
System.err.println("middleMethod에서 처리를 진행함");
}
}
public static void myException() throws Exception{
throw new Exception("myException 메서드에 오류 발생!");
}
//실행결과
java.lang.Exception: myException 메서드에 오류 발생!
at ThrowExceptionPractice.myException(ThrowExceptionPractice.java:20)
at ThrowExceptionPractice.middleMethod(ThrowExceptionPractice.java:12)
at ThrowExceptionPractice.main(ThrowExceptionPractice.java:6)
middleMethod에서 처리를 진행함
예제3: 예외처리의 책임을 계속 상위 메서드에 넘기기
//아무도 책임 지지 않는다..
public static void main(String[] args) throws Exception {
middleMethod();
}
private static void middleMethod() throws Exception {
myException();
}
public static void myException() throws Exception{
throw new Exception("myException 메서드에 오류 발생!");
}
//실행결과
Execution failed for task ':ThrowExceptionPractice.main()'.
> Process 'command '/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
[throw + throws 조합하여 사용]
예외처리를 예외가 발생한 메서드에서도 하고, 호출부에서도 처리를 하고 싶을 때 사용할 수 있다.
public static void main(String[] args) {
middleMethod();
}
private static void middleMethod() {
try{
myException();
}catch (Exception e){
System.err.println("middleMethod에서 오류 발생!");
}
}
public static void myException() throws Exception {
try{
throw new Exception(); //아래의 catch문에서 처리된다.
}catch (Exception e){
System.err.println("myException 메서드에 오류 발생!");
//throw를 통해 호출메서드에도 예외를 던지게 된다. throws를 함께 명시해주어야 한다.
throw e;
}
}
//실행결과
myException 메서드에 오류 발생!
middleMethod에서 오류 발생!
[참조]
https://devlog-wjdrbs96.tistory.com/141
https://tlatmsrud.tistory.com/49
'Java' 카테고리의 다른 글
팩토리 메소드 디자인 패턴 (0) | 2022.11.26 |
---|---|
Windows 환경에 Zulu JDK 설치하기 (0) | 2022.11.20 |
유틸성 클래스를 만들기 위해 private 접근제어 활용하기 (0) | 2022.11.19 |
Checked Exception, UncheckedException (0) | 2022.11.14 |
ClassPath (클래스패스) 란? (0) | 2022.10.27 |