예외를 발생시키는 이유
예외를 발생시키는 이유는 정보를 주기 위함입니다. 만약 예외라는 개념 자체가 없다면 어떻게 될까요?
만약 자바에 예외란 개념이 없는 상태에서 다음과 같이 문자열 비교연산을 하려는데 name에 객체의 참조값이 할당되지 않아 null을 참조하게 되었습니다.
그러나 예외라는 개념이 없기때문에 JVM은 별다른 행동을 하지 않고 프로그램을 종료시켜 버렸습니다.
만약 대기업의 쇼핑몰 서버를 개발했는데 회원 이름을 비교하다가 위와 같은 상황이 발생했다면 서버는 비 정상적으로 종료되었을 것이지만 해당 서버를 개발한 개발자는 어떠한 정보나 로그를 찾을 수 없을 것입니다.
name.equals("kim chul soo"); //NullPointerException이 발생 되어야 함
위와 같이 JVM에서는 표준 API에 정의한 여러가지 예외를 가지고 개발자에게 예외적인 상황의 정보를 제공합니다.
또한 어플리케이션을 개발함에 있어서 우리는 팀을 이루어 개발을 하게 됩니다. 개발자는 자신의 코드보다 남의 코드를 보는일이 훨씬 더 많으며 내가 짠 코드보다 남이 짜놓은 코드를 사용하는 일이 훨씬 많습니다. 때문에 내가 소스를 짤 때 상황에 맞는 예외를 발생시키는 코드를 작성함으로써 팀원이나 혹은 내가 만든 API, 라이브러리를 사용하는 이에게 정보를 제공해 주어 더욱 견고한 프로그램을 개발할 수 있도록 해야 합니다.
예외 발생시키기 - throw 사용
예외를 발생시킬 때에는 throw 키워드를 사용합니다.
throw는 말그대로 던지다 라는 뜻이며 예외를 강제로 던지는 것입니다. 그러나 예외를 던지기 위해서는 던질 예외의 객체가 필요합니다.
다음과 같이 new 연산자를 이용해 예외 객체를 만들어 던질 수 있습니다.
아래 코드는 그 다음 코드처럼 한줄로 줄여 사용할 수 있습니다.
public static void generateException(){
RuntimeException ex = new RuntimeException();
throw ex; //예외 발생
}
public static void generateException(){
throw new RuntimeException(); //예외 발생
}
Runtime 예외와 같이 강제로 잡아주지 않아도 되는 예외의 경우 특별한 처리를 해주지 않아도 되지만, 일반 예외와 같이 강제로 예외처리가 필요한 예외를 발생시킬 때에는 try-catch 문을 사용하든지 throws 키워드를 통해 밖으로 던져주어야 합니다.
public static void generateException(){
try{
throw new Exception();
}catch(Exception e){
//굳이 이런 코드를 짜는 일은 특별한 경우 말고 없다.
}
}
예외를 강제로 발생시키는 행동은 의도적으로 했기 때문에 다시 try-catch문으로 잡는 일은 특별한 경우가 아니면 없을 것입니다. 보통의 경우 다음과 같이 throws 를 통해 발생시킨 예외를 밖으로 던짐과 동시에 '현재 메서드를 사용하면 이와 같은 예외가 발생한다' 라는 정보를 알려줍니다.
public static void generateException() throws RuntimeException{
throw new RuntimeException();
}
public static void generateException() throws Exception{
throw new Exception();
}
예외 발생 응용
실제 응용으로는 다음과 같이 사용자 계정 중복확인 메서드를 구현 할 때 사용자 계정이 이미 존재하는 경우 나만의 예외를 만들어 두고 던지는 식의 활용이 가능합니다.
public class UserDao {
public boolean isExistUser(String userId) throws UserAlreadyExistException{
//db에 유저가 있는지 검사하는 로직
User user = userDao.findUserById(userId);
if(user != null){
throw new UserAlreadyExistException();
}
}
}
참고글
'자바[Java]' 카테고리의 다른 글
[JAVA] 자바 언어의 특징 (0) | 2018.02.15 |
---|---|
[JAVA] 사용자 정의 예외 (0) | 2017.12.29 |
[JAVA] 자바 예외 떠넘기기 - throws (1) | 2017.12.28 |
[JAVA] 자바의 탄생 및 역사 (0) | 2017.12.19 |
[JAVA] 자바 향상된 예외 처리 - try - with - resources 문 (0) | 2017.12.16 |