Obj. 자바의 예외에 대해 학습.
Todo.
9-1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
9-2. 자바가 제공하는 예외 계층 구조
9-3. Exception과 Error의 차이는?
9-4. RuntimeException과 RE가 아닌 것의 차이는?
9-5. 커스텀한 예외 만드는 방법
9-3. Exception과 Error의 차이는?
프로그램 실행 중 오작동하거나 비정상적으로 종료되는 경우에 이 원인에 따라 프로그램 에러 혹은 오류라고 한다.
발생 시점에 따라 컴파일 에러, 런타임 에러등으로 나눌 수 있다.
오류(Error) : 시스템에 비정상적인 상황이 생김. try to catch를 하기 어려움.
예외(Exception) : 개발자가 구현한 로직에서 발생한 오류. try to catch 할 수 있음.
9-2. 자바가 제공하는 예외 계층 구조
Exception Hierachy
9-4. RuntimeException과 RE가 아닌 것의 차이는?
Checked Exception vs Unchecked Exception.
Checked는 컴파일 시점에서 확인 될 수 있는 예외이다. 이는 Exception Handler가 강제로 적용된다.
Unchecked는 컴파일 단계에서 확인 되지 않는 예외이며, 프로그래머가 알아서 처리를 해야한다.
9-1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
try-catch
예외 처리 하는 가장 기본적인 방법
try{
// 예외가 발생할 수 있는 가능성이 있는 코드
}catch(ExceptionType e1){
// 예외 발생 시 이를 처리하는 코드
}finally{
// 생략 가능하다.
// 예외가 발생해도 마지막에 실행이 됨.
}
try 블럭 안에 여러 catch 블록이 올 수 있으나, 해당 예외가 발생하면 더이상의 try의 순차적인 실행은 일어나지 않고, catch문을 실행 한 뒤 finally 문으로 진행한다.
Multi catch
Java 7버전 이후에는 하나의 catch 블록에서 다중 Exception Type을 지정할 수 있다. 사용은 " | "를 사용한다.
단 예외 클래스가 부모 자식관계에 있으면
try{
...
}catch( Exception_A | Exception_B e) {
...
}
try-with-resources
이전 try-finally에서 자바 라이브러리에서 사용되는 close메소들를 호출해서 닫아줘야 하는 자원이 많다. 이는 클라이언트가 놓치기 쉬워서 성능 저하를 유발할 수 있다. 이를 위해 finalizer를 사용 했지만 이는 Java 9에서 Deprecated 되었다. 자원을 회수하기 위할 때 사용한다.
try(BufferedReader br = new BufferedReader(new FileReader(path))){
...
}catch(IOException e){
...
}
}
throw vs throws
throw 키워드를 통해서 고의로 예외를 발생 할 수 있다. 특정 예외를 만났을 때 더욱 구체적인 예외로 처리하고자 할 때에 사용한다. 사용 시점에 무조건 예외가 발생한다.
throws 키워드는 메서드를 정의할 때 사용하며, 메서드 내에서 예외를 처리하지 않고 자신을 호출한 상위 메서드에서 예외를 처리한다.
public class A{
public static void main(String[] args){
Test test = new Test();
try{
test.test("1","!");
}catch(NumberFormatException e){
System.out.parinln("1");
}
}
}
}
class Test{
public void test(String a, String b) throws NumberFormatException{
try{
int sum = Integer.parsInt(a) + Integer.parsInt(b);
System.out.parinln("2");
}catch(NumberFormatException e){
System.out.parinln("3");
throw e;
}
}
}
/*--------------------------------------
출력 :
3
1*/
위와 같이 throw는 직접 예외를 날리는 것이다. 위는 throw 와 throws를 동시에 사용 한 것이며, 아래는 throws 만 사용 하는 경우이다.
public class A{
public static void main(String[] args){
Test test = new Test();
try{
test.test("1","!");
}catch(NumberFormatException e){
System.out.parinln("1");
}
}
}
}
class Test{
public void test(String a, String b) throws NumberFormatException{
int sum = Integer.parsInt(a) + Integer.parsInt(b);
System.out.parinln("2");
}
}
/*--------------------------------------
출력 :
1
*/
테스트 메서드에서 예외가 발생 했으나 throws로 호출한 메서드로 넘어가서 A의 메인에서 catch를 했다.
9-5. 커스텀한 예외 만드는 방법
java platform에서 자신만의 예외 클래스를 만들 수 있다.
1. 자바에서 표현되지 않는 타입의 예외가 필요할 때.
2. 다른 벤더가 작성한 클래스에서 제공한 예외 사항과 차별화 할 수 있다면?
3. 코드가 하나 이상의 관련 예외를 발생할때.
4. 다른 사용자의 예외를 사용할 때 해당 예외에 대한 액세스 권한이 사용자에게 부여되는가?
에 대해 조건이 부합된다면 예외 클래스를 만들어서 사용한다.
Custom Checked Exception
public class IncorrectFileNameException extends Exception {
public IncorrectFileNameException(String errorMessage) {
super(errorMessage);
}
public IncorrectFileNameException(String errorMessage, Throwable err) {
super(errorMessage, err);
}
}
---------------------------------------------------------------------------------
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine()) {
return file.nextLine();
}
} catch (FileNotFoundException e) {
if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException(
"filename is incorrect : " + fileName , e);
}
// ...
}
Custom Unchecked Exception
public class IncorrectFileExtensionException
extends RuntimeException {
public IncorrectFileExtensionException(String errorMessage, Throwable e) {
super(errorMessage, e);
}
}
---------------------------------------------------------------------------------
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine()) {
return file.nextLine();
}
} catch (FileNotFoundException e) {
if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException(
"filename is incorrect : " + fileName , e);
}
// ...
} catch (IncorrectFileExtensionException e) {
if(!containsExtension(fileName)) {
throw new IncorrectFileExtensionException(
"Filename does not contain extension : " + fileName, e);
}
//...
}
Reference
www.geeksforgeeks.org/exceptions-in-java/?ref=lbp
www.notion.so/9-17a778bba6ed4436ac3d7b9415b6babb
velog.io/@youngerjesus/%EC%9E%90%EB%B0%94-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC
'Java > [Whiteship]자바스터디' 카테고리의 다른 글
11주차 과제 : Enum (0) | 2021.02.28 |
---|---|
10주차 과제 : 멀티쓰레드 프로그래밍 (0) | 2021.01.27 |
8주차 과제 : 인터페이스 (0) | 2021.01.19 |
7주차 과제 : 패키지 (0) | 2021.01.18 |
6주차 과제 : 상속 (0) | 2021.01.17 |