レベル 1: Java の例外処理メカニズム
関連要件
何が異常なのか
例外:プログラムの実行中に発生する異常な状況。
プログラムの実行中に予期しないイベントが発生し、作成したコードがコードどおりに実行されない場合がありますが、これは例外です。例外はJava
プログラム内のエラーですが、すべてのエラーが例外であるわけではありません。たとえば、変数名を定義するときにルールに従わず、Java
ステートメントの末尾のセミコロンを見逃した場合、実行の結果は次のようになります。エラーメッセージである可能性がありますjava.lang.Error
。
しかし、これを使用するとSystem.out.println(5/0)
、現時点ではプログラムは正常にコンパイルできますが、実行時には、それを0
除数として使用したため、 の例外java.lang.ArithmeticException
が。
例外には次のような多くの理由があります。
-
間違ったデータが入力された場合。たとえば、プログラムには
int
型データが必要であるのに、ユーザーが文字列を入力した場合などです。 -
オブジェクトは初期化せずに呼び出されます。次のコードでは、null ポインター例外が発生します。
String str = null;
int length = str.length();
-
開くファイルは存在しません。
-
ネットワーク通信中に接続が中断されたか、JVM メモリがオーバーフローしました。
Java
での例外の仕組みを理解するには、次の 3 種類の例外を理解する必要があります。
-
チェックされた例外。
-
実行時例外。
-
間違い。
チェックされた例外
たとえば、ファイルを開こうとする場合、ファイルが存在しない可能性があるため、このコードでは例外が発生する可能性があります。
File f = new File("G://test.java");
FileInputStream fs = new FileInputStream(f);
ここのG
ディスクの下にtest.java
ファイルが存在しない可能性があり、現時点でこのコードを実行すると例外が発生する可能性があるため、コードを記述するときに、IDE はこのコードで発生する可能性のある例外に対処するように求めるプロンプトを表示します。
これを処理しないとプログラムをコンパイルできません。
実行時例外
プログラマーはランタイム例外に対処する必要がなく、例外が発生すると仮想マシンが処理します。一般的な実行時例外は、NULL ポインター例外です。
一般的な実行時例外:
ClassCastException(类转换异常)
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
間違い
エラーは例外ではなく、プログラマの制御の範囲外にある問題です。通常、コード内のエラーは無視されます。たとえば、スタックがオーバーフローするとエラーが発生し、コンパイル時にチェックされません。
例外クラス
すべての例外クラスは、java.lang.Exception
クラス。
Exception
クラスはThrowable
クラス。クラスに加えてException
、Throwable
サブクラスもありますError
。
Java
通常、プログラムはエラーを検出しません。エラーは通常、重大な障害が発生したときに発生し、Java
プログラムの処理範囲外です。
Error
実行環境で発生したエラーを示すために使用されます。
たとえば、JVM
メモリ不足です。一般に、プログラムはエラーから回復できません。
例外クラスには、IOException
class とRuntimeException
class という2 つの主要なサブクラスがあります。
パス 2: 例外のキャッチ
関連情報
例外をキャッチする
最初のパスでは、いくつかの例外をプログラマが事前に処理する必要があることがわかります。この種の例外は総称して検出例外と呼ばれます。これを処理しないと、プログラムはコンパイルできず、赤い線が表示されます。 IDE。
現時点では、この異常なプログラムに対処する必要があります。
どうやって対処すればいいのでしょうか?
Java は、例外をキャッチするためのメカニズムを提供します。try-catch
try
これら 2 つの単語の文字通りの意味から、 : try、: catch
catch; 実行を試み代码A
、代码B
これら 2 つのコードのいずれかに例外がある場合はcatch
進行中のステートメントが実行され、代码A、B
例外がない場合は進行中のステートメントが実行されることがよく理解できます。コードは実行されずcatch
、最後まで実行が続行されます代码C
。
したがって、前にエラーを報告したコードは、次のように記述すれば正しいものになります。
catch
ここで、キャッチされたのは、FileNotFoundException
これがファイルが見つからない例外であることがわかります。したがって、例外をキャッチするときは、例外のタイプが何であるかを明確にすることが最善です。
プログラミング要件
右側のコードを注意深く読み、メソッドのプロンプトに従ってBegin - End
その領域のコードを補足してください。具体的なタスクは次のとおりです。
- エディターのコードの実行中に例外が発生する可能性があります。この知識を利用して例外を処理してください。
package step2;
import java.util.Scanner;
public class Task {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
/********* Begin *********/
try{
int ans =num1/num2;
}catch(ArithmeticException a){
System.out.println("除数不能为0");
}
System.out.println(num1/num2);
/********* End *********/
}
}
レベル 3: 例外のスロー
関連情報
キーワードをスローします
前のセクションでは、例外のキャッチを処理する方法を学びましたが、場合によっては、これらの例外を自分で処理せずに怠けたい場合があります。それは可能でしょうか? 答えは「はい」です!
処理したくない例外を他の人に渡すことができますが、それを実現するにはどうすればよいでしょうか?
非常に簡単です。throws
キーワードを使用して例外をスローするだけです。
例えば:
この時点で、エラーが報告されたことがわかりIDE
、ここで処理すべき例外があることがわかりましたが、処理したくない場合は、次のようにすることができます。
test
メソッド内ではエラーが報告されていませんが、test
メソッドが呼び出されたところでエラーが報告されていることがわかります。理由は何ですか?
例外をスローすることは、私たちが通常「鍋を投げる」と呼んでいるものとまったく同じです。責任を負う誰かが常に存在し、例外は常に最終的に処理またはキャッチされますJava
。メソッド例外が発生した場合、このメソッドの呼び出し元はこの例外をキャッチするか、この例外をスローし続ける必要があります。
したがって、上記のエラーには 2 つの解決策があります。
最初: 例外をキャッチ:
Java
2 番目の方法:仮想マシンに「ポット」を投げます。
キーワードを投げる
throw キーワードの役割は、積極的に例外をスローすることです。
まず、システムが自動的に例外をスローする様子を見てみましょう。
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println(a/b);
}
このコード システムを実行すると、自動的に
java.lang.ArithmeticException
例外がスローされます。
このプログラムは、throw
次のキーワードを使用して実装することもできます。
public static void main(String[] args) {
int a = 10;
int b = 0;
if(b == 0){
throw new ArithmeticException("/ by zero");
}
System.out.println(a/b);
}
2 つのプログラムの実行結果は似ていることがわかります。
throw
これは、通常はコード ブロック内で例外をスローするステートメントであり、プログラム内で特定の論理エラーが発生すると、プログラマは積極的に特定の種類の例外をスローします。
注:throw
キーワードを使用して検出された例外をアクティブthrows
にスローする場合は、このメソッドを呼び出すときに例外がスローされる可能性があることを示すためにメソッド名で使用する必要があります。
例えば:
ArithmeticException
これは実行時例外であり、実行時に検出されるため、上記のコードのコンパイルは通過しますFileNotFoundException
がこれは検出例外であり、コンパイル前に処理する必要があるため、throws
コンパイルを通過するには 2 番目のプログラムを追加する必要があります。
プログラミング要件
右側のコードを注意深く読み、メソッドのプロンプトに従ってBegin - End
その領域のコードを補足してください。具体的なタスクは次のとおりです。
- 例外のスローと処理。
package step3;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Task {
/********* Begin *********/
//请在合适的部位添加代码
public static void main(String[] args) throws FileNotFoundException {
test();
}
public static void test() throws FileNotFoundException {
File file = new File("abc");
if(!file.exists()){ //判断文件是否存在
//文件不存在,则 抛出 文件不存在异常
throw new FileNotFoundException("该文件不存在");
}else{
FileInputStream fs = new FileInputStream(file);
}
}
/********* End *********/
}
レベル 4: カスタム例外
関連情報
カスタム例外
上で述べたのはシステムに付属する例外ですが、複雑なプロジェクトを開発している場合、システムに付属する例外ではニーズを満たせない状況によく遭遇するため、現時点では自分で例外を定義する必要があります。 。
カスタム例外を使用する
例外をカスタマイズするにはクラスを継承する方法が一般的ですException
が、どのように行うのでしょうか?
これは非常に簡単で、 を継承してException
、その情報を親クラスに渡すだけです。
class 自定义异常名 extends Exception{
//因为Exception已经实现了很多异常处理的方法了属性了,
//所以自定义异常只需要将信息传递给父类(使用super关键字)即可
}
単純なカスタム例外:
出力:我是自定义异常
これにより、カスタム例外の定義と使用が実現されます。
プログラミング要件
右側のコードを注意深く読み、メソッドのプロンプトに従ってBegin - End
その領域のコードを補足してください。具体的なタスクは次のとおりです。
- ユーザー名が3 文字未満かどうかを判断するカスタム例外を定義し、ユーザー名が 3 文字未満の場合はカスタム例外をスローします。
package step4;
import java.util.Scanner;
public class Task {
/********* Begin *********/
public static void main(String[] args) throws MyException {
Scanner sc = new Scanner(System.in);
String username = sc.next();
//判断用户名
if(username.length()<3){
throw new MyException("用户名小于三位Exception");
}
if(username.length()>=3){
System.out.println("用户名格式正确");
}
}
}
class MyException extends Exception{
public MyException(){
}
public MyException(String err){
super(err);
}
}
/********* End *********/