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
で一般的に使用されるいくつかのメソッドについて説明します。 クラス:
-
getMessage
:発生した例外に関する詳細を含むメッセージを返します。 -
printStackTrace
:発生した例外のスタックトレースを返します。 -
toString
:getMessage
で返されるクラス名とメッセージを返します メソッド。
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-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プログラムでそれらを処理する方法を十分に理解できたと思います。
-
JSPで例外を処理する方法は?
タグはスロー可能をキャッチします それはその本体で発生し、オプションでそれを公開します。これは、エラー処理と問題へのより適切な対処に使用されます。 属性 タグには次の属性があります- 属性 説明 必須 デフォルト var 本体の要素によってスローされた場合にjava.lang.Throwableを保持する変数の名前。 いいえ なし 例 <%@ taglib uri = "https://java.sun.com/jsp/jstl/core" prefix = "c" %> <html>
-
C++で例外はどのように機能しますか
C ++では、例外処理はランタイムエラーを処理するプロセスです。例外は、C++で実行時にスローされるイベントです。すべての例外は、std::exceptionクラスから派生します。処理可能なランタイムエラーです。例外を処理しない場合は、例外メッセージを出力してプログラムを終了します。 例外は、C ++標準では、プログラム内で使用できるクラスとして定義されています。親子クラス階層の配置を以下に示します- C++の一般的な例外クラスは-です。 Sr.No。 例外と説明 1 std ::exception これは、すべての標準C++例外の例外および親クラスです。