JavaをJava 13(Exception Handling,Errors)に変換
45502 ワード
Errors in Programs
Javaで発生する可能性のあるエラー
コンパイルで生成されたエラーでオブジェクトファイルを作成できません
Syntax 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を実行する必要があります.
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を実行する必要があります.
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.");
}
}
public class Lecture {
public static void main(String args[]) {
throw new Exception("My exception.");
}
} // compile error!
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.");
}
}
Reference
この問題について(JavaをJava 13(Exception Handling,Errors)に変換), 我々は、より多くの情報をここで見つけました https://velog.io/@tonyhan18/자바를-자바-13Exception-Handlingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol