最も一般的な Java ランタイム エラー

Feb 27 2023
ランタイム エラーは、プログラムに構文エラーが含まれていないにもかかわらず、コンピューターが確実に実行できない操作をコンピューターに要求した場合に発生します。コンパイル中に、コンパイラーにはこの種のエラーを検出する技術がありません。

ランタイム エラーは、プログラムに構文エラーがなくても、コンピュータが確実に実行できない処理をコンピュータに要求する場合に発生します。コンパイル中に、コンパイラーにはこの種のエラーを検出する技術がありません。プログラムの実行中にそれを検出するのは JVM (Java 仮想マシン) です。

· StackOverflowError 例外
· OutOfMemoryError 例外
· NegativeArraySizeException
· ArithmeticException
· ArrayIndexOutOfBoundsException
· ArrayStoreException
· UnsupportedOperationException
· NoSuchElementException
· ClassCastException
· DateTimeException
· ConcurrentModificationException
· InputMismatchException
· IllegalFormatConversionException
· NumberFormatException
· InvalidParameterException
· NullPointerException

StackOverflowError 例外

StackOverflowError は、遭遇する可能性のある最も一般的なランタイム エラーの1 つであるため、Java では検出できないエラーです。たとえば、スタックの領域が不足しているなどです。

StackOverflowError の主な原因は、再帰関数またはテンプレートに適切な終了条件が提供されていないことです。つまり、無限ループになってしまいます。したがって、このエラーは、Java が使用可能なメモリを使い果たすとスローされます。

// Java program to demonstrate
// infinite recursion error
public class StackOverflowErrorClass {
 static int i = 0;
 // Method to print numbers
 public static int printNumber(int x)
 {
  i = i + 2;
  System.out.println(i);
  return i + printNumber(i + 2);
 }
 public static void main(String[] args)
 {
  // Recursive call without any
  // terminating condition
  StackOverflowErrorClass.printNumber(i);
 }
}

RunTime Error in java code :- Exception in thread “main” java.lang.StackOverflowError
at java.io.PrintStream.write(PrintStream.java:526)
at java.io.PrintStream.print(PrintStream.java:597)
at java.io.PrintStream.println(PrintStream.java:736)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:13)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:14)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:14)
.
.
.

OutOfMemoryError 例外

スレッド内のスペース/メモリ不足エラー (java.lang.OutOfMemoryError)

java.lang.OutOfMemoryError は、 Java 仮想マシン ( JVM ) が Java ヒープ内のスペース不足のためにオブジェクトを割り当てることができないときに発生する Java の実行時エラーです。Javaガベージ コレクター( GC ) は、新しいオブジェクトに必要な領域を解放できず、 java.lang.OutOfMemoryError が発生します。このエラーは、ネイティブ メモリが Java クラスのロードをサポートするには不十分な場合にもスローされる可能性があります。

Java ヒープ領域が不十分なためにスローされる例を次に示します。

public class OutOfMemoryErrorExample {
    public static void main(String[] args) {
        Integer[] myArray = new Integer[1000 * 1000 * 1000];
    }
}

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at OutOfMemoryErrorExample.main(OutOfMemoryErrorExample.java:8)

NegativeArraySizeException

NegativeArraySizeException は、アプリケーションが負のサイズの配列を作成しようとしたときに発生する Java の実行時例外です。NegativeArraySizeException は未チェック例外 ( RuntimeException を拡張) であるため、メソッドまたはコンストラクターの throws 節で宣言する必要はありません。

開発者は配列サイズを正の整数に設定する必要があります。配列サイズ宣言にマイナス記号が含まれている場合、NegativeArraySizeException がスローされます。

class JavaError {
public static void main(String[] args) {
    int[] arr = new int[-5]; // Negative size of the array
    arr[8] = 89;
    System.out.println("Something went wrong!");
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.NegativeArraySizeException: -5
at JavaError.main(JavaError.java:4)

算術例外

元。ゼロ除算エラー

データ操作は、ほとんどの Java アプリケーションの主要な機能です。データ操作に除算が含まれる場合、開発者はゼロ除算に注意する必要があります。計算でゼロが分母になると、Java は ArithmeticException をスローします。したがって、ゼロから除算することはできないため、除算を実行しようとすると、実行時に算術例外が発生します。

class JavaError {
public static void main(String[] args) {
    int a = 23;
    int b = 0;
    System.out.println(a / b);
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.ArithmeticException: / by zeroat JavaError.main(JavaError.java:7)

ArrayIndexOutOfBoundsException

配列内に存在しない要素にアクセスしたとき

Java の配列には、設定されたサイズが必要です。配列が収容できる以上の要素を追加しようとすると、 ArrayIndexOutOfBoundsException が発生します。次のコードは、5 つの要素のみを含むように構築された配列の 8 つのインデックスに要素を追加しようとします。

存在しない配列インデックスにアクセスしています:

class JavaError {
public static void main(String[] args) {
    String[] arr = new String[5];
    arr[6] = "Hi"; // Accessing array index that does not exsist
    System.out.println("Something went wrong!");
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 5
at JavaError.main(JavaError.java:6)

Java は配列内の要素にゼロベースのカウントを適用するため、配列のインデックス 6 は 7 番目の要素を参照します。インデックス 4 は配列の 5 番目の要素への参照であるため、次のコードでも Java では ArrayIndexOutOfBoundsException がトリガーされます。

String[] arr = new String[5];
arr[5] = "Hi"; // Accessing array index that does not exsist

配列ストア例外

ArrayStoreException は ClassCastException と類似点があります。この Java ランタイム例外は、間違ったタイプのオブジェクトが配列に配置された場合に発生します。

以下の例では、BigInteger 配列が作成され、続いて Double を追加しようとしています。Double は BigInteger との関係を共有しないため、実行時に ArrayStoreException がトリガーされます。

Number[] bigInt = new BigInteger[5];
bigInt[0] = Double.valueOf(12345);

BigInteger[] bigInt = new BigInteger[5];
bigInt[0] = Double.valueOf(12345); // Java compile error

UnsupportedOperationException

Java プログラマは、Java 配列をより使いやすいリストに変形するために Arrays クラスをよく使用します。ただし、Java が返す List は読み取り専用です。この事実を知らずに新しい要素を追加しようとする開発者は、UnsupportedOperationException に遭遇します。この例は、これがどのように起こるかを示しています。

Integer[] data = {1,2,3,5,8,13,21};
List<Integer> list = Arrays.asList(data);
list.add(new Integer(0));

NoSuchElementException

空のイテレータを反復処理することはできません。次のコードは、空の HashSet 内の次の要素を取得しようとしますが、NoSuchElementException をスローします。

Set set = new HashSet();
set.iterator().next(); // Java runtime exception thrown

if (!set.isEmpty()) {
  set.iterator().next();
}

データ型変換エラーの場合

Java は厳密に型指定された言語です。これは型階層を厳密に適用し、多態性関係を共有しない限り、あるオブジェクトを別のオブジェクトにキャストしません。したがって、オブジェクトを特定のクラスに誤ってキャストしようとすると、ClassCastExceptionが発生します。これは、オブジェクトがこのクラスのインスタンスまたはサブクラスではないことを意味します。

次のコードでは、Date オブジェクトを Timestamp にキャストしようとすると、実行時にClassCastExceptionエラーがスローされます。

Date today = new Date();Timestamp time = (Timestamp)today;

long seconds = System.currentTimeMillis();
Timestamp time = new Timestamp(seconds);
Date today = (Date)time; // this cast works

日時例外

データ操作は難しい作業です。タイムゾーン、日付変更線、および一貫性のない日付形式により、Java が実行時にさまざまな DateTimeException をスローする可能性があります。

たとえば、次のコードはコンパイルできますが、LocalDate クラスの HourOfDay フィールドにより日付の書式設定が失敗します。

LocalDate now = LocalDate.now();
DateTimeFormatter.RFC_1123_DATE_TIME.format(now);

LocalDate now = LocalDate.now();
DateTimeFormatter.ISO_DATE.format(now);

誤って実装された並列計算の場合

コレクションで読み取り専用の処理が必要になるのは、Arrays クラスの asList メソッドだけではありません。

リストを反復処理する場合は、基になるコレクションを更新せずに修正する必要があります。したがって、次のコード スニペット内の add メソッドは ConcurrentModificationException をスローします。

List servers = new ArrayList();
servers.add("Tomcat");
                   
Iterator<String> iterator = servers.iterator();
while (iterator.hasNext()) {
  String server = iterator.next();
  servers.add("Jetty");  // throws a Runtime Exception
}

入力不一致例外

通常、 InputMismatchException は、Scannerクラスを使用してユーザーに入力を求める Java プログラムを操作するときに発生します。この例外は通常、ユーザー入力中に、特定のタイプの入力が予期されているのに、ユーザーが異なるタイプの入力を入力した場合に発生します。つまり、この例外は、入力が予期された型に対して無効な場合に発生する可能性があります。入力が予期されたタイプのパターンに一致しないか、範囲外です。

無効なデータを渡す場合と同様です。たとえば、数値以外のフィールドに数値を渡す場合などです。たとえば、プログラムが入力として整数値を予期しているのに、ユーザーが代わりに文字列値を入力した場合、InputMismatchExceptionがスローされます。

解決策: ユーザーに正しい入力を求めるコードを while ループでラップし、継続的にユーザーに正しい入力を求めます。

IllegalFormatConversionException

説明: これはprintf()およびString.format()に関連付けられています。これは、関連付けられていないプレースホルダーがある (プレースホルダーが多すぎる、引数が足りない) か、引数の型に対して間違ったプレースホルダーであることを意味します。たとえば、%s が整数のプレースホルダーである場合、このエラーがスローされます。

解決策: プレースホルダーの数が引数の数と一致していること、およびプレースホルダーの型が正しいことを確認してください。

NumberFormatException

無効な文字列を数値に変換しようとしています

NumberFormatException は、不適切な形式の文字列を数値に変換しようとすると発生します。つまり、どの数値型 (float、int など) の文字列も変換できない場合、この例外がスローされます。Java の実行時例外 (未チェック例外) です。IllegalArgumentExceptionクラスのサブクラスです。

無効なパラメータ例外

無効なパラメータ/引数をメソッドに渡す

この例外は、 JCA/JCE エンジン クラスで使用するために設計されたIllegalArgumentExceptionのサブクラスで、無効なパラメータがメソッドに渡されたときにスローされます。

NullPointerException

NullPointerException は、Java アプリケーションで発生する非常に一般的な RuntimeException です。この例外は、Java が予期しない null 参照を検出した場合にスローされます。Java 開発者は、この参照 (初期化されていないオブジェクト) のメソッドを呼び出すコードを作成します。

String data = null;
System.out.println( data.length() ); // throws NullPointerException

Java プログラムでこのRuntimeException を回避するには、作成するすべてのオブジェクトを使用する前に初期化し、外部ライブラリがプログラムに渡すすべてのオブジェクトに対して null チェックを実行します。

フォローして私たちの出版物をサポートしてください

Java ランタイム エラーを調べてみる チームの可能性を最大限に高める: ソフトウェア配信チームを忙しくしておく方法 Java8 ストリーム ベースの面接で最もよく聞かれる質問 - 最終回 データベース統合を使用したシンプルな Quarkus プロジェクトの作成方法 Java の例外チェーンとは | Java ランタイム エラーについて見てみる 例外処理 2 日で本を書いて 300 ドルを稼ぐ — 生活の質を向上させる 10 のシンプルだが効果的な方法を紹介します Spring Boot の開始: 初心者向けの包括的なチュートリアル