등장 배경
C언어 시절에는 예외처리를 if문(if, else if, else)으로 처리했다. 단점은 실행코드와 예외처리 코드가 지나치게 반복되고, 실행코드보다 예외처리코드가 훨씬 더 많아지게 되었다. 그러므로 코드의 가독성이 낮아지는 결과도 생겼다.
그래서 C++은 실행코드 영역과 예외처리 영역을 분리하는 예외처리 문법을 도입하였다. 자바는 C++을 모태로 탄생되었고, C++에 비해서 예외처리를 훨씬 더 강화해 설계하였다.
상속 구조
예외(Exception)와 에러(Error)는 모두 Throwable의 상속을 받는다. 예외는 내(프로그래머)가 짠 코드 상의 문제가 있는 것으로 코드를 수정하면 해결되고, 에러는 시스템 상에서 발생한 비정상적인 상황으로 프로그래머의 통제를 받지 않는다.
Finally
try ~ catch 문에서 예외상황 발생 유무와 관계없이 실행되는 구문. close(); 등을 넣을 때 활용한다.
public static boolean divider(int num1, int num2) {
try {
int result = num1/num2;
System.out.println("나눗셈 결과는 "+result);
return true;
} catch (ArithmeticException e) {
System.out.println(e.getMessage());
return false;
}finally {
System.out.println("finally 영역 실행");
}
}
Throws
예외처리를 해당 매서드/클래스에서 자신을 호출한 곳으로 넘김. 단, Main 매서드로 throw 하게 되면 JVM으로 넘기게 된다. 예외를 바로 처리하지 않더라도 실행코드와 예외처리 코드를 분리하고, 한번에 처리할 수 있어 코드의 가독성이 좋아진다. printStackTrace() 또는 getMessage()를 통해 예외의 자세한 내용(예외가 어디에서, 왜 발생했는지)을 확인할 수 있도록 한다.
public static PersonalInfo readPersonalInfo() throws AgeInputException, NameLengthException{
String name = readName();
int age = readAge();
PersonalInfo pInfo = new PersonalInfo(name, age);
return pInfo;
}
public static String readName() throws NameLengthException{
System.out.println("이름 입력");
String name = keyboard.nextLine();
if(name.length()<2) // 이름이 두글자보다 짧을때
throw new NameLengthException(name); // 강제로 예외 발생시키겠다
return name;
}
public static int readAge() throws AgeInputException{
System.out.println("나이 입력");
int age = keyboard.nextInt();
if(age<0) // 나이가 0보다 작을때
throw new AgeInputException(); // 강제로 예외 발생시키겠다
return age;
}
public static void main(String[] args) {
try {
PersonalInfo readInfo = readPersonalInfo();
readInfo.showPersonalInfo();
} catch (AgeInputException e) {
e.printStackTrace();
} catch(NameLengthException e){
e.showWrongName();
e.printStackTrace();
}
}
Exception 종류
- ArithmeticException
- ArrayIndexOutOfBoundsException
- ArrayStoreException
- ClassCastException
- ClassNotFoundException
- CloneNotSupportedException
- EnumConstantNotPresentException
- Exception
- IllegalAccessException
- IllegalArgumentException
- IllegalMonitorStateException
- IllegalStateException
- IllegalThreadStateException
- IndexOutOfBoundsException
- InstantiationException
- InterruptedException
- NegativeArraySizeException
- NoSuchFieldException
- NoSuchMethodException
- NullPointerException
- NumberFormatException
- ReflectiveOperationException
- RuntimeException
- SecurityException
- StringIndexOutOfBoundsException
- TypeNotPresentException
- UnsupportedOperationException
'Programming > Java * Spring' 카테고리의 다른 글
[Java] 13. StringTokenizer 사용법, 예제 (0) | 2019.04.01 |
---|---|
[Java] 12. Math Class - BigDecimal, BigInteger, MathContext (0) | 2019.04.01 |
[Java] 10. 인터페이스(Interface), 의존성 주입 (0) | 2019.03.28 |
[Java] 09. 추상클래스(abstract) (0) | 2019.03.27 |
[Java] 08. 매서드 오버라이딩(Method Overriding), 오버로딩과의 차이 (0) | 2019.03.26 |