Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの例外とその処理方法

Java開発者は、Javaの例外と例外処理について十分な知識を持っている必要があります。

このチュートリアルでは、すべてのプログラマーがJavaプログラムを操作するときに必要な基本的な知識を提供します。まず、Java例外とは何かを理解することから始めましょう。

Java例外とは

Javaプログラムで問題が発生すると、実行中にプログラムが突然終了する可能性があります。これらの問題は例外と呼ばれます。

優れたプログラマーは、実行中に発生する可能性のあるエラーを認識し、そのような例外が発生した場合にプログラムがとる代替ルートを提供できる必要があります。この方法は例外処理と呼ばれます。

ここで、なぜ例外処理が必要なのか疑問に思われるかもしれません。例外をスローしないプログラムを作成してみませんか?

なぜ例外処理が必要なのか

結局のところ、例外をスローしないプログラムを作成することは、思ったほど簡単ではありません。ほとんどの場合、これらの避けられないエラーはプログラマーの制御の及ばないものです。

ユーザー入力を受け入れるプログラムは、ユーザーが提供する無効な入力のために例外が発生する傾向があります。したがって、外部ソースがプログラマーの知らないうちに移動、名前変更、または削除された可能性を考慮して、外部ファイルを読み取っています。

このような場合、プログラムは実行を終了せずに例外を適切に処理できる必要があります。

Java例外の階層

Javaのすべての例外は、Exceptionの子である必要があります クラス、それ自体はThrowableの子です クラス。

Exceptionの2つの主要なサブクラス クラスはRuntimeExceptionです およびIOException

例外とエラー

Throwableの別の子クラス クラスはErrorです クラス。ただし、エラーは例外とは異なります。

エラーは、JVMが実行中に遭遇する可能性のある問題を示します。これらの問題は通常、重大で回復不能です。プログラムのエラーの一般的な理由は、メモリリークとライブラリの非互換性の問題です。

StackOverflowError およびOutOfMemoryError Javaエラーの2つの例です。

チェックされた例外とチェックされていない例外

Java例外は、次の2つの主要なカテゴリに分類できます。チェック済み およびチェックなし 例外。

チェックされた例外は、コンパイルする前にプログラムで処理する必要がある例外です。これらの例外が処理されない場合、プログラムはJavaコンパイラによってコンパイルされません。したがって、これらはコンパイル時例外とも呼ばれます。 IOExceptions チェックされた例外の良い例です。

チェックされていない例外は、プログラムをコンパイルするときにコンパイラーが無視する例外です。プログラムでこれらの例外を処理したかどうかは、プログラムがいつコンパイルされるかは関係ありません。これらの例外には例外処理が課されていないため、プログラムでRuntimeExceptionsが発生する可能性があります。 その結果、プログラムが終了します。

RuntimeExceptionを拡張するすべてのクラス クラスはチェックされていない例外です。このようなクラスの2つの例は、NullPointerExceptionです。 およびArrayIndexOutOfBoundsException

例外クラスで一般的に使用されるメソッド

JavaのExceptionで一般的に使用されるいくつかのメソッドについて説明します。 クラス:

  1. getMessage :発生した例外に関する詳細を含むメッセージを返します。
  2. printStackTrace :発生した例外のスタックトレースを返します。
  3. toStringgetMessageで返されるクラス名とメッセージを返します メソッド。
例外の処理方法

Javaで例外を処理する方法を見てみましょう:

try-catch

try-catch を使用して、例外をキャッチし、適切に処理できます。 Javaでブロックします。

この構文では、例外をスローする傾向があるコードの部分がtryブロック内に配置され、catchブロック/ブロックがスローされた例外/例外をキャッチし、提供するロジックに従ってそれらを処理します。

try-catchブロックの基本的な構文は次のとおりです。

try {
    //exception-prone code
}
catch(Exception e) {
    //error handling logic
}

このアプローチでは、プログラムによって例外がスローされたときにプログラムが実行を停止するのではなく、適切に処理されます。

IOExceptionsを処理する方法を見ていきます FileReaderによってスローされます Javaプログラムのクラス。

例:

import java.io.FileReader;

public class TryCatchBlockExample {

    public static void main(String[] args) {

        try {
            FileReader file = new FileReader("source.txt");
            file.read();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

ここでは、FileNotFoundExceptionを処理するために単一のcatchブロックを使用しました FileReaderをインスタンス化するときにスローされます クラスとIOException read()によってスローされます FileReaderのメソッド クラス。

これらの例外は両方ともExceptionの子です クラス。

複数のcatchステートメントを使用して、単一のtryステートメント内のコードによってスローされたさまざまなタイプのエラーをキャッチすることもできます。前の例では、1つのcatchブロックを使用してFileNotFoundExceptionをキャッチできます。 IOExceptionの別のcatchブロック 次のコードスニペットが示すように:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryCatchBlockExample {

    public static void main(String[] args) {

        try {
            FileReader file = new FileReader("source.txt");
            file.read();
            file.close();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }
}

スローされた例外が最初のcatchステートメントによって処理された例外と一致する場合、最初のcatchステートメント内のロジックによって処理されます。

例外が一致しない場合は、2番目のcatchステートメントに渡されます。 3つ以上のcatchステートメントがある場合、このプロセスは、例外がそのタイプをキャッチするcatchステートメントに到達するまで続きます。

FileNotFoundException以降 IOExceptionのサブタイプです 、2番目のcatchステートメントを使用してFileNotFoundExceptionをキャッチします 動作しません。最初のcatchステートメントによって処理され、2番目のステートメントに到達することはありません。

注:tryステートメントで少なくとも1つのcatchステートメントを使用する必要があります。 ついに

try-catchを使用する場合 プログラムで例外をキャッチするためのブロック。例外がキャッチされたかどうかに関係なく、ロジックを実装したい場合があります。このような場合、 try-catch-finallyを使用できます。 try-catchの代わりにブロックする ブロック。

次に、finally内のコード ステートメントは、例外が発生するかどうかに関係なく実装されます。 finally ステートメントは、常にtry-catch-finallyブロックの最後に配置する必要があります。

たとえば、FileReaderを使用する場合 ファイルを読み取るクラスでは、例外が発生するかどうかに関係なく、処理の最後に開いているファイルを閉じることが不可欠です。これを確実にするために、finally内にファイルを閉じるためのコードを配置できます ステートメント。

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryCatchFinallyBlockExample {

    public static void main(String[] args) {
        FileReader file = null;
        try {
            file = new FileReader("source.txt");
            file.read();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
        finally {
            file.close();
        }
    }
}

ただし、上記のコードをコンパイルしようとすると、未処理のIOExceptionが原因で、コードはコンパイルされません。 。これは、close()が原因です。 FileReaderのメソッド クラスはIOExceptionsをスローすることもできます 。したがって、この部分を次のような別のtryブロック内に配置する必要があります:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryCatchFinallyBlockExample {

    public static void main(String[] args) {
        FileReader file = null;

        try {
            file = new FileReader("source.txt");
            file.read();
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                file.close();
            }
            catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}
スロー

throwsを使用したエラーの処理 Javaのキーワードは単純です。実際、このアプローチでは、発生した場所で例外を実際に処理することはありません。代わりに、現在のメソッドから現在のメソッドを呼び出したメソッドに例外をスローします。次に、エラーの処理は外部メソッドの責任になります。

メソッドから例外をスローするには、このメソッドが考慮された例外をスローする可能性があることを宣言する必要があります。 IOExceptionsを処理する方法を見てみましょう FileReaderによってスローされます このアプローチを使用したクラス。

例:

import java.io.FileReader;
import java.io.IOException;

public class ThrowsExample {

    public void readFile throws IOException {
        FileReader file = new FileReader("source.txt");
        file.read();
        file.close();
    }
}
投げる

このリストの他のアプローチとは異なり、throw キーワードはエラーの処理には使用されません。しかし、ほとんどの人がthrowを混乱させるので throwsを含むキーワード キーワード、ここで議論するのが最善だと思いました。

throw キーワードは、例外を明示的に呼び出すために使用されます。新しくインスタンス化された例外またはメソッド内でキャッチされた例外をスローできます。

public class ThrowExample {

    public void invalidate(int amount) throws Exception {
        if (amount < 500) {
            throw new Exception("Amount not sufficient");
        }
    }
}
ユーザー定義の例外

組み込みのJava例外を使用することに加えて、独自の例外を定義できます。これらは、チェックされた例外またはチェックされていない例外として定義できます。新しいチェック済み例外を作成するには、新しい例外でExceptionを拡張する必要があります クラス。

アンケックを作成するには 例外、RuntimeExceptionを拡張します クラス。

次のコード例では、ユーザー定義のチェック済み例外を作成しました。

public class InvalidLengthException extends Exception {
    private int length;
    private String message;

    public InvalidLengthException(int length, String message) {
        this.length=length;
        this.message=message;
    }

    public int getAmount() {
        return this.length;
    }

    public String getMessage() {
        return this.message;
    }
}

これで、次のようにプログラムロジック内で上記の例外を使用できます。

public class InputChecker {

    private int minLength;
    private int maxLength;

    public InputChecker(int minLength, int maxLength) {
        this.minLength=minLength;
        this.maxLength=maxLength;
    }

    public void checkStringLength(String strInput) throws InvalidLengthException {
        int strLength = strInput.length();
        if (strLength < minLength) {
            throw new InvalidLengthException(strLength, "Input should have minimum "+minLength+" characters");
        }
        else if (strLength > maxLength){
            throw new InvalidLengthException(strLength, "Input should have maximum "+maxLength+" character");
        }
    }
}

InputCheckerを使用して文字列の長さをチェックする場合 クラスの場合、InvalidLengthExceptionをスローします 弦の長さが最小の長さより短いか、最大の長さより長い場合。

public class Main {

    public static void main(String[] args) {
        InputChecker ic = new InputChecker(2, 7);
        try {
            ic.checkStringLength("longer than the maximum length");
        }
        catch(InvalidLengthException e) {
            e.printStackTrace();
        }
    }
}

上記のコードスニペットを実行すると、InvalidLengthExceptionがスローされます。 次の出力が得られます:

InvalidLengthException: Input should have maximum 7 character
    at InputChecker.checkStringLength(InputChecker.java:17)
    at Main.main(Main.java:6)
結論

このチュートリアルでは、Java例外についてすばやく簡潔に紹介しました。これで、例外とは何か、およびJavaプログラムでそれらを処理する方法を十分に理解できたと思います。


  1. JSPで例外を処理する方法は?

    タグはスロー可能をキャッチします それはその本体で発生し、オプションでそれを公開します。これは、エラー処理と問題へのより適切な対処に使用されます。 属性 タグには次の属性があります- 属性 説明 必須 デフォルト var 本体の要素によってスローされた場合にjava.lang.Throwableを保持する変数の名前。 いいえ なし 例 <%@ taglib uri = "https://java.sun.com/jsp/jstl/core" prefix = "c" %> <html>  

  2. C++で例外はどのように機能しますか

    C ++では、例外処理はランタイムエラーを処理するプロセスです。例外は、C++で実行時にスローされるイベントです。すべての例外は、std::exceptionクラスから派生します。処理可能なランタイムエラーです。例外を処理しない場合は、例外メッセージを出力してプログラムを終了します。 例外は、C ++標準では、プログラム内で使用できるクラスとして定義されています。親子クラス階層の配置を以下に示します- C++の一般的な例外クラスは-です。 Sr.No。 例外と説明 1 std ::exception これは、すべての標準C++例外の例外および親クラスです。