2011-04-28 4 views
13

IOException을 이해하는데 도움이 필요합니다. 인터넷에서 많은 정보를 검토 한 후 오라클의 Java 웹 사이트에서 기술 사양을 검토했습니다.Java IOException 이해하기

나는 IOException 클래스에 대한 나의 이해가 정확하며 서브 클래스는 모두 "오류 메시지"또는 "리턴 코드"값이 없다는 것을 알고 있습니까?

메시지 및/또는 리턴 코드 값을 발행하려면 IOException catch 논리를 삽입해야합니다.

위의 내용이 참이라면 다양한 IOException 하위 클래스를 어떻게 분리 할 수 ​​있습니까?

응용 프로그램에서 IOException을 감지 한 경우 어떤 종류의 IOException입니까?

답변

17

예외 (일반적으로)에는 "반환 코드"값이 없지만 오류 메시지가 포함되어 있습니다. 그리고 처리 할 예외 유형을 지정할 수있는 catch 블록에서 처리해야합니다. 다른 유형의 예외를 다르게 처리하려면 try 블록 다음에 여러 catch 블록을 보유 할 수 있습니다. catch 블록은 지정된 순서대로 호출되고 적합한 매개 변수 유형을 가진 첫 번째 블록은 예외를 처리합니다. 따라서보다 구체적인 예외 유형을 먼저 파악한 다음보다 일반적인 예외 유형을 파악해야합니다.

단순한 예 : 마지막 catch 블록에서 보는 바와 같이

try { 
    ... 
    throw new FileNotFoundException("This is an error message"); 
    ... 
} catch (FileNotFoundException e) { 
    System.out.println("File not found: " + e.getMessage()); 
    ... 
} catch (EOFException e) { 
    System.out.println("End of file reached: " + e.getMessage()); 
    ... 
} catch (IOException e) { // catch all IOExceptions not handled by previous catch blocks 
    System.out.println("General I/O exception: " + e.getMessage()); 
    e.printStackTrace(); 
    ... 
} 

, 예외가 인쇄 할 수있는 기원의 스택 트레이스를 저장합니다. 그러나 일반적으로 여기 같은 메시지를 직접 인쇄하는 것은 좋지 않습니다. 실제 제작 코드에서는 일반적으로 로깅 프레임 워크를 사용하여 이러한 메시지를 기록하거나 UI에 해당 메시지를 표시하려고합니다.

1

instanceof를 사용하여 예외 또는 개체가 어떤 클래스인지 확인할 수 있습니다. 그러나 예외의 경우 catch 블록을 사용합니다. 다르게 IOException이 서브 클래스를 처리하기 위해

} catch(FileNotFoundException e) { 
    // file not found handling 

} catch(EOFException e) { 
    // handle reaching the End-Of_File. 

} catch(IOException e) { 
    // generic IOException handling for any other IOException. 

} 
1

, 당신과 같이, 개별적으로 잡을해야합니다 :

try { 
    // some code that may throw an exception 
} 
catch (EOFException e) { 
    // handle an end-of-file exception here) 
} 
... 
catch (IOException e) { 
    // handle an IOException that's not covered in previous catch statements 
} 
catch (Exception e) { 
    // handle any other kind of exception 
} 
3

오류 코드가 없지만, 자주가 메시지를. 예를 들어 파일 이름이나 잘못 된 내용을 식별하는 데 도움이되는 기타 세부 정보를 포함 할 수 있습니다.

얻을 수있는 예외에 대한 자세한 내용은 IOException의 하위 클래스를 참조하십시오.

처리하려면 다른 catch 문구를 사용할 수 있습니다. 좀 더 구체적인 예외에서 벗어나는 것을 잊지 마십시오. (첫 번째 블록에서 IOException을 잡으면 FileNotFoundException과 같은 더 구체적인 블록은 작동하지 않습니다). 때로는 다른 방법으로 하위 클래스를 처리 할 필요가없는 경우 단일 catch (IOException)으로 모든 항목을 잡을 수 있습니다.

try { 
    // ... 
} catch (FileNotFoundException e) { 
    // ... 
} catch (IOException e) { 
    // ... 
} 
2

예외 처리를 특정 방식으로 처리해야합니다 (모든 블록 잡기가 아닌). 후보자를 찾은 후에는 상속 트리에 따라 잡아야합니다. 먼저 더 구체적이고보다 일반적인 (하위 클래스에서 수퍼 클래스로).블랙리스트에 잡히는 예외가 너무 많아서 하나만 시도하면 예외를 try 블록으로 분할하는 것을 고려해야합니다.