java exceptions exception handling with examples
このJava例外に関するビデオチュートリアルでは、Javaでの例外処理についてすべて説明しています。例外階層、タイプ、クラスメソッドなどについて学習します。
Javaプログラムを実行していると、予期しないイベントが発生したため、プログラムの通常の動作または通常のフローが中断されます。
Android用の最高の無料音楽ダウンローダーアプリ
例えば、 データを読み取るためのファイルを開きます。 Open file呼び出しを実行すると、開こうとしているファイルが見つからないことがわかります。これにより、プログラムの通常のフローが中断されます。
プログラムの通常のフローに影響を与えたり中断したりするこのイベントは、「 例外 」。
=> すべてのJavaトレーニングシリーズを探索するには、ここにアクセスしてください。
これは、Java例外の処理に関するビデオチュートリアルです。
学習内容:
Javaでの例外処理
プログラムで例外が発生すると、プログラムの実行は終了します。これは突然の終了であるため、システムはメッセージを生成して表示します。システムによって生成されるメッセージは、一部のコードのように不可解であるか、読み取れない場合があります。
したがって、通常のユーザーは、プログラムが突然実行を停止した理由を理解する必要があり、その理由を知る必要があります。例外の結果としてシステムが生成したメッセージは役に立たない場合があります。 Javaでは、例外を処理し、問題についてユーザーに意味のあるメッセージを提供できます。
この例外の処理は、一般に '例外処理' Javaプログラミングの顕著な特徴の1つです。
例外が発生する理由
例外が発生する可能性があるため、さまざまな理由が考えられます。入力に関連する例外の場合は、入力データが正しくないか、読み取れないことが原因である可能性があります。
ファイルI / Oの例外が発生した場合は、処理しているファイルが存在しない可能性があります。また、ネットワークの問題、プリンタが利用できない、機能していないなどのエラーが発生する場合もあります。
プログラムでは、例外は別として、エラーも発生します。したがって、例外を効果的に処理するには、エラーと例外の違いに注意する必要があります。
エラーは、アプリケーションのより深刻な問題を示しており、アプリケーションはそれをキャッチしようとしないでください。それどころか、例外は、合理的なアプリケーションがキャッチしようとする条件です。
したがって、アプリケーションのエラーはより深刻であり、エラーが発生するとアプリケーションがクラッシュします。一方、例外はコードで発生し、修正アクションを提供することでプログラマーが処理できます。
例外処理とは何ですか?
Javaでの例外処理は、アプリケーションの通常のフローを維持するためのメカニズムです。これを行うために、プログラムのランタイムエラーまたは例外を処理する強力なメカニズムを採用しています。
例外を処理するために使用される一連のコードは、「例外ハンドラー」と呼ばれます。例外ハンドラーは、例外が発生した時点でコンテキストに問い合わせます。これは、例外が発生したときにスコープ内にあった変数値を読み取り、Javaプログラムを復元して通常のフローを続行することを意味します。
例外処理の利点
例外処理の主な利点は、例外が発生してもアプリケーションの通常のフローを維持することです。例外が発生すると、通常、プログラムは突然終了します。
プログラムに例外ハンドラが含まれていても、プログラムが突然終了することはありません。代わりに、例外ハンドラーは、プログラム内のすべてのステートメントが正常に実行され、プログラムフローが突然中断しないようにします。
Javaの例外階層
次の図は、Javaの例外階層を示しています。クラスjava.lang.Throwable(Objectクラスの子孫)は、JavaExceptionのルートクラスです。クラスExceptionおよびErrorは、このクラスから派生しています。
例外クラスは、他のすべての例外の基本クラスです。
以下に示すのは、Javaプログラマーが知っておくべきすべての主要な例外をリストするJavaのExceptionクラスの階層です。
Javaの例外クラス
階層図に示されているように、クラスThrowableには、ExceptionとErrorの2つの直接サブクラスがあります。外部ソースから発生する例外は、Exceptionクラスで説明されています。
Exceptionクラスは、コンストラクターをThrowableクラスと同じものとして宣言し、各コンストラクターを呼び出すと、対応するThrowableも呼び出されます。例外クラスはそのメソッドを宣言せず、Throwableクラスのメソッドを継承します。
Exceptionクラスが使用するコンストラクターとメソッドを以下に示します。
コンストラクター
ビルダー 説明 public Exception() メッセージをnullとして新しい例外を作成するデフォルトのコンストラクター。 public Exception(String message) 指定されたメッセージで新しい例外を作成するコンストラクター。この場合、原因は初期化されず、Throwable.initCause(java.lang.Throwable)への後続の呼び出しを使用して原因を初期化できます。 public Exception(String message、Throwable cause) 指定されたメッセージと原因を使用して、新しい例外を作成します。 パブリック例外(スロー可能な原因) 指定された原因と(cause == null?null:cause.toString())で指定されたメッセージ(通常、原因のクラスと詳細メッセージが含まれています)を使用して新しい例外を構築します。 保護された例外(文字列メッセージ、スロー可能な原因、ブール値enableSuppression、ブール値writableStackTrace) 指定されたメッセージ、原因、抑制(有効または無効)、および書き込み可能なスタックトレース(有効または無効)を使用して、新しい例外を作成します。
メソッド
メソッドプロトタイプ | 説明 |
---|---|
public String getMessage() | 発生した例外に関する詳細メッセージを取得します。 |
public Throwable getCause() | スロー可能なオブジェクトによって表される例外の原因を取得します |
public String toString() | クラスの名前をgetMessage()の結果と連結し、結果の文字列を返します。 |
public void printStackTrace() | toString()の結果とスタックトレースの内容をエラー出力ストリームSystem.errに出力します。 |
public StackTraceElement () getStackTrace() | スタックトレースの各要素を配列の形式で取得します。 |
public Throwable fillInStackTrace() | スタックトレースを現在のスタックトレースで埋めます。 |
例外例
次に、基本的な例外の例を示すJavaプログラムを紹介します。ここでは、null値に初期化された文字列変数を提供します。この変数を出力しようとすると、文字列値をnullにできないため、例外がスローされます。
class Main { public static void main(String args()){ //declare a String variable and initialize it to null String myStr = null; //print the string System.out.println(myStr.length()); } }
出力
Javaの例外の種類
Javaは、次の3種類の例外をサポートしています。
- チェックされた例外
- 未チェックの例外
- エラー
このセクションでは、上記の3つのタイプすべてについて説明します。
#1)チェックされた例外
一部の例外は、コードのコンパイル時にコンパイル時にチェックされます。これらは「チェックされた例外」です。 Javaプログラムは、プログラム内のコードにエラーが発生しやすいことを検出すると、コンパイルエラーをスローします。
コードをtry-catchブロックで囲むか、throwsキーワードを使用して例外を処理することにより、チェックされた例外によってスローされたコンパイルエラーを処理できます。
例外階層では、IOException、ClassNotFoundExceptionなどのThrowableクラスを直接継承するクラスは、RuntimeExceptionクラスとErrorクラスを除いて、すべてチェックされた例外です。これらはチェックされていない例外です。
次のJavaプログラムは、Checked Exceptions、FileNotFoundException、およびIOExceptionを示しています。このプログラムでは、存在しないファイルを開いてそこから読み取ろうとします。
ファイルが存在しないため、openfileメソッドはFileNotFoundExceptionをスローします。次に、ファイルの内容を読み取ってファイルを閉じようとすると、メソッド呼び出しはthrowIOExceptionを呼び出します。
import java.io.*; class Main { public static void main(String args()) { FileInputStream fis = null; //Open a file fis = new FileInputStream('C:/myfile.txt'); int k; //read contents of the file while(( k = fis.read() ) != -1) { System.out.print((char)k); } //close the file fis.close(); } }
出力
上記の出力では、例外ハンドラーがないため、チェックされた例外のコンパイルエラーが発生します。
ここで、このプログラムのthrows句を提供しましょう。 FileNotFoundExceptionの親はIOExceptionであるため、throws句の後にIOExceptionを指定するだけです。
import java.io.*; class Main { public static void main(String args()) throws IOException { FileInputStream fis = null; //Open a file fis = new FileInputStream('C:/myfile.txt'); int k; //read contents of the file while(( k = fis.read() ) != -1) { System.out.print((char)k); } //close the file fis.close(); } }
出力
出力からわかるように、例外を処理すると、コンパイルエラーではなく、より意味のある出力が提供されます。
#2)チェックされていない例外
未チェックの例外は、実行時にチェックされる例外です。したがって、例外にもかかわらず、プログラムのコンパイルは成功します。プログラムで使用されているデータが不良であるため、チェックされていない例外のほとんどがスローされます。
「RuntimeException」を継承するクラスは、チェックされていない例外です。 ArrayIndexOutofBounds Exception、ArithmeticException、NullPOinterExceptionなどの例外は、チェックされていない例外の例です。
次のプログラムは、数値をゼロで除算することによって発生する、実行時のチェックされていない例外を示しています。
class Main { public static void main(String args()) { int num1=10; int num2=0; //divide both numbers and print the result int result=num1/num2; System.out.println(result); } }
出力
プログラムが正常にコンパイルされ、実行時にArithmeticExceptionがスローされることがわかります。
未チェックの例外の例:
- ArrayIndexOutOfBoundsException
- NullPointerException
- IllegalArgumentException
- NumberFormatException
上記の2つの例外とは別に、次のようないくつかのチェック済み例外があります。
- SQLException
- InvocationTargetExecption
#3)間違い
エラーは通常、プログラム内の不可逆的かつ回復不可能な状況であり、エラーが発生すると、プログラムがクラッシュします。プログラムのエラーの例としては、OutOfMemoryError、AssertionError、VirtualMachineErrorなどがあります。
エラークラスはThrowableクラスを継承します。エラーは、処理できない状況を説明し、プログラムがクラッシュする結果になります。
エラーの例として、このセクションのOutOfMemoryエラーについて説明しましょう。
Javaのすべてのオブジェクトは、new演算子を使用して割り当てられ、ヒープに格納されることがわかっています。ヒープがメモリ不足になると、Java仮想マシン(JVM)はオブジェクトを割り当てることができません。同時に、ガベージコレクタはメモリを解放できません。この状況では、OutOfMemoryエラーが発生します。
JavaのOutOfMemoryErrorは、次のようになります。
'exception in thread 'main' java.lang.outofmemoryerror: java heap space'
プログラムにOutOfMemoryErrorが存在するということは、処理されているデータが多すぎるか、オブジェクトが長時間保持されていることを意味します。場合によっては、メモリを使い果たすサードパーティのライブラリである可能性もあります。
OutOfMemoryErrorの原因
#1)Javaヒープスペース
アプリケーションにファイナライザーが多すぎる場合、Finalizeメソッドを持つクラスオブジェクトはガベージコレクターによってすぐに再利用されませんが、後でファイナライズするためにキューに入れられます。場合によっては、ファイナライズが時間に追いつかず、ヒープメモリがいっぱいになり、OutOfMemoryErrorが発生することがあります。
OutOfMemoryErrorのもう1つの理由は、指定されたヒープサイズがアプリケーションに対して不十分である可能性があることです。
次のコードは、配列に対して宣言された巨大なデータサイズが原因で発生する可能性のあるOutOfMemoryErrorを示しています。
import java.util.*; public class Main { static List list = new ArrayList(); public static void main(String args()) throws Exception { Integer() array = new Integer(100000 * 100000); } }
出力
#2)Permgen Space
メモリ内の永続的な生成領域も使い果たされる可能性があり、OutOfMemoryエラーを生成する可能性があります。
PermGen領域のサイズは、JVMの起動時に設定されます。ユーザーがサイズを設定しない場合は、プラットフォーム固有のデフォルトサイズが使用されます。
通常、上記の2つがOutOfMemoryError発生の主な原因ですが、アレイサイズがVM制限を超えているなどの他の原因も考えられます。
Javaの例外のリスト
以下に、Javaで発生する主な例外のリストを示します。これらの例外のいくつかのプログラミング例を提供しました。これらはJavaでサポートされている組み込みの例外であることに注意してください。
#1)ArithmeticException: ゼロ除算などの算術異常は、ArithmeticExceptionになります。
以下のプログラムは、ArithmeticExceptionの発生を示しています。
class Main { public static void main(String args()) { try { //define two numbers int num1 = 100, num2 = 0; int result = num1 / num2; // divide by zero //print the result System.out.println('Result = ' + result); } catch (ArithmeticException e) { System.out.println('ArithmeticException:Division by Zero'); } } }
出力
#2)ArrayIndexOutOfBoundsException: 不正なインデックスを使用して配列要素にアクセスすると、ArrayIndexOutOfBoundsExceptionがスローされます。使用されるインデックスは、配列のサイズを超えているか、負です。
#3)ClassNotFoundException: クラス定義が見つからない場合は、ClassNotFoundExceptionが発生します。
#4)FileNotFoundException: FileNotFoundExceptionは、ファイルが存在しないか開かない場合に発生します。
#5)IOException: IOExceptionは、入出力操作が失敗するか、中断されるとスローされます。
#6)InterruptedException: スレッドが処理中、スリープ中、待機中の場合は常に、InterruptedExceptionをスローすることで中断されます。
#7)NoSuchFieldException: クラスに指定されたフィールドまたは変数が含まれていない場合、NoSuchFieldExceptionがスローされます。
#8)NoSuchMethodException: アクセスされているメソッドが見つからない場合、NoSuchMethodExceptionが発生します。
#9)NullPointerException: nullオブジェクトが参照されると、NullPointerExceptionが発生します。これは、Javaで最も重要で最も一般的な例外です。
#10)NumberFormatException: この例外は、メソッドが文字列を数値形式に変換できなかった場合に発生します。
#11)RuntimeException: 実行時に発生する例外はすべてRuntimeExceptionです。
#12)StringIndexOutOfBoundsException: StringIndexOutOfBoundsExceptionはStringクラスによってスローされ、インデックスがStringオブジェクトのサイズを超えているか、負であることを示します。
#13)EOFException: EOFExceptionはjava.ioパッケージの一部であり、ファイルの終わりに到達してファイルが読み取られているときにスローされます。
#14)IllegalArgumentException: 不正または無効な引数がメソッドに渡されると、IllegalArgumentExceptionがスローされます。 例えば、 間違ったデータ形式、null以外が必要な場合、または引数の範囲外の場合はnull値。
以下のJavaプログラムは、IllegalArgumentExceptionを示しています。
public class Main { int m; public static void setMarks(int marks) public static void main(String() args) { setMarks(45); setMarks(101); } }
出力
上記のプログラムでは、setMarks関数の2回目の呼び出しでIllegalArgumentExceptionがスローされ、範囲外(> 45)のマークを入力します。
#15)InputMismatchException: InputMismatchExceptionは、入力読み取りが指定されたパターンと一致しない場合にスローされます。 例えば、 プログラムが整数を期待してfloatを読み取る場合、InputMismatchExceptionが発生します。
#16)NoSuchElementException: 次にアクセスする要素が存在しない場合、NoSuchElementExceptionがスローされます。
例えば、 列挙では、nextElement()メソッドを使用して、列挙内の次の要素にアクセスします。要素が存在しない場合、NoSuchElementExceptionがスローされます。ほとんどの場合、Javaコレクションはこの例外をスローします。
以下に示すプログラムは、これを示しています。
import java.util.*; public class Main { public static void main(String() args) { Set hash_Set = new HashSet(); //create an empty hashSet. //This throws NoSuchElementException since hashSet is empty hash_Set.iterator().next(); } }
出力
#17)ConcurrentModificationException: ConcurrentModificationExceptionは通常、コレクションクラスによってスローされます。この例外は、オブジェクトがリソースを同時に変更しようとしたときにスローされます。
例えば、 別のスレッドがコレクションにアクセスしているとき、スレッドはコレクションを変更できません。 2つのスレッドを許可すると、それら2つが同時にコレクションにアクセスし、不整合が発生します。
次の例は、ConcurrentModificationExceptionを示しています。
import java.awt.List; import java.util.*; public class Main { public static void main(String() args) { ArrayList A_list = new ArrayList<>(); //add elements to the ArrayList A_list.add(10); A_list.add(20); A_list.add(30); Iterator it = A_list.iterator(); while (it.hasNext()) { Integer value = it.next(); System.out.println('ArrayList Value:' + value); if (value.equals(30)) A_list.remove(value); } } }
出力
上記のプログラムでは、ArrayListの出力中に、同時に要素を削除しようとします。これは同時アクセスであるため、例外がスローされます。
Javaのカスタム例外
これまで、Java言語に組み込まれている、またはJava言語によって提供されるすべての例外について説明してきました。これらの例外とは別に、独自の例外を定義することもできます。これらは、カスタム例外またはユーザー定義の例外と呼ばれます。
カスタム例外を使用して、必要に応じて例外を定義できます。
次の例は、整数値に対して定義したカスタム例外を示しています。
//custom exception definition class InvalidValueException extends Exception{ InvalidValueException(String s){ super(s); } } class Main{ static void validate(int int_val)throws InvalidValueException{ if(int_val<10) //value is valid if> 10 else throw exception throw new InvalidValueException('Invalid value'); else System.out.println('This is valid integer'); } public static void main(String args()){ try{ validate(9); }catch(Exception m){System.out.println('Exception occured: '+m);} System.out.println('Code after Exception'); } }
出力
よくある質問
Q#1)例外とはどういう意味ですか?
回答: プログラムの実行中に発生し、プログラムの通常の実行フローを中断させるイベントは、例外と呼ばれます。例外は不要で予期しないものであり、外部要因またはプログラミングエラーが原因で発生する可能性があります。
Q#2)エラーと例外の違いは何ですか?
回答: 例外は、プログラムの通常のフローを中断するイベントです。プログラムで例外を処理し、通常どおりプログラムを続行できます。エラーは、処理できない回復不能なイベントであり、プログラムを終了します。
Q#3)例外処理とはどういう意味ですか?
回答: 例外を処理するためにプログラムのステップのシーケンスを指定するプロセスは、例外処理と呼ばれます。プログラムに例外ハンドラーを提供することにより、プログラムの通常のフローを保証できます。
Q#4)Javaでの例外処理の利点は何ですか?
回答: 例外処理を使用すると、アプリケーションの通常の実行フローを維持できます。例外ハンドラーを提供するときに、エラーをコールスタックに伝播することもできます。
Q#5) 例外処理の用途は何ですか?
回答: アプリケーションの通常の実行フローを終了しないことは、プログラムに例外ハンドラーを含めることの主な用途です。例外ハンドラがないと、プログラムは終了し、例外が発生すると通常の実行フローが中断されます。
プログラムで例外が適切に処理されると、例外が発生した場合でも通常の実行を続行できます。
例外に関するその他の例
例外は、プログラムの実行中に発生し、プログラムの実行を中断するイベントです。そのため、ソフトウェア製品は突然終了します。
この例外が発生すると、Javaはエラーメッセージとクラスに関する情報を含むオブジェクトを作成します。これは例外オブジェクトです。
Javaで例外が必要なのはなぜですか?
例外のないクラスExcepDemo:
public class ExcepDemo { public static void main(String() args) { int i=5; int j=0; System.out.println(i/j); System.out.println('statement after division'); } }
出力:
例外処理を伴うクラスExcepDemo:
public class ExcepDemo { public static void main(String() args) { // TODO Auto-generated method stub int i=5; int j=0; try { System.out.println(i/j); } catch(ArithmeticException ae) { System.out.println('wrong input'); } System.out.println('statement after division'); } }
出力:
試して、キャッチして、最後にブロックします。
- 例外はtry、catchブロックによって処理されます。
- 例外につながる可能性のあるステートメントは、tryブロック内に記述されます。
- 例外が発生すると、catchブロック内のステートメントが実行されます。例外が発生しない場合、catchブロックは実行されません。
- 例外が発生したかどうかに関係なく、最後のブロックが実行されます。
例外タイプ
未チェックの例外:
未チェックの例外は適切なプログラミングによって回避できるため( 例えば。 ヌルポインタ例外、算術例外)はコンパイラによってチェックされません。チェックされていない例外は実行時にスローされます。
チェックされた例外:
- Checked Exceptionはコンパイラーによってチェックされ、例外をスローまたは処理するために必須です。
- この例外は、エラー処理コードを通常のコードから分離するために使用されます。
- チェックされたすべての例外はグループ化されており、問題を区別するのに役立ちます。
例: java.io
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class DemoExpChecked { public static void main(String() args) { try { File file=new File('input.txt'); BufferedReader br = new BufferedReader(new FileReader(file)) ; String content; while ((content=br.readLine())!=null) { System.out.println(content); } br.close(); } catch(IOException e) { e.printStackTrace(); } } }
エラー
プログラムの論理的な誤りまたはJVMの問題に関連するメモリが原因でエラーが発生する可能性があります。
例: メモリ不足エラーまたはスタックオーバーフローエラー。
投げて投げる
「throw」キーワードは例外をスローするために使用され、「throws」キーワードは例外を宣言するために使用されます。
サンプルプログラムを投げる:
public class Demothrow { String content ; public void driving(String c) { this.content=c; if (content.isEmpty()) { throw new NullPointerException('content is empty'); } else { System.out.println('content=='+content); } } public static void main(String() args) { Demothrow dt=new Demothrow(); dt.driving(''); } }
サンプルプログラムをスローします:
スローは、このメソッドがこの特定の例外をスローするという情報を提供するために使用されます。その特定のメソッドを呼び出すときは、その例外を処理する必要があります。
public class DemoThrows { int i=2,j=0; public void checkmethod () throws ArithmeticException{ System.out.println(i/j); } public static void main(String() args) { DemoThrows d =new DemoThrows(); try { d.checkmethod(); } catch (ArithmeticException ae) { ae.printStackTrace(); } } }
注意すべき重要なポイント:
- 例外は、プログラムの実行中に発生する異常なイベントであり、実行フローに影響を与えます。
- エラーは例外とは異なります。 エラーの例: エラーが発生したメモリ。
- チェックされた例外はコンパイル中にチェックされ、このチェックされた例外を処理することが必須です。
- 実行時にチェックされていない例外が発生します。
結論
Javaでの例外処理に関するこのチュートリアルでは、Javaでの例外の定義、例外処理、および例外階層を紹介しました。また、例外にアクセスするためのさまざまなコンストラクターとメソッドを提供するJavaの例外クラスについても説明しました。
Javaで発生する一般的な例外のリストを調べ、主要な例外のプログラミング例を見ました。また、Javaプログラムで発生する主なエラーについて、例外の種類とカスタム例外とともに説明しました。
=> ここですべてのJavaチュートリアルを確認してください。