[JAVA] 10. 例外処理


10.1例外クラス


エラー
コンピュータ障害によるプログラム実行エラー
例外
エラーのエンコーディングによるプログラムエラー(エラー)

例外と例外クラス


一般異常
コンパイラチェック異常
コンパイル中に対応する例外処理コードがあるかどうかを確認します.
java.lang.Exceptionクラス継承

実行例外
素子検出異常
コンパイル中に例外処理コードがあるかどうかを確認
java.lang.RuntimeExceptionクラス継承

実行例外


開発者が処理する必要がある例外処理コード

NullPointerException


オブジェクト参照なしでオブジェクトを使用する場合に発生する例外null값을 갖는 참조 변수로 객체 접근 연산자인 도트를 사용했을 때 발생
package sec01.exam01;

public class NullPointerExceptionExample {
	public static void main(String[] args) {
		String data = null; // data는 String 객체를 참조하지 않음
		System.out.println(data.toString()); // toString()메소드 호출
	}
}

ArrayIndexOutOfBoundsException


インデックス範囲外で例外が発生しました
package sec01.exam02;

public class ArrayIndexOutOfBoundsExceptionExample {
	public static void main(String[] args) {
        // 2개의 실행값을 주지 않았기 때문에 args[0], args[1] 인덱스 사용 못함
		String data1 = args[0]; 
		String data2 = args[1];
		
		System.out.println("args[0]: " + data1);
		System.out.println("args[1]: " + data2);
	}
}

例外が発生しないように変更

  • eclipse run-run構成-arguments-programパラメータに2つのパラメータを入力して実行します(配列、インデックス入力)

  • 配列値を読み込む前に、まず配列の長さをチェックし、パラメータ値がない場合は条件文を使用します.
  • package sec01.exam03;
    
    public class ArrayIndexOutOfBoundsExceptionExample {
    	public static void main(String[] args) {
    		if(args.length == 2) {
    			String data1 = args[0];
    			String data2 = args[1];
    			System.out.println("args[0]: " + data1);
    			System.out.println("args[1]: " + data2);
    		} else {
    			System.out.println("두개의 실행 매개값이 필요합니다.");
    		}
    	}
    }

    NumberFormatException


    数値に変換できない文字が含まれている場合に発生します.
    package sec01.exam04;
    
    public class NumberFormatExceptionExample {
    	public static void main(String[] args) {
    		String data1 = "100";
    		String data2 = "a100";
    				
    		int value1 = Integer.parseInt(data1);
    		int value2 = Integer.parseInt(data2); // NumberFormatException발생 
    		
    		int result = value1 + value2;
    		System.out.println(data1 + "+" + data2 + "=" + result);
    	}
    }

    ClassCastException


    タイプ変換は、親から子、インタフェースから実装クラスの間で発生します.
    この関係でない場合に例外が発生します
    package sec01.exam05;
    
    public class ClassCastExceptionExample {
    	public static void main(String[] args) {
    		Dog dog = new Dog();
    		changeDog(dog);
    		
    		Cat cat = new Cat();
    		changeDog(cat);
    	}
    	
    	public static void changeDog(Animal animal) {
    		//if(animal instanceof Dog) {
    			Dog dog = (Dog) animal; //ClassCastException 발생 가능
    		//} 
            // 위에서 Cat객체를 매개값으로 주어서 Dog 타입으로 변환 불가, 주석처리풀어야 통과
            
    	}
    }
    
    class Animal {}
    class Dog extends Animal {}
    class Cat extends Animal {}

    10.2異常処理


    例外処理
    異常が発生した場合は、突然のシャットダウンを防止し、正常に動作していることを確認してください.

    例外処理コード


    try-catch-finallyブロック


    try:異常が発生する可能性のあるコード
    catch:異常処理コード
    finally:常に実行
    try正常運転時にcatchをスキップしfinallyを実行
    通常の例外処理
    ClassNotFoundException:指定されたクラスがパラメータとして存在しない場合に発生します.
    package sec01.exam06;
    
    public class TryCatchFinallyExample {
    	public static void main(String[] args) {
    		try {
    			Class clazz = Class.forName("String2");
    		} catch(ClassNotFoundException e) { // String2 존재하지 않음
    			System.out.println("클래스가 존재하지 않습니다.");
    		}
    	}
    }
    
    > 클래스가 존재하지 않습니다.
    例外処理の実行
    package sec01.exam07;
    
    public class TryCatchFinallyRuntimeExceptionExample {
    	public static void main(String[] args) {
    		String data1 = null;
    		String data2 = null;
    		try {
                // 실행 매개값을 주지 않아서 catch에서 예외 발생
    			data1 = args[0];
    			data2 = args[1];
    		} catch(ArrayIndexOutOfBoundsException e) {
    			System.out.println("실행 매개값의 수가 부족합니다.");
    			return;
    		} 
    		
            // 여기서부터 2개의 실행값을 주게 되면 ('안녕', '하이')
    		try { 
    			int value1 = Integer.parseInt(data1);
    			int value2 = Integer.parseInt(data2);
    			int result = value1 + value2;
    			System.out.println(data1 + "+" + data2 + "=" + result);
    		} catch(NumberFormatException e) { // 숫자로 바꿀수 없는 문자 예외 발생
    			System.out.println("숫자로 변환할 수 없습니다.");
    		} finally {
    			System.out.println("다시 실행하세요.");
    		}
    	}
    }
    
    > 실행 매개값의 수가 부족합니다.
    // 두번째 try문을 실행하기 위해 여기서는 2개의 실행값을 줌    
    > 숫자로 변환할 수 없습니다.
    > 다시 실행하세요.    

    例外タイプの処理コード


    複数catch


    親例外クラスは、子例外クラスの下部にある必要があります.
    親例外クラスがcatchブロックの上にある場合、サブ例外クラスは実行されません.
    下尉が大尉を引き継いだので、大尉も例外タイプです.
    package sec01.exam09;
    
    public class CatchOrderExample {
    	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("실행 매개값의 수가 부족합니다.");
    		} catch(Exception e) {
    			System.out.println("실행에 문제가 있습니다.");
    		} finally {
    			System.out.println("다시 실행하세요.");
    		}
    	}
    }

    てんいれいがい


    メソッドは、例外を処理していない場所のロールを呼び出します.
    throws Exceptionのみですべての例外を除外
    throwsキーを持つメソッドはtry文で呼び出さなければなりません.&catchブロックから投げ出される例外を処理する必要があります
    package sec01.exam10;
    
    public class ThrowsExample {
    	public static void main(String[] args) {
    		try {
    			findClass(); // try내에 호출한 메소드 존재해야
    		} catch(ClassNotFoundException e) { // 떠넘겨 받은 예외 처리
    			System.out.println("클래스가 존재하지 않습니다.");
    		}
    	}
    	
    	public static void findClass() throws ClassNotFoundException {
    		Class clazz = Class.forName("java.lang.String2");
    	}
    }
    mainメソッドでthrowsキーを使用して例外をスキップした場合、JVMは処理します.
    JVMがコンソールに例外を出力
    ただし、優先されていない方法->TRY - CATCH 써라!