Java の例外処理は、Java 開発者として学ぶ最も重要な概念の 1 つです。このチュートリアルは、例外処理を適切に理解して実装するのに役立ちます。
すべてのコンピューター プログラムには、実行される特定のフローがあります。何か 予期せぬこと が発生すると、プログラムの通常の流れに混乱が生じます。
たとえば、数値をゼロで除算したり、配列内に存在しないインデックスにアクセスしたりすることです。この現象はプログラミングにおける 例外 と呼ばれます。
簡単に言うと、例外とは、発生すると予想していなかったものの、発生する可能性があるため、それに対処する必要があるものです。
なぜ例外が発生するのでしょうか?
ここで重要なのは 可能性 です。問題が起こる可能性は複数あります。ネットワーク状態、ユーザー操作、無効な入力などは、例外が発生する可能性のあるものの一部です。重要なのは、いつか何らかの形で発生すると思われる例外をどのように処理するかです。
JVMによる例外処理
Java プログラム内で例外が発生すると、例外のタイプや発生時のプログラムの状態など、例外を記述するオブジェクトが作成されます。次に、このオブジェクトは Java 仮想マシン (JVM) に渡されます。 JVM は、例外を処理するメソッドまたは関数を見つけようとします。例外を処理できる可能性のあるメソッドのリストを調べます。
例外を処理する適切なメソッドが見つかると、そのメソッドに例外を渡しますが、適切なメソッドが見つからない場合は、デフォルトの例外処理メソッドを呼び出してプログラムを終了します。
Java の例外の種類
Java の例外には 2 つのタイプがあります。
チェック済み : これらのタイプの例外はコンパイル時にコンパイラーによって捕捉されます。 Java のチェック例外には、IOException や SQLException などがあります。
Unchecked : これらの例外は実行時に明らかになるため、コンパイラはコンパイル時にこれらの例外を認識しません。これらはコードの実行時に検証されます。未チェックの例外には、ArrayIndexOutOfBoundsException および IllegalStateException が含まれます。
例外を処理する方法
例外を処理またはスローできるいくつかの方法を次に示します。
- 試してみて…ブロックをキャッチ
- 投げる/投げるキーワード
#1. 試してみて…ブロックをキャッチ
try-catch ブロックは、例外が発生する可能性のあるコードを実行するために使用されます。 try ブロック と catch ブロック は 2 つの別個のコード ブロックです。catch ブロックは、try ブロック が正常に実行できなかったときに実行されます。
try {
// normal code
} catch(Exception e) {
// code which handles an exception
}
例外が発生するかどうかに関係なく、コードを実行するために使用できる Finally ブロックもあります。このブロックのコードはあらゆる場合に実行されます。
try {
// normal code
} catch(Exception e) {
// code which handles an exception
} finally {
// some code
}
#2. スロー&スローキーワード
throw キーワードは、単一の例外を明示的に作成するために使用されます。特定の条件で例外が確実に発生する可能性があることがわかっている場合は、 throw キーワードを使用できます。
public static void occur() {
// condition
throw new ArithmeticException();
}
public static void main(String[] args) {
try {
occur();
} catch(Exception e) {
// handle
}
}
throws キーワードを使用すると、特定のメソッドで発生することがわかっている複数の例外を指定できます。
public static void occur() throws Exception1, Exception2, Exception3 {
// conditions which throw different exceptions
}
public static void main(String[] args) {
try {
occur();
} catch(Exception1 e) {
//...
} catch(Exception2 e) {
//...
} catch(Exception3 e) {
//...
}
}
Java での一般的な例外
#1. IO例外
Java では、入出力プロセスに問題がある場合に IOException が発生することがあります。これは通常、ファイルとその内容にアクセスしようとしたときに、ファイルが存在しないか、ファイル内の内容の読み取りに問題がある場合に発生します。
import java.io.FileNotFoundException;
import java.io.FileReader;
public class Main {
public static void main(String[] args) {
try {
FileReader file = new FileReader("hello.txt");
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
}
}
#2. ArrayIndexOutOfBoundsException
配列は、同じデータ型の値を格納するデータ構造であり、各値には 0 から始まり (n-1) までのインデックスが付いています。ここで、n は配列内に存在する値の総数です。要素にアクセスするには、配列を参照する変数の名前でインデックスを指定します。
array[index]
ここで、0 未満または (n-1) より大きいインデックスを持つ要素にアクセスしようとすると、その特定のインデックスに要素がないため、例外が発生します。このタイプの例外は ArrayIndexOutOfBoundsException として知られており、実行時に発生します。
public class Main {
public static void main(String[] args) {
try {
int[] arr = {34, 1, 78, 3, 5};
int element = arr[7];
} catch (Exception e) {
System.out.println(e);
}
}
}
#3. クラスキャスト例外
このタイプの例外は、親クラスのオブジェクトをそのサブクラスの型で型キャストしようとしたときに発生します。互換性のないクラスを使用してオブジェクトを型キャストしようとした場合にも、この例外が発生する可能性があります。
class A {
public void display() {
System.out.println("This is class A");
}
}
class B extends A {
public void display() {
System.out.println("This is class B which is a subclass of A");
}
}
class C extends B {
public void display() {
System.out.println("This is class C which is a subclass of B");
}
}
public class Main {
public static void main(String[] args) {
try {
A objA = new A();
B objB = (B) new A();
} catch (Exception e) {
System.out.println(e);
}
}
}
上記のコードは、親クラスのオブジェクトをそのサブクラスの型で型キャストしようとしているため、ClassCastException をスローします。
#4. IllegalArgumentException
メソッドまたは関数が無効な引数を受け取ると、IllegalArgumentException がスローされることがあります。たとえば、正方形の周囲長を計算するメソッドを作成しているとします。
ユーザーに正方形の一辺の長さをリクエストしているときに、負の値を取得した場合は、正方形の一辺を負にすることはできないため、この例外をスローできます。
public class Main {
public static int perimeter(int length) {
if(length < 0) {
throw new IllegalArgumentException("No negative values are allowed!");
}
return 4 * length;
}
public static void main(String[] args) {
try {
System.out.println(perimeter(-5));
} catch (Exception e) {
System.out.println(e);
}
}
}
#5. IllegalStateException
呼び出すべきでないときにメソッドまたは関数を呼び出すと、IllegalStateException が発生します。たとえば、すでに開始されているスレッドで start メソッドを呼び出すと、Java は実行時にこの例外をスローします。
class AThread extends Thread {
public void run() {
System.out.println("This is a thread!");
}
}
public class Main {
public static void main(String[] args) {
try {
AThread t = new AThread();
t.start();
t.start();
} catch (Exception e) {
System.out.println(e);
}
}
}
#6. NullPointerException
これは、null オブジェクトまたは null 値を指す変数のプロパティにアクセスしようとすると発生します。 Null は Java の特別な値で、参照元の変数に値が割り当てられていないことを示します。
public class Main {
public static void main(String[] args) {
try {
String num = null;
System.out.println(num.length());
} catch (Exception e) {
System.out.println(e);
}
}
}
#7。 NumberFormatException
この問題は、不適切な形式の文字列を数値に変換しようとすると発生します。たとえば、「null」または「20」を数値に変換しようとすると、Java はこの例外をスローします。
public class Main {
public static void main(String[] args) {
try {
int num = Integer.parseInt("12,389");
System.out.println(num);
} catch (Exception e) {
System.out.println(e);
}
}
}
結論
例外を処理することは、プログラムのフローに不必要な中断を引き起こす可能性があるため重要です。例外は処理する必要があるのに対し、エラーは処理できないため、例外はエラーとは異なることに注意してください。代わりに、解決または修正する必要があります。これらのオンライン Java コースを受講することで、Java についてさらに詳しく学ぶことができます。






![2021 年に Raspberry Pi Web サーバーをセットアップする方法 [ガイド]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)





