10.例外および例外クラス


この文章は私が勉強したものを整理したものです。

10.1異常と異常類


エラー:ハードウェア障害


例外:ユーザーのエラー操作、開発者のエラー符号化。


例外タイプ


-通常異常、運転異常


✔一般異常

  • のコンパイル中に、例外処理コードが必要かどうかを確認します.
  • 異常処理が必要なコードに異常処理コードがない場合、コンパイルエラーが発生します.*一般的な例外は、Exceptionを継承しますが、RuntimeExceptionは継承しません.
  • ✔運転異常


    コンパイル
  • では異常処理はチェックされません.
  • これらは
  • RuntimeExceptionを継承するクラスです.RuntimeExceptionもExceptionを継承しますが、JVMはRuntimeExceptionを継承するか否かによって実行異常を判断します.
  • 10.2運転異常


    10.2.1 NullPointerException


    10.2.2 ArrayIndexOutOfBoundException


    10.2.3 NuberFormatException


    10.2.4 ClassCastException


    10.3異常処理コード

    ✨일반 예외처리
    public class TryCatchFinallyExample {
    	
    	public static void main(String[] args) {
    		
    		try {
    			Class Class = Class.forName("java.lang.String2");
    		} catch (ClassNotFoundException e) {
    			System.out.println("클래스가 존재하지 않습니다.");
    			e.printStackTrace();
    		}
    	}
    
    }
    
    
    
    ✨실행예외처리 - 오로지 개발자의 경험에 의해 작성해주어야 한다.
    public class TryCatchFinallyRuntimeExceptionExample {
    
    	public static void main(String[] args) {
    		String data1 = null;
    		String data2 = null;
    
    		try {
    			data1 = args[0];
    			data2 = args[1];
    		} catch (ArrayIndexOutOfBoundsException e) {
    			System.out.println("실행 매개값의 수가 부족하다.");
    			System.out.println("[실행 방법]");
    			return;
    
    		}
    
    		try {
    			int value1 = Integer.parseInt(data1);
    			int value2 = Integer.parseInt(data2);
    			int result = value1 + value2;
    
    		} catch (NumberFormatException e) {
                 System.out.println("숫자로 변환 할 수 없습니다.");
    		} finally {
    			System.out.println("다시 실행 하세요.");
    		}
    	}
    
    }
    

    10.4異常タイプの処理コード


    10.4.1多catch

    public class CatchByExeptionKindExample {
    	public static void main(String[] args) {
    
    		try {
    			String data1 = args[0];
    			String data2 = args[1];
    
    			int value1 = Integer.parseInt(data1);// 여기는 실행이 안된다.
    			int value2 = Integer.parseInt(data2);
    			int result = value1 + value2;
    			System.out.println(data1 + "+" + data2 + "=" + result);
                
    		} catch (ArrayIndexOutOfBoundsException e) {
    			System.out.println("실행 매개값의 수가 부족하다.");
    			System.out.println("[실행 방법]");
    			
    
    		} catch (NumberFormatException e) {
    			System.out.println("숫자로 변환 할 수 없습니다.");
    		} finally {
    			System.out.println("다시 실행 하세요.");
    		}
    	}
    
    }

    catchブロックが複数あっても、1つだけ実行されます。tryブロックに複数の例外が同時に発生しないため、1つの例外が発生すると、直ちに実行を停止し、対応するcatchブロックに移動します。


    10.4.2 catch順序


    複数のcatchブロックを作成する際に注意したいのは、親例外クラスがサブ例外クラスの下にある必要があることです。子例外は親例外を継承するため、親例外タイプにも属します。


    10.4.3マルチキャプチャ

    public class MultiCatchExample {
    	public static void main(String[] args) {
    
    		try {
    			String data1 = args[0];
    			String data2 = args[1];
    
    			int value1 = Integer.parseInt(data1);
    			int value2 = Integer.parseInt(data2);
    			int result = value1 + value2;
    			System.out.println(data1 + "+" + data2 + "=" + result);
    		} catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
    			System.out.println("실행 매개값의 수가 부족하거나 숫자로 변환할 수 없습니다.");
    
    		} catch (Exception e) {
    			System.out.println("알수 없는 예외.");
    		} finally {
    			System.out.println("다시 실행 하세요.");
    		}
    	}
    
    }

    10.5リソースの自動クローズ


    Java 7に新しく追加されたtry-with-resourcesを使用すると、リソースオブジェクト(各種I/Oストリーム、サーバソケット、ソケット、および各種チャネル)のclose()メソッドを呼び出し、リソースを安全に閉じることができます。


    リソースを単純なデータ読み書きオブジェクトと見なします。

    FileInputStream fis = null;
    		try {
    			fis = new FileInputStream("file.txt");
    		} catch (FileNotFoundException e) {
    
    		} finally {
    			
    			if (fis != null) {
    				try {
    					fis.close();
    				} catch (IOException e) {
    
    				}
    			}
    		}
            
    //✨자바 7에서 새로 추가됬다.
    
    try (FileInputStream fis = new FileInputStream("file.txt")) {
    
    		} catch (IOException e) {
    
    		}
    //✨try 블록이 정상적으로 실행을 완료했거나 예외가 발생하게 되면 자동으로 
      FileInputStream의 close() 메소드가 호출된다.
      
    //✨복수개의 리소스를 작성할 수 도 있다.
    
    try (FileInputStream fis1 = new FileInputStream("file.txt");
    	   FileInputStream fis2 = new FileInputStream("file.txt")) {
    
    		} catch (IOException e) {
    
    		}
            
    //✨try - with - resources를 사용하기 위해서는 조건이 있는데
    리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.
    
    
    public class FileInputStream implements AutoCloseable {
    
    	private String file;
    
    	public FileInputStream(String file) {
    		this.file = file;
    	}
    
    	public void read() {
    		System.out.println(file + "를 읽습니다.");
    	}
    
    	@Override
    	public void close() throws Exception {
    		System.out.println(file + "를 닫습니다.");
    
    	}
    }
    
    
    
    
    public class TryWithResourceExample {
    	public static void main(String[] args) {
    
    		try (FileInputStream fis = new FileInputStream("file.txt")) {
    			fis.read();
    			throw new Exception();// 강제로 예외 발생
    		} catch (Exception e) {
    			System.out.println("예외처리 코드가 실행되었습니다.");
    		}
    	}
    
    }
    

    10.6転移異常


    メソッド内部で異常が発生する可能性のあるコードをtry-catch構文として異常を処理することは基本的であるが,異常を呼び出しメソッドの場所に移すこともできる.このとき使うキーワードはthrowsです。

    public void method1() {
    	try {
    			method2();
    		} catch (ClassNotFoundException e) {
    			System.out.println("클래스가 존재하지 않습니다.");
    			}
    }
    		
    		
     public void method2() throws ClassNotFoundException{
    	Class class = Class.forName("java.lang.String2");
    		}

    10.7カスタム異常と異常発生


    Javaが提供するクラスのみを使用して、さまざまな例外を表すことはできません。たとえば、銀行業務を処理するプログラムで、残高よりも多くの引き出し要求が受信されると、エラーが発生し、残高不足のエラーが発生する必要がありますが、残高不足のAPIはJavaには存在しません。この場合、開発者は自分で定義して作成する必要があるため、カスタム例外と呼ばれます。


    10.7.1ユーザー定義の例外クラス宣言

    public class BalanceInsufficientException extends Exception {
                //사용자 정의 예외 클래스 이름은 Exception으로 끝나는 것이 좋다.
                //사용자 정의 예외 클래스도 필드, 생성자, 메소드 선언들을 포함할 수 있지만,
                //대부분 생성자 선언만을 포함한다.
                //생성자는 두개가 일반적인데,하나는 기본생성자
                //다른 하나는 예외 발생 원인을 전달하기 위해 Stirng 타입의 매개 변수를 갖는 생성자이다.
                //String 타입의 매개변수를 갖는 생성자는 상위 클래스의 생성자를 
                //호출하여 예외 메시지를 넘겨준다.
    	public BalanceInsufficientException() {
    	}
    
    	public BalanceInsufficientException(String message) {
    		super(message);
    	}
    
    }
    
    
    public class Account {
    
    	private long balance;
    
    	public Account() {
    	}
    
    	public long getBalance() {
    		return balance;
    	}
    
    	public void deposit(int money) {
    		balance += money;
    	}
    
    	public void withdraw(int money) throws BalanceInsufficientException {
    
    		if (money > balance) {
    			throw new BalanceInsufficientException("잔고 부족: " + (money - balance) + "이 모자람.");
    		}
    		balance -= money;
    	}
    
    }
    
    
    
    
    public class AccountExample {
    
    	public static void main(String[] args) {
    		Account acc = new Account();
    		acc.deposit(10000);
    		System.out.println("예금액:" + acc.getBalance());
    		try {
    			acc.withdraw(30000);
    		} catch (BalanceInsufficientException e) {
    			System.out.println("meassage:" + e.getMessage());
    			System.out.println();
    			e.printStackTrace();
    		}
    	}
    }