본문 바로가기

# 02/Java

[윤성우 열혈자바] 18-2. 예외처리에 대한 나머지 설명들

반응형

예외 클래스의 구분



Error 클래스를 상속하는 예외 클래스


Exception 클래스를 상속하는 예외 클래스


RuntimeException 클래스를 상속하는 예외 클래스

-> RuntimeException 클래스는 Exception 클래스를 상속한다.




1. Error 클래스를 상속하는 예외 클래스들의 특성


Error 클래스를 상속하는 예외 클래스의 예외 상황은 시스템 오류 수준의 예외 상황으로 프로그램 내에서 처리 할 수 있는 수준의 예외가 아니다.




ex)  VirtualMachineError        가상머신에 심각한 오류 발생

IOError                        입출력 관련해서 코드 수준 복구가 불가능한 오류 발생




2. RuntimeException 클래스를 상속하는 예외 클래스들의 특성


코드 오류로 발생하는 경우가 대부분이다. 따라서 이 유형의 예외 발생시 코드의 수정을 고려해야 한다.




ex)  ArithmeticException

ClassCastException

IndexOutOfBoundsException

NegativeArraySizeException            배열 생성시 길이를 음수로 지정하는 예외의 발생

NullPointerException

ArrayStoreException                      배열에 적절치 않은 인스턴스를 저장하는 예외의 발생




3. Exception 클래스를 상속하는 예외 클래스들의 특성 

- 진정한 예외 클래스, try ~ catch 를 이용해서 예외처리 해줘야함! -> 안하면 컴파일러가 머라고 함!


코드의 문법적 오류가 아닌, 프로그램 실행 과정에서 발생하는 예외적 상황을 표현하기 위한 클래스들이다.

따라서 예외의 처리를 어떻게 할 것인지 반드시 명시해 주어야 한다.




ex) java.io.IOException                        입출력 관련 예외 상황을 표현하는 예외 클래스





Exception을 상속하는 예외의 예


public static void main (String[] args) {

Path file = Paths.get("C:\\javastudy\\Simple.txt");

BufferedWriter writer = null;


try {

writer = Files.newBufferedWriter(fiel);            // IOException 발생 가능

writer.write('A');                // IOException 발생 가능

writer.write('Z');                // IOException 발생 가능


if (writer != null)

writer.close();            // IOException 발생 가능

}

catch (IOException e) {

e.printStackTrace();

}

}


Exception을 상속하는 예외는 반드시 처리를 해야 한다. 그렇지 않으면 컴파일 오류로 이어진다!!





처리하거나 아니면 넘기거나


public static void main(String[] args) {

try {

md1();

}

catch( IOException e ) {

e.printStackTrace();

}

}


메소드의 throws절 선언을 통해 예외의 처리를 (호출한 곳으로) 넘길 수 있다.


public static void md1() throws IOException {

md2();

}


public static void md2() throws IOException {

Path file = Paths.get("C:\\javastudy\\Simple.txt");

BufferedWriter writer = null;

writer = Files.newBufferedWriter(file);                    // IOException 발생 가능

writer.write('A');                                    // IOException 발생 가능

writer.write('Z');                                    // IOException 발생 가능


if ( writer != null )

writer.clowe();                                // IOException 발생 가능

}






둘 이상의 예외 넘김에 대한 선언


public void simpleWrite() throws IOException, IndexOutOfBoundsException {


. . .

}






프로그래머가 정의하는 예외 클래스


Exception 클래스를 상속하는 것이 예외 클래스의 유일한 조건

class ReadAgeException extends Exception {                // Exception을 상속하는 것이 핵심


public ReadAgeException() {


super( "유효하지 않은 나이가 입력되었습니다." );

Throwable 클래스의 getMessage 메소드가 반환할 문자열 지정

}

}






프로그래머 정의 예외 클래스의 예


class MyExceptionClass {


public static void main(String[] args) {

System.out.print( "나이 입력 : ");


try {

int age = readAge();

System.out.printf( "입력된 나이 : %d \n", age );

}

catch (ReadAgeException e) {

System.out.println(e.getMessage());

}

}


public static int readAge() throws ReadAgeException {

Scanner kb = new Scanner(System.in);

int age = kb.nextInt();


if (age < 0)

throw new ReadAgeException();        // 예외의 발생


return age;

}

}



class ReadAgeException extends Exception {


. . .

}







잘못된 catch 구문의 구성


class FirstException extends Exception { . . . }

class SecondException extends Exception { . . . }

class ThirdException extends Exception { . . . }


try {

. . . 

}


catch (FirstException e) { . . . }

catch (SecondException e) { . . . }

catch (ThirdException e) { . . . }


컴파일러는 친절하게도 이 부분에 대해 컴파일 오류를 전달해 준다! - catch문 자리 바꿔주는 게 좋음.(상속관계)


 너무 복잡하게 예외 상황을 짜는것은 바람직하지 않음. 최대한 간단하게 하는 것이 좋다!!







finally


try {

. . .

}

finally {                        // 코드의 실행이 try 안으로 진입하면, 무조건 실행된다.

. . . 

}




try {

. . .

}

catch ( e) {

. . .

finally {                        // 코드의 실행이 try 안으로 진입하면, 무조건 실행된다.

. . .

}







finally 구문의 사용의 예 - 별로 안씀.....


public static void main(String[] args) {

Path file = Paths.get("C:\\javastudy\\Simple.txt");

BufferedWriter writer = null;


try {

writer = Files.newBufferedWriter(file);            // IOException 발생 가능

writer.write('A');                        // IOException 발생 가능

}

catch (IOException e) {

e.printStackTrace();

}

finally {

try {

if ( writer != null )

writer.clowe();            // IOException 발생 가능

}

catch (IOException e) {

e.printStackTrace();

}

}

}


실행의 흐름이 try 구문 안에 들어왔을 때 반드시 실행해야 하는 문장을 finally 구문에 둘 수 있다.

그러나! 보다 멋진 대안이 등장했다!






try-with-resources - 아주 좋음!!!!!!!!!!!!


try( BufferedWriter writer = Files.newBufferedWriter(file) ) {


writer.write('A');

writer.write('Z');

}

try 구문을 빠져 나갈 때 다음 문장을 안정적으로 자동 실행  - writer.close();


catch(IOException e) {


e.printStackTrace();

}



try-with-resources 기반의 오픈 및 종료 대상이 되기 위한 조건은 다음과 같다.


java.lang.AutoCloseable 인터페이스의 구현



반응형