JavaをJava 13(Exception Handling,Errors)に変換

45502 ワード

Errors in Programs


Javaで発生する可能性のあるエラー
  • Compile-time error
    コンパイルで生成されたエラーでオブジェクトファイルを作成できません
    Syntax error
  • Run-tume error
    コンパイルにエラーやオブジェクトファイルの作成の問題はありません
    ただし、プログラム実行不可
  • Logical error
    プログラムは正常に動作していますが、私たちが望んでいる結果はありません.

    Run-time error


    Run-time errorはerrorsとexceptionに分けられる.

  • Error
    プログラムの実行を続行できません
    ex> out of memory, stack overflow

  • Exceptions
    エラーが発生しましたが、解決策があります.
    ex>算術異常(0で割った場合)、class cast exception、null pointer exception、index out-of-bounds exception
    したがって、プログラマはhandlerを宣言して異常に対応することができます.
  • Erros and Exceptions



    Javaでは、これらの例外もオブジェクト化されています.したがって、Throwaクラスの下には、上図のようにError、Exception、RuntimeExceptionが存在する
    RuntimeException :
    ArrayIndexOutOfBounds Exception、NullPoception、ClassCastException、Arithetic Exceptionなど.
    Exception :
    FileNotFoundException, ClassNotFoundException, DataFormatException

    Exception Handling: try-catch


    Javaでtry-catchブロックを使用してエラーを処理し、tryでエラーが発生した場合、catchはエラーを処理し、プログラムを続行します.
    try {
    	// 에러가 날 수 있는 것을 여기에 삽입
    } catch (Exception1 e1) {
    	// Exception1에 해당되는게 발생시 여기에서 처리
    } catch (Exception2 e2) {
    	// statements that will be executed when Exception2 occurs.
    	try { } catch (Exception3 e3) { }
    	// try-catch blocks can be nested. In that case, the parameters (e2 and e3) must be different.
    } catch (ExceptionN eN) {
    	// statements that will be executed when ExceptionN occurs.
    }

    Exception Handling: Example

    public class Lecture {
    	public static void main(String args[]) {
    		int number = 100;
    		int result = 0;
    		for(int i=0; i<10; i++) {
    			result = number / (int)(Math.random() * 10);
    			System.out.println(result);
    		}
    	}
    }

    上の図に示すように、0から90の間の数字を0に分割すると、エラーの出力文が表示されます.
    そのため、この問題を解決するために、以下の内容を書くべきです.
    public class Lecture {
    	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");
    			}
    		}
    	}
    }

    The catch Block


    もう一度catch blockを考えてみましょう
    public class Lecture {
    	public static void main(String args[]) {
    		try {
    			System.out.println(3);
    			System.out.println(0/0); // ArithmeticException!
    			System.out.println(4);
    		} catch (Exception e) {
    			System.out.println(5);
    		}
    	}
    }
    Exceptionオブジェクトを受信するcatch文が宣言されました.しかし、発生したのはArithemicExceptionです.つまり、サブクラスに相当するものはスーパークラスでも受け入れられる.
    では、複数の例外がある場合、どうすればいいのでしょうか.
    public class Lecture {
    	public static void main(String args[]) {
    		try {
    			System.out.println(3);
    			System.out.println(0/0); // ArithmeticException!
    			System.out.println(4);
    		} catch (ArithmeticException e) {
    			System.out.println("ArithmeticException occurred!");
    		} catch (Exception e) {
    			System.out.println("Exception occurred!");
    		}
    	}
    }
    この場合、上記の手順に従って作成し、最初のcatch blockからエラーを処理できるかどうかを検証してください.ここで注意すべき点は,サブクラスができるだけスーパークラスの上にあることである.

    printStackTrace() and getMessage()


    エラーが発生した場合、私たちは何をしますか.通常はprintStackTrace()とgetMessage()をたくさんします.
    public class Lecture {
    	public static void main(String args[]) {
    		try {
    			System.out.println(3);
    			System.out.println(0/0); // ArithmeticException!
    			System.out.println(4);
    		} catch (ArithmeticException ae) {
    			ae.printStackTrace();
    			System.out.println("exception message: " + ae.getMessage());
    		}
    	}
    }
    printStackTrace:エラーが発生するまで、どのパスからその位置に到達するかを決定する関数です.
    getMessage:オブジェクトからエラーメッセージを取得します.

    Generating an Exception


    故意に例外を作ることもできます.
    public class Lecture {
    	public static void main(String args[]) {
    		try {
    			Exception e = new Exception("I created the exception."); // becomes the exception message.
    			throw e;
    		} catch (Exception e) {
    			System.out.println("exception message: " + e.getMessage());
    			e.printStackTrace();
    		}
    		System.out.println("The program terminated normally.");
    	}
    }
    例外を処理するオブジェクトを作成し、throwを使用してExceptionを処理します.

    Mandatory and Optional Exception Handling


    場合によっては、File Not FoundなどのExceptionを実行する必要があります.
  • 管理(checked exception):HandlingのException
  • が必要
    public class Lecture {
    	public static void main(String args[]) {
    		throw new Exception("My exception.");
    	}
    } // compile error!
  • オプション(チェックされていない例外):選択的に処理する必要があるException
  • public class Lecture {
    	public static void main(String args[]) {
    		throw new ArithmeticException("My exception.");
    	}
    } // no error!
    では、上記の状況をどのように区別しますか?
    ExceptionクラスのサブクラスではRuntime Exceptionを除きMandatoryとなる.
    Runtime Exceptionの代表はArithemicExceptionです.

    Methods that throw exceptions


    例外処理を行わない方法もある.
    public class Lecture {
    	public static void main(String args[]) {
    		method1();
    	}
    	static void method1() {
    		method2(); // Error: must handle Exception or throw Exception.
    	}
    	static void method2() throws Exception {
    		throw new Exception();
    	}
    } // compile error!
    throws Exceptionは、エラーが発生した場合を処理しないことを意味します.では、メソッド2はエラー処理を行う必要はないが、この場合method 2を呼び出すメソッド1はエラー処理を行わなければならない.
    ではmethod 1でもthrows Exceptionを使うと?
    public class Lecture {
    	public static void main(String args[]) {
    		method1(); // Error: must handle Exception or throw Exception.
    	}
    	static void method1() throws Exception {
    		method2();
    	}
    	static void method2() throws Exception {
    		throw new Exception();
    	}
    } // compile error!
    最終的にmainからエラーが発生しました.
    mainまでthrows Exceptionしたら?
    public class Lecture {
    	public static void main(String args[]) throws Exception {
    		method1();
    	}
    	static void method1() throws Exception {
    		method2();
    	}
    	static void method2() throws Exception {
    		throw new Exception();
    	}
    } // no error at compile time but will cause program to crash at run time.
    実行できますが、クラッシュします.
    だから、上の問題を解決するために、以下の表に記入しなければならない.そうすれば、問題は起こらない.
    public class Lecture {
    	public static void main(String args[]) {
    		method1();
    	}
    	static void method1() {
    		try {
    			method2();
    		} catch(Exception e) {
    			System.out.println("Exception handled in method1");
    			e.printStackTrace();
    		}
    	}
    	static void method2() throws Exception {
    		throw new Exception();
    	}
    } // OK! method1 handles the Exception
    ここでもう少し指摘します.前回の授業で、ファイルの処理方法を発表したと同時に、throws IOExceptionも発表したことを覚えています.しかし、FileOutputStream内部でthrows FileNotFoundExceptionが宣言されているため、これはよくありません.
    import java.io.FileOutputStream;
    import java.io.IOException;
    public class Lecture {
    	public static void main(String[] args) throws IOException {
    		FileOutputStream output = new FileOutputStream("src/cse3040/out.txt");
    		String str = "hello world";
    		byte[] bytes = str.getBytes();
    		output.write(bytes);
    		output.close();
    	}
    }
    したがって、上記のコードも可能な限りtry-catch文宣言が必要です.

    The finally Block


    ではfinally blockについて説明しましょう.
    finally blockはtry blockで異常が発生するかどうかにかかわらず実行しなければならないblockです.
    try {
    	// statements that can cause exceptions.
    } catch (Exception1 e1) {
    	// statements for handling Exception1
    } finally {
    	// this block is executed whether or not an exception occurs in the try block.
    	// this block must be placed at the end of a try-catch block.
    }
    しかし、以下に示すようにtry内でreturnを実行するとどうなるのでしょうか.結論はfinallyを実行して返すことです.
    public class Lecture {
    	public static void main(String args[]) {
    		Lecture.method1();
    		System.out.println("returned to main method after calling method1.");
    	}
    	static void method1() {
    		try {
    			System.out.println("the try block of method 1 is being executed.");
    			return;
    		} catch(Exception e) {
    			e.printStackTrace();
    		} finally {
    			System.out.println("the finally block of method 1 is being executed.");
    		}
    	}
    }
    同様に、これらのコードはファイルIOにも適用される.以前mainにthrows IOExceptionと書いてBufferedReaderを使ったのを覚えていますか?これもtry-catchでドアをつかんで
    ここはちょっと気をつけてね!!try-catchで宣言された変数は領域変数です.ファイルIO変数はtry-catch外部に宣言され、後でtry-catch内部で使用されます.
    import java.io.FileInputStream;
    import java.io.IOException;
    public class Lecture {
    	public static void main(String[] args) {
    		byte[] b = new byte[1024];
    		FileInputStream input = null;
    		try {
    			input = new FileInputStream("src/kr/ac/sogang/icsl/aaa.txt");
    			input.read(b);
    			System.out.println(new String(b));
    		} catch(IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				input.close();
    			} catch(Exception e) {
    				e.printStackTrace();
    			}
    		}
    		System.out.println("The program exited normally.");
    	}
    }