일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 메세지수정
- application.yml
- querydsl
- ㅔㄴ션
- foreignkey
- 네이티브쿼리
- 2 > /dev/null
- docker명령어
- appspec.yml
- 포트
- Query
- 추후정리
- AuthenticationEntryPoint
- WeNews
- 테스트메소드
- 서브쿼리
- EC2
- appspec
- subquery
- 컨테이너실행
- 예약
- 커밋메세지수정
- 참조키
- 메소드명
- 적용우선순위
- 검색
- 테스트
- ubuntu
- MySQL
- 외부키
- Today
- Total
제뉴어리의 모든것
java 예외처리 - throw, throws 본문
자바에서 예외처리를 사용할때 사용하는 throw와 throws를 실습으로 알아보자.
결론부터 말하면,
throw는 프로그래머가 필요에 의해 직접 예외를 던질때 쓰는 키워드.
throws는 예외가 발생됬을 경우 해당 메소드를 호출한 상위로 이 상황을(예외처리)를 전가한다는 키워드이다.
아래와 같은 구조의 일반 java 프로젝트가 있다.
- CustomException : 직접 만든 Exception 클래스
- main : main 함수를 가진 클래스
- service : 테스트를 위한 임의의 클래스
아래는 main 클래스의 현재 코드이다.
package exception;
public class main {
public static void main(String[] args) {
service ser = new service();
System.out.println("main 이전");
ser.throwTest();
System.out.println("main 이후");
}
}
아래는 CustomException 클래스
package exception;
public class CustomException extends RuntimeException{
String code;
public CustomException(String code) {
this.code = code;
}
}
아래는 service 클래스
package exception;
public class service {
public service() {
}
public void throwTest() {
int[] ints = new int[0];
System.out.println("throwTest 이전");
if(ints.length < 1)
{
}
System.out.println("throwTest 이후");
}
}
본인은 보통 위와 같이 어떤 배열에 대하여 크기가 정상적이지 않을 경우 if문을 상황에 맞게 처리를 하였다.
이럴 경우 저 배열이 만약 유저의 정보를 가져온 것이였다고 한다면,
클라이언트단에서 검증처리가 제대로 이루어지지 않아 들어왔던지 아니면 서버에서 애초에 정상적으로 값을 저장하지 못하여서 가져올때 문제가 생기는 경우일 수가 있다.
두가지 어떤 상황이든 저 if문 안에서는 더이상 무언가 처리를 해줄것이 없고 다만 클라이언트에게 에러를 나타내고 이후 무언가 처리를 방지해야한다.
그리고 그 에러메세지 또한 무언가 프로그래머가 의도한 모습으로 출력이 되어야 할것이다.
만약 그게 웹앱 상황이라면
package exception;
public class service {
public service() {
}
public void throwTest() {
int[] ints = new int[0];
System.out.println("throwTest 이전");
if(ints.length < 1)
{
throw new CustomException("Too short length"); //추가 코드
}
System.out.println("throwTest 이후");
}
}
위와 같이 일부러 예외를 발생시켜 클라이언트에게 에러 메세지를 나타낼 수 있고 더이상 코드 진행을 안 시킬 수 있다.
그러나 저 경우는 그냥 throw new CustomException("Too short length"); 에서 에러를 내고 프로그램이 뻗어 버릴것이다.
즉, 예외를 발생 시켰을 뿐 예외 처리가 된것이 아니다.
그럴 경우에 throws를 써줄 수 있다.
아래와 같이 메소드 옆에 적용할 수 있다.
public void throwTest() throws Exception
Exception을 쓴것은 모든 예외의 조상격의 클래스이기 때문이다.
그리고 Exception 클래스는 Throwable extends하고 있다.
그러므로 메소드를 호출한 상위에게 에러 메세지를 전가할 수 있도록 해준다.
하지만 저렇게 throws 를 이용하여 호출부분에게 예외를 던지면
메소드를 호출 하는 부분에 에러가 난다. 그 의미는...
해당 메소드는 진행도중 예외 발생시 호출부분에 예외를 던지니까 처리를 해놓으라는것이다.
그래서 아래와 같이 직접 try~catch를 써서 처리를 하든
package exception;
public class main {
public static void main(String[] args) {
service ser = new service();
System.out.println("main 이전");
try{ //추가 코드
ser.throwTest();
}
catch (Exception e)
{
}
System.out.println("main 이후");
}
}
아래와 같이 또 throws로 상위로 예외를 던지면 에러가 나지 않는다.
package exception;
public class main {
public static void main(String[] args) throws Exception { //throws 추가 코드
service ser = new service();
System.out.println("main 이전");
ser.throwTest();
System.out.println("main 이후");
}
}
그러나 위와같이 한다면 메인함수보다 더 상위는 없으므로 결국 처음과 똑같이 아무런 처리 없이 예외가 터져 프로그램이 뻗을것이다.
이러한 차이와 결과를 참고하여 예외처리를 잘 해보도록하자.
'JAVA' 카테고리의 다른 글
배열 내용 출력하기 (0) | 2022.05.15 |
---|---|
남궁성님의 자바의 정석 정리 1 (0) | 2021.04.18 |
워크스페이스/프로젝트/패키지/클래스의 개념 및 명명 규칙 (0) | 2021.04.07 |
자바 Array 특정값으로 초기화 하는 방법 (0) | 2021.04.03 |
Arrays.copyOf , Arrays.copyOfRange 배열 복사 (0) | 2021.04.03 |