JavaRush /Java Blog /Random-JA /例外: チェックされている、チェックされていない、および独自のもの

例外: チェックされている、チェックされていない、および独自のもの

Random-JA グループに公開済み
こんにちは!前回の講義では、Java 言語の例外としての側面を知り、それらを使用した例を見ました。今日はその構造を詳しく見ていき、独自の例外を記述する方法も学びます :)

例外の種類

すでに述べたように、Java には多数の例外クラスがあり、その数は約 400 です。ただし、それらはすべてグループに分けられているため、覚えるのは非常に簡単です。これは次のようになります。 例外: チェック済み、チェックなし、独自 - 2すべての例外には共通の祖先クラスがありますThrowable。そこから、例外 (Exception) とエラー (Error) という 2 つの大きなグループが派生します。エラーは、Java 仮想マシンの動作に関連するプログラム実行中の重大なエラーです。ほとんどの場合、エラーはコード内の重大な欠陥を示しているため、処理する必要はありません。最も有名なエラーはStackOverflowError次のとおりです。 - たとえば、メソッドがそれ自体を際限なく呼び出す場合に発生します。OutOfMemoryError- 新しいオブジェクトを作成するのに十分なメモリがない場合に発生します。ご覧のとおり、このような状況では、ほとんどの場合、特別な処理は何もありません。単にコードが間違って書かれているだけなので、やり直す必要があります。 実際、例外は例外であり、プログラムの実行中に発生した例外的で計画外の状況ですこれらはエラーほど深刻なエラーではありませんが、注意が必要です。すべての例外は、チェック済み ( checked ) とチェックされていない ( unchecked ) の 2 つのタイプに分類されます。例外: チェック済み、チェックなし、独自 - 3すべてのチェックされた例外は から来ますException。「検証可能」とはどういう意味ですか? これについては、前回の講義で部分的に触れました。 「...Java コンパイラは、最も一般的な例外を認識しており、それらがどのような状況で発生する可能性があるかを認識しています。」 たとえば、プログラマがコード内のファイルからデータを読み取る場合、ファイルが存在しないという状況が容易に発生する可能性があることを彼は知っています。そして、そのような状況は事前に予測できることがたくさんあります。したがって、コンパイラはコードに潜在的な例外がないか事前にチェックします。それらが見つかった場合、それらを処理するか先頭に転送するまで、コードはコンパイルされません。2 番目のタイプの例外は「未チェック」です。彼らはクラスから来ていますRuntimeException。彼らはテストされている人々とどう違うのでしょうか?特定の実行時例外に由来し、それを記述するさまざまなクラスも多数あるようですRuntimeException。違いは、コンパイラーがこれらのエラーを予期していないことです。彼は次のように言っているようです。「コードを書いた時点では何も疑わしいものは見つかりませんでしたが、動作中に何か問題が発生しました。どうやらコードにエラーがあるようです!」そして実際その通りです。チェックされない例外は、ほとんどの場合、プログラマーのエラーの結果として発生します。 そして、コンパイラーは、人々が自分の手で作り出す可能性のあるすべての間違った状況に対応できるわけではないことは明らかです:) したがって、コンパイラーは、コード内のそのような例外の処理をチェックしません。すでにいくつかの未チェックの例外が発生しています。
  • ArithmeticExceptionゼロで割ると発生します
  • ArrayIndexOutOfBoundsException配列外のセルにアクセスしようとすると発生します。
もちろん理論的には、Java の作成者はそのような例外の強制処理を導入することもできましたが、その場合コードはどうなるでしょうか? 数値を除算する演算では、誤ってゼロで除算していないかどうかを確認するために try-catch を作成する必要があります。配列にアクセスするときは常に、これらの制限を超えているかどうかを確認するために try-catch を作成する必要があります。書かれたコードはスパゲッティ状になり、まったく読めなくなります。この考えが放棄されたのは論理的です。したがって、チェックされていない例外は、Error と同様に、try-catch ブロックで処理したり、先頭にスローしたりする必要はありませんが、技術的には可能です。

例外をスローする方法

もちろん、Java の作成者は、プログラム内で発生する可能性のあるすべての例外的な状況に対応できるわけではありません。世界にはプログラムが多すぎますが、それらはあまりにも異なります。ただし、必要に応じて独自の例外を作成できるため、問題はありません。これは非常に簡単に実行できます。あなたがしなければならないのは、独自のクラスを作成することだけです。その名前は「Exception」で終わる必要があります。コンパイラはこれを必要としませんが、コードを読むプログラマはこれが例外クラスであることをすぐに理解します。さらに、クラスが class からのものであることを示す必要がありますException。これはコンパイラと正しい動作のためにすでに必要です。たとえば、 Dog - というクラスがありますDog。を使って犬の散歩ができますwalk()。しかしその前に、ペットが首輪、リード、口輪を付けているかどうかを確認する必要があります。これらのいずれかが欠落している場合は、独自の例外をスローしますDogIsNotReadyException。そのコードは次のようになります。
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
クラスが例外であることを示すには、クラス名の後にextends Exception を記述する必要があります。これは、「クラスがクラス Exception から派生する」ことを意味します。Exceptionコンストラクターでは、単純に1 行でクラス コンストラクターを呼び出しますmessage。これにより、発生したエラーを説明するシステムからのメッセージがユーザーに表示されます。クラスコードでは次のようになります。
public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;

   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("Let's go for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hurrah, let's go for a walk!" + name + " I am glad!");
   } else {
       throw new DogIsNotReadyException("Dog " + name + "not ready for a walk! Check your gear!");
   }
 }

}
ここで、メソッドはwalk()例外をスローしますDogIsNotReadyException。これはキーワード を使用して行われますthrow。前に述べたように、例外はオブジェクトです。したがって、私たちのメソッドでは、犬に何かが欠けているという例外的な状況が発生したときに、新しいクラス オブジェクトを作成しDogIsNotReadyException、単語を使用してプログラムにスローしますthrow。メソッド シグネチャにwalk()throws を追加しますDogIsNotReadyException。言い換えれば、コンパイラは、メソッド呼び出しによってwalk()例外が発生する可能性があることを認識するようになります。したがって、プログラムのどこかでこれを呼び出すと、例外を処理する必要があります。これをメソッドで実行してみましょうmain()
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();//Unhandled exception: DogIsNotReadyException
}
コンパイルされず、例外が処理されません。try-catch例外を処理するために コードをブロックでラップしましょう。
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking equipment! Is the collar on?" + dog.isCollarPutOn + "\r\n Is the leash on?"
       + dog.isLeashPutOn + "\r\n Are you wearing a muzzle?" + dog.isMuzzlePutOn);
   }
}
次に、コンソール出力を見てみましょう。

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
コンソール出力がどれほど有益になったかを見てください。私たちはプログラム内で発生したすべてのステップを確認します。私たちはどこでエラーが発生したかを確認し、犬に何が欠けているのかすぐに気づきます :) これが独自の例外を作成する方法です。ご覧のとおり、複雑なことは何もありません。Java 開発者は、誤って装備されている犬に対する特別な例外を言語にわざわざ追加しませんでしたが、私たちは彼らの見落としを修正しました :)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION