異常な
1. 例外の概要と例外アーキテクチャ
1.1. 例外の概要
例外:Java言語では、プログラム実行中に発生する異常事態を「異常」と呼びます(開発中の文法エラーや論理エラーは異常ではありません)
Java プログラムの実行中に発生する異常イベントは、次の 2 つのカテゴリに分類できます。
Error
: Java 仮想マシンでは解決できない重大な問題。例: JVM システムの内部エラー、リソースの枯渇、その他の深刻な状況。例: StackOverFlowError と OutOfMemory。半数はそれに対処するための特定のコードを作成しません。Exception
: プログラミング エラーや偶発的な外部要因によって引き起こされるその他の一般的な問題は、特定のコードで処理できます。好き:- ヌルポインタアクセス
- 存在しないファイルをマップしようとしました
- ネットワーク接続が失われました
- 配列の添字が範囲外です
コンパイル時例外: javac.exe コマンドの実行時に発生する可能性のある例外
実行時例外: java.exe コマンドを実行すると例外が発生します。
1.2、例外アーキテクチャ
java.lang.Throwable
|-----java.lang.Error: 一半不编写针对性的代码进行处理
|-----java.lang.Exception: 可以进行异常的处理
|------编译时异常(checked)
|-----IOException
|-----FileNotFoundException
|-----ClassNotFindException
|------运行时异常(unchecked, RuntimeException)
|-----NullPointerException
|-----ArrayIndexOutOfBoundsException
|-----ClassCastException
|-----InputMismatchException
|-----NumberFormatException
|-----ArithmeticException
例外の例:
パッケージ cs20230321.java1 を参照してください。
//--------以下是编译时异常----------------
//IOException
public void test7() {
File file = new File("hello.txt");
FileInputStream fis = new FileInputStream(file);
int data = fis.read();
while (data != -1){
System.out.println((char) data);
data = fis.read();
}
fis.close();//流资源需要显式的有关闭操作
}
//--------以下是运行时异常----------------
//ArithmeticException
public void test6(){
int a = 10;
int b = 0;
System.out.println(a/b);//不符合算法的要求
}
//InputMismatchException
public void test5(){
Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();//当输入不是数字时会报异常
System.out.println(score);
}
//NumberFormatException
public void test4(){
String str4 = "123zxc";
int n4 = Integer.parseInt(str4);
System.out.println(n4);
}
//ClassCastException
public void test3(){
Object o= new Date();//多态
String str3 = (String) o;//转为Object的子类
}
public void test1(){
//NullPointerException 1
int[] arr = null;
System.out.println(arr[3]);
//NullPointerException 2
String str = "abc";
str = null;//对象是空的,所以空指针异常
System.out.println(str.charAt(0));//获取首位置上的字符
}
//ArrayIndexOutOfBoundsException
public void test2(){
int[] arr1 = new int[10];
System.out.println(arr1[10]);
String str = "abc";
//StringIndexOutOfBoundsException
System.out.println(str.charAt(3));//获取首位置上的字符
}
2. 例外処理
お問い合わせ「オオカミがやってくる」
例外処理: キャッチ アンド スロー モデル
-
処理1:「スロー」:通常のプログラム実行中に例外が発生すると、例外コードの箇所に例外クラスに対応するオブジェクトが生成されます。そしてこのオブジェクトを投げます。
- オブジェクトがスローされると、後続のコードは実行されなくなります。例外オブジェクトの生成について:
- システムによって自動的に生成される例外オブジェクト
- 例外オブジェクトを手動で生成してスローする(スロー)
-
プロセス2:「キャッチ」:異常な処理方法として理解できる:①
try-catch-finally
②throws
2.1、try-catch-finally
フォーマット:
try{
//可能出现异常的代码
}catch(异常类型1 变量名1){
//处理异常的方式 1
}catch(异常类型2 变量名2){
//处理异常的方式 2
}catch(异常类型3 变量名3){
//处理异常的方式 3
}
...
finally{
//一定会执行的代码
}
例証します:
-
最後にオプションです
-
Try を使用して、例外が発生する可能性のあるコードをラップします。実行中に例外が発生すると、例外クラスに対応するオブジェクトが生成されます。このオブジェクトの型に応じて、catch に移動して照合します。
-
try の例外オブジェクトが特定の cacth に一致すると、例外を処理するために catch に入ります。処理が完了したら、現在のtry-catch構造から飛び出します(最終的に書き込まない場合)。引き続き次のコードを実行します
-
catch の例外型に親子関係がない場合、誰が上または下で宣言するかは関係ありません。
catch の例外タイプにサブ親クラスの関係がある場合、サブクラスは親クラスの上で宣言する必要があります。宣言しない場合は、エラーが報告されます。
-
一般的な例外オブジェクトの処理メソッド: ① String getMessage() ② printStackTrace();
-
try 構造体で宣言された変数は、try 構造体以降では呼び出せなくなります。
-
try-catch-finally 構造は相互にネストできます
経験 1: try-catch-finally を使用してコンパイル時の例外を処理すると、プログラムはコンパイル時にエラーを報告しなくなりますが、実行時にはエラーが報告される可能性があります。これは、コンパイル時に発生する可能性のある例外を実行時まで遅らせるために try-catch-finally を使用するのと同じです。
経験 2: 開発では、実行時例外の方が一般的であるため、通常は実行時例外に対して try-catch-finally を記述しません。コンパイル時の例外については、例外処理を考慮する必要があると言います。
2.1.1、最後に
- 最後にオプションです
- finally のステートメントは、実行する必要があるコードです。catch で再度例外が発生しても、try にも return 文があり、catch にも return 文があります。
- データベース接続、入出力ストリーム、ネットワーク プログラミング ソケットなどのリソースは、JVM が自動的に再利用できないため、自分で手動でリソースを解放する必要があります。この時のリソース解放はfinallyで宣言する必要があります。
2.1.2. 面接の質問 (改善予定)
- 投げる と 投げる はどう違いますか?
スローとは、例外クラスのオブジェクトをスローし、例外オブジェクトを生成することを意味します。メソッドの本体で宣言されます。
Throws は例外を処理する方法であり、メソッドの宣言時に宣言されます。
- ファイナル、最終的に、ファイナライズの違いは何ですか?
最終: キーワード、変更されたプロパティ、メソッド
finally: 例外を処理するときに使用されるキーワード
ファイナライズ: メソッド名
そういう人もいるよ。好き:
- コレクション、コレクション
- String、StringBuffer、StringBuilder
- ArrayList、LinkedList
- ハッシュマップ、LinkedHashMap
- 書き換え、オーバーロード
構造的に異なる:
- 抽象クラス、インターフェース
- ==、等しい()
- sleep()、wait()
2.2、スロー + 例外タイプ
- メソッドの宣言には「throws + 例外の型」を記述します。このメソッドの実行時にスローされる可能性のある例外のタイプを示します。メソッド本体が実行されると例外が発生し、コード上に例外クラスのオブジェクトが生成され、このオブジェクトがスロー後に例外の型に該当するとスローされます。例外コードに続くコードは実行されなくなります。
経験:
- try-catch-finall : 例外処理を実際に調整します。
- throws の方法は、メソッドの呼び出し元に例外をスローするだけであり、実際には例外を処理しません。
開発において、try-catch-finall と throws のどちらを使用するかをどのように選択すればよいですか?
- 親クラスのオーバーライドされたメソッドに例外を処理するためのスローがない場合、サブクラスによってオーバーライドされたメソッドはスローを使用できません。つまり、サブクラスのオーバーライドされたメソッドに例外がある場合は、try-catch で処理する必要があります。 -最後の。
- 実行されたメソッドaでは、他のメソッドが次々と呼び出され、進行的な関係で実行されるため、throwsメソッドでの処理を推奨します。実行されたメソッド a は、try-catch-final モードで処理できます。
2.3. メソッド書き換えのルール
- サブクラスのオーバーライドされたメソッドによってスローされる例外のタイプが、親クラスのオーバーライドされたメソッドによってスローされる例外のタイプより大きくありません。
2.4. 例外オブジェクトを手動で生成する
メソッドで新しい例外をスローし、e.getMessage() を使用してメッセージを取得します。
package cs20230322;
public class StudentTest {
public static void main(String[] args) {
try {
Student s = new Student();
s.regist(-1001);
System.out.println(s);
}catch (Exception e){
System.out.println(e.getMessage());//message传的就是 "您输入的数据非法!"
}
}
}
class Student{
public int id;
public void regist(int id) throws Exception {
if (id > 0){
this.id = id;
}else {
//手动生成异常
//在方法内,生成一个异常对象
throw new Exception("您输入的数据非法!");
}
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
'}';
}
}
2.5. 例外クラスをカスタマイズするにはどうすればよいですか?
ステップ:
- 既存の例外構造から継承: RuntimeException、Exception
- グローバル定数を指定します:serialVersionUID
- オーバーロードされたコンストラクターを提供します
2.6. 概要
上流下水排出:汚濁:異常、投下(製造下水)から排出される下水です。
下流の汚染防止:異常に対処する。解決策は上層部に直接報告することであり、異常には実際には対処しない(下水の処理)