[2017/2/19] Project Java: CH 8. 예외처리 코드

CH 8. 예외처리 코드
1. try – catch
public class Hello{
public static void main (String[] args){
int number = 100;
int result = 0;

for(int i = 0; i < 10; i ++){
try{
result = number / (int)(Math.random() * 10);
System.out.println(result);
}
catch(ArithmeticException e){
System.out.println(“0”);
}
}
}
}

2. try – catch문에서의 흐름
public class Hello{
public static void main(String[] args){
System.out.println(1);
System.out.println(2);
try{
System.out.println(3);
System.out.println(0/0);
System.out.println(4);
}
catch(ArithmeticException ae){
System.out.println(5);
}
System.out.println(6);
}
}

3. Exception 클래스 타입의 참조변수를 catch 블록 제일 마지막에 넣기
public class Hello{
public static void main(String[] args){
try{
System.out.println(0/0);
}
catch(ArithmeticException ae){
if(ae instanceof ArithmeticException){
System.out.println(“true”);
}
System.out.println(“ArithmeticException”);
}
catch(Exception e){
System.out.println(“Exception”);
}
}
}

4.
public class Hello{
public static void main(String[] args){
System.out.println(1);
try{
System.out.println(2);
System.out.println(0/0);
System.out.println(4);
}
catch(ArithmeticException ae){
ae.printStackTrace();
System.out.println(ae.getMessage());
}
System.out.println(5);
}
}

5. 예외 발생시키기
public class Hello{
public static void main(String[] args){
System.out.println(1);
try{
System.out.println(2);
System.out.println(0/0);
System.out.println(4);
}
catch(ArithmeticException ae){
ae.printStackTrace();
System.out.println(ae.getMessage());
}
System.out.println(5);
}
}

6. 예외 전달하기
-main 까지 예외를 호출한 메서드에 전달하고 main에서도 해결 안되면 종료된다.
public class Hello{
public static void main(String[] args){
System.out.println(1);
try{
System.out.println(2);
System.out.println(0/0);
System.out.println(4);
}
catch(ArithmeticException ae){
ae.printStackTrace();
System.out.println(ae.getMessage());
}
System.out.println(5);
}
}

-발생한 예외를 처리하지 못하면 프로그램은 비정상적으로 종료되며, 처리되지 못한 예외는 JVM의 예외처리기가 받아서 예외의 원인을 화면에 출력한다.

7. 예외 전달하기 2
public class Hello{
public static void main(String[] args){
System.out.println(1);
try{
System.out.println(2);
System.out.println(0/0);
System.out.println(4);
}
catch(ArithmeticException ae){
ae.printStackTrace();
System.out.println(ae.getMessage());
}
System.out.println(5);
}
}

8. 예외 전달하기 3
public class Hello{
public static void main(String[] args){
try{
method1();
}
catch(Exception e){
System.out.println(“main에서 처리됨”);
e.printStackTrace();
}
}

static void method1() throws Exception{
throw new Exception();
}
}

-이 상황에서는 호출된 메서드에서 throws 키워드 있어야 한다.

9. 파일 입력 및 생성에서의 예외 사용
import java.io.*;

public class Hello{
public static void main(String[] args){
try{
File f = createFile(“”);
System.out.println(f.getName()+” 파일이 성공적으로 생성되었습니다”);
}
catch(Exception e){
System.out.println(e.getMessage()+”다시 입력하셈”);
}
}

static File createFile(String fileName) throws Exception{
if(fileName == null || fileName == “”){
throw new Exception(“파일 이름이 유효하지 않단다. “);
}

File f = new File(fileName);
f.createNewFile();
return f;
}
}

10. finally
public class Hello{
public static void main(String[] args){
method1();
System.out.println(“method1() 수행 마치고 main으로 돌아옴”);
}

static void method1(){
try{
System.out.println(“method1()이 호출되었습니다”);
return;
}
catch(Exception e){
e.printStackTrace();
}
finally{
System.out.println(“method1()의 finally 블록이 실행되었습니다”);
}
}
}
-설사 try블록에 return이 있더라도 finally 먼저 실행한 후에 return된다.

11. 자동 자원 반환
public class Hello{
public static void main(String[] args){
try(CloseableResource cr = new CloseableResource()){
cr.exceptionWork(false);
}
catch(WorkException e){
e.printStackTrace();
}
catch(CloseException e){
e.printStackTrace();
}

System.out.println();

try(CloseableResource cr = new CloseableResource()){
cr.exceptionWork(true);
}
catch(WorkException e){
e.printStackTrace();
}
catch(CloseException e){
e.printStackTrace();
}
}
}

class CloseableResource implements AutoCloseable{
public void exceptionWork(boolean exception) throws WorkException{
System.out.println(“exceptionWork (“+exception+”) 가 호출됨”);

if(exception){
throw new WorkException(“WorkException 발생”);
}
}

public void close() throws CloseException{
System.out.println(“close()가 호출됨”);
throw new CloseException(“CloseException 발생”);
}
}

class WorkException extends Exception{
WorkException(String msg){
super(msg);
}
}

class CloseException extends Exception{
CloseException(String msg){
super(msg);
}
}
-CloseableResource 클래스에는 반드시 close()가 선언되어 있어야 한다.

12.
public class Hello{
public static void main(String[] args){
try{
startInstall();
copyFiles();
}
catch(SpaceException e){
System.out.println(“에러 메시지 “+e.getMessage());
e.printStackTrace();
}
catch(MemoryException e){
System.out.println(“에러 메시지 “+e.getMessage());
e.printStackTrace();
}
}

static void startInstall() throws SpaceException, MemoryException{
if(!enoughSpace()){
throw new SpaceException(“설치할 공간이 부족합니다.”);
}
if(!enoughMemory()){
throw new MemoryException(“메모리가 부족합니다.”);
}
}

static void copyFiles(){
System.out.println(“파일 복사!”);
}

static void deleteTempFiles(){
System.out.println(“임시 파일 삭제”);
}

static boolean enoughSpace(){
return false;
}

static boolean enoughMemory(){
return true;
}

}

class SpaceException extends Exception{
SpaceException(String msg){
super(msg);
}
}

class MemoryException extends Exception{
MemoryException(String msg){
super(msg);
}
}
-예외는 클래스다
-사용자 정의 예외 만들 때도 따로 클래스 만들어야 한다.
-그러니까 throw 할 때도 new 키워드 쓰는 것 아닌가.

13. 예외 되던지기
public class Hello{
public static void main(String[] args){
try{
method1();
}
catch(Exception e){
System.out.println(“main”);
}
}

static void method1() throws Exception{
try{
throw new Exception();
}
catch(Exception e){
System.out.println(“method1()”);
throw e;
}
}
}

14. 연결된 예외
-한 예외가 다른 예외를 발생시킴
public class Hello{
public static void main(String[] args){
try{
install();
}
catch(InstallException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
}

static void install() throws InstallException{
try{
startInstall();
copyFiles();
}
catch(SpaceException e){
InstallException ie = new InstallException(“설치 중 예외 발생”);
ie.initCause(e);
throw ie;
}
catch(MemoryException e){
InstallException ie = new InstallException(“설치 중 예외 발생”);
ie.initCause(e);
throw ie;
}
finally{
deleteTempFiles();
}
}

static void startInstall() throws SpaceException, MemoryException{
if(!enoughSpace()){
throw new SpaceException(“설치할 공간이 부족합니다.”);
}
if(!enoughMemory()){
throw new MemoryException(“메모리가 부족합니다.”);
}
}

static void copyFiles(){
System.out.println(“파일 복사!”);
}

static void deleteTempFiles(){
System.out.println(“임시 파일 삭제”);
}

static boolean enoughSpace(){
return false;
}

static boolean enoughMemory(){
return true;
}

}

class InstallException extends Exception{
InstallException(String msg){
super(msg);
}
}

class SpaceException extends Exception{
SpaceException(String msg){
super(msg);
}
}

class MemoryException extends Exception{
MemoryException(String msg){
super(msg);
}
}
-결과:
임시 파일 삭제
InstallException: 설치 중 예외 발생
at Hello.install(Hello.java:20)
at Hello.main(Hello.java:4)
Caused by: SpaceException: 설치할 공간이 부족합니다.
at Hello.startInstall(Hello.java:36)
at Hello.install(Hello.java:16)
… 1 more

-여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함

댓글 남기기