目次
1.例外の定義
例外は、Javaプログラムの実行中のプロセスの異常な状況です。
2.異常の分類
上の図からわかるように、異常には2つのタイプがあります。
2.1エラー
この種の問題は一般的に非常に深刻であり、私たちはそれに対処しません!例:メモリオーバーフロー
2.2例外
- ランタイム例外:RuntimeExceptionとそのサブクラスはすべてランタイム例外です。この例外を処理する必要はなく、コンパイルは成功します。この例外が発生した場合は、コードを変更する必要があります。
- コンパイル時の例外:RuntimeExceptionとそのサブクラスを除いて、Exceptionの他のすべてのサブクラスはコンパイル時の例外です。この種の例外を処理する必要があります。そうしないと、コンパイルに合格しません。
3.例外処理方法
3.1JVMのデフォルトの処理スキーム
まず、コードの一部を見てみましょう。
package com.hw.exception;
public class ExceptionDemo1 {
public static void main(String[] args) {
method1();
}
private static void method1() {
int a = 10;
int b = 0;
System.out.println(a/b);
System.out.println("==========end==========");
}
}
実行後にArithmeticExceptionが表示されます。次に示すように、例外の後のステートメントがコンソールに出力されていないことがわかります。
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.hw.exception.ExceptionDemo1.method1(ExceptionDemo1.java:11)
at com.hw.exception.ExceptionDemo1.main(ExceptionDemo1.java:5)
JVMは、演算が数学演算の規則に違反していることを検出しました。Javaはこの一般的な問題を記述し、ArithmeticExceptionと呼ばれるオブジェクトにカプセル化しました。ゼロ除算操作が発生すると、JVMは問題を例外オブジェクトにパッケージ化し、そのオブジェクトを呼び出し元のメイン関数new ArithmeticException( "/ by zero");にスローします。
main関数がこの問題を受け取った場合、それに対処する方法は2つあります。
- 自分で問題を解決してから、実行を続けます
- 特定の処理方法はありません。mainを呼び出して処理するJVMに渡すだけです。JVMには、例外を処理し、例外の名前と情報を出力するデフォルトの例外処理メカニズムがあります。例外、および例外が発生する場所。コンソールで、同時にプログラムを停止します。
上記のコードは、JVMのデフォルトの処理スキームを使用しています。
try..catchとthrowsを使用して例外を処理する方法を見てみましょう!
3.2 try ... catchで例外を処理します
try {
可能出现问题的代码;
}catch(异常名 变量) {
针对问题的处理;
}finally {
释放资源;
}
注意:
try里面的代码越少越好;
catch里面必须有内容;
以下に示すように、try ... catchを使用して、上記の3.1のコードを処理します。
public static void main(String[] args) {
// method1();
method2();
}
private static void method2() {
int a = 10;
int b = 0;
try {
System.out.println(a/b);
} catch (ArithmeticException e) {
e.printStackTrace();
}
System.out.println("==========end==========");
}
操作の結果は次のとおりです。
java.lang.ArithmeticException: / by zero
at com.hw.exception.ExceptionDemo1.method2(ExceptionDemo1.java:13)
at com.hw.exception.ExceptionDemo1.main(ExceptionDemo1.java:6)
==========end==========
3.3スローによる例外の処理
次のように、throwsを使用して上記の3.1のコードを処理します。
// 尽量不要在main方法上throws抛出异常
public static void main(String[] args) {
// method1();
// method2();
try {
method3();
} catch (ArithmeticException e) {
e.printStackTrace();
}
System.out.println("==========end==========");
}
private static void method3() throws ArithmeticException {
int a = 10;
int b = 0;
System.out.println(a/b);
}
操作の結果は次のとおりです。
java.lang.ArithmeticException: / by zero
at com.hw.exception.ExceptionDemo1.method2(ExceptionDemo1.java:13)
at com.hw.exception.ExceptionDemo1.main(ExceptionDemo1.java:6)
==========end==========
4.スローとスローの違い
投げる
- メソッド宣言の後に使用され、その後に例外クラス名が続きます
- コンマで区切って、複数の例外クラス名を続けることができます
- メソッドの呼び出し元によって処理される例外がスローされることを示します
- スローは例外の可能性を表し、これらの例外は必ずしも発生するわけではありません
スロー
- メソッド本体で使用され、その後に異常なオブジェクト名が続きます
- スローできる例外オブジェクト名は1つだけです
- メソッド本体のステートメントによって処理される例外がスローされることを示します
- スローは例外であり、スローの実行は何らかの例外をスローする必要があります
要件:コンパイル時に例外オブジェクトをスローし、実行時に例外オブジェクトをスローすることをそれぞれ示します。
4.1実行時に例外オブジェクトをスローすると、コードは次のようになります。
public static void main(String[] args) {
method1();
}
// 演示运行时异常对象的抛出
private static void method1() {
int a = 10;
int b = 0;
if (b == 0) {
throw new ArithmeticException("除数为0!");
} else {
System.out.println(a / b);
}
}
4.2コンパイル時の例外オブジェクトのスローは次のとおりです。
5.ファイナル、ファイナル、ファイナライズの違い
最終:最終的な意味。クラス、メンバー変数、メンバーメソッドを変更できます。
- 変更されたクラス。クラスは継承できません。
- 変更された変数、変数は定数です。
- 変更メソッド、メソッドはオーバーライドできません。
最後に:は例外処理の一部であり、リソースを解放するために使用されます。一般的に言って、コードは確実に実行されますが、特別な場合:実行が最終的に到達する前にJVMが終了します!
finalize:はObjectクラスのメソッドであり、ガベージコレクションに使用されます。
6.カスタム例外
Javaがすべての状況を考慮することは不可能であるため、実際の開発では、例外を自分で定義する必要がある場合があります。また、クラスを自由に作成する場合、それを例外クラスと見なすことはできません。クラスを例外クラスにする場合は、ExceptionまたはRuntimeExceptionから継承する必要があります。
要件:カスタム例外、テストスコアは0〜100の間でなければなりません!
例外クラスMyException.javaをカスタマイズします。コードは次のとおりです。
package com.hxs.exception;
/**
* 自定义异常类
*
* @author HW
*
*/
public class MyException extends Exception {
public MyException() {
}
public MyException(String message) {
super(message);
}
public MyException(Throwable cause) {
super(cause);
}
public MyException(String message, Throwable cause) {
super(message, cause);
}
}
Teacher.javaのコードは次のとおりです。
package com.hxs.exception;
public class Teacher {
public void check(int score) throws MyException {
if(score < 0 || score > 100) {
throw new MyException("输入的学生分数必须在0-100之间!");
} else {
System.out.println("输入的学生分数没有问题!");
}
}
}
カスタム例外テストクラスTeacherTest.javaコードは次のとおりです。
package com.hxs.exception;
import java.util.Scanner;
/**
* 自定义异常测试类
*
* @author HW
*
*/
public class TeacherTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入学生的成绩:");
int score = sc.nextInt();
Teacher teacher = new Teacher();
try {
teacher.check(score);
} catch (MyException e) {
e.printStackTrace();
}
}
}
たとえば、100を超えるスコアを入力すると、次のようにカスタム例外がスローされます。