AVA DAY 20-異常処理


例外処理


エラー

  • コンパイルエラー:コンパイル時に発生したエラー(赤い線)
  • 論理エラー:実行可能だが動作と意図が異なる(エラー)
  • 運転時エラー:運転時に発生したエラー
  • ランタイムエラー

  • 実行時にエラーが発生した場合、プログラムは異常終了します.
  • エラー:プログラムコードで修正できない重大なエラー(処理不能)
  • 例外:プログラムコードに発生する可能性のある軽微なエラー(処理可能)
  • 例外

  • すべての例外はExceptionクラスのサブクラスである.
  • RuntimeExceptionクラスおよびそのサブクラスは異常処理を強制しない.
  • [Runtime Exception類およびその子を除く]
  • Exceptionクラスの子供は例外処理を強制された.
  • 異常処理(try-catch)

  • 異常処理によりプログラム異常終了を防止できます.
  • try catch(Exception e){}→ブロック内の内容とパラメータタイプは同一であること.
  • try blockの内容が運転中に異常が発生した場合はcatchに移動します.
  • catchの()で処理できる例外を指定します.
  • 複数の例外を処理するために、catchは1つ以上来ることができる.
  • 発生した異常と一致するcatch block内の内容を実行してtry-catchを離れる.
  • 発生した異常と一致するcatchがなければ、異常は処理しない.
  • 例外
    int result = 10 / 0; //정수를 0으로 나눌 수 없다.(실수의 경우 가능)
    System.out.print(result);
    例外処理
    try{
    	int result = 10 / 0; //정수를 0으로 나눌 수 없다. (실수의 경우 가능)
    	System.out.println(result);
    }catch(ArithmeticException | IndexOutOfBoundsException e){
    	e.printStackTrace(); //에러 메시지를 출력한다.
    }catch(NullPointerException e){	
    
    }catch(Exception e){
    	//모든 예외 처리
    }
    
    //파라미터가 여러개일 경우 , 가 아닌 |로 구분한다

    87*∗コンソールウィンドウコンパイルエラーの原因を確認
    典型的な例外
    //IndexOutOfBoundsException -> 배열의 인덱스를 벗어났다.
    int[] arr = new int[5];
    System.out.println(arr[5]);
    
    //NullPointerException -> null에서 참조했다.
    String str = null;
    System.out.println(str.charAt(1));
    ∗*∗ CallStack
    | test2 |
    | test1 |
    | main |
  • 上出構造
  • 最後のデータは上に蓄積したデータが出てくるまで待たなければならない.
  • finally

  • 必要に応じてtry-catchの後にfinallyを追加できます.
  • finallyは例外の有無にかかわらず最後に実行される.
  • public static void main(String[] args) {
    	FileInputStream fis null;
    
    	fis = new FileInputStream("d:file.txt"); // 컴파일 에러
    	//컴파일에러 Ctrl + 1
    	//Surround with try/catch
    }
    public static void main(String[] args) {
    	FileInputStream fis = null;
    		
    	try {
    		fis = new FileInputStream("d:file.txt");
    	} catch (FileNotFoundException e) {
    		e.printStackTrace();
    	}finally{ //finally
    		fis.close(); //컴파일에러
    	}
    }
    
     // ↓
    
    public static void main(String[] args) {
    		
    	FileInputStream fis = null;
    		
    	try {
    		fis = new FileInputStream("d:file.txt");
    	} catch (FileNotFoundException e) {
    		e.printStackTrace();
    	}finally{
    		try {
    			fis.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    87*∗異常発生:try→catch→finally/異常発生なし:try→finally

    自動リソースリターン(JDK 1.7)

    try(FileOutputStream fos = new FileOutputStream("d:/file.txt")){
    	String str = "아무내용이나 써보자...";
    			
    	byte[] bytes = str.getBytes();
    			
    	for(int i = 0; i < bytes.length; i++){
    		fos.write(bytes[i]);
    	}
    }catch(Exception e){
    	e.printStackTrace();
    }

    異常をきたす

  • throw new Exception( );
  • throw予約語と例外類の対象は、故意に例外を発生させることができる.
  • IOException ioe = new IOException( );
    
    try {
    	throw ioe;
    }catch (IOException e) {
    	e.printStackTrace();
    } //이런게 있다 그냥 알아만두자
    		
    throw new NullPointerException(); //예외처리를 하지 않아도 된다.

    メソッドに例外を宣言

  • メソッド呼び出し時に発生する可能性のある例外
  • void method( ) throws IOException { }
  • メソッドの実施部が終了すると、throws予約語と例外クラス名を用いて例外を宣言することができる.
  • 例外を宣言した場合、例外処理は行わず、独自のメソッドを呼び出して例外処理を行う.
  • public static void main(String[] args) {
    	try {
    		method();
    	}catch (IOException e) {
    		e.printStackTrace();
    	}
    }
    
    private static void method() throws IOException {
    	throw new IOException();
    }