1. 序章

このチュートリアルでは、いくつかの一般的なJavaの例外に焦点を当てています。

まず、基本的に例外とは何かについて説明します。 後で、さまざまなタイプのチェックされた例外とチェックされていない例外について詳しく説明します。

2. 例外

例外は、プログラムの実行中にコードシーケンスで発生する異常な状態です。この異常な状態は、プログラムが実行時に特定の制約に違反した場合に発生します。

すべての例外タイプは、クラスExceptionのサブクラスです。 次に、このクラスは、チェックされた例外とチェックされていない例外にサブクラス化されます。 これらについては、以降のセクションで詳しく説明します。

3. チェックされた例外

チェックされた例外は処理する必要があります。これらはクラスExceptionの直接のサブクラスです。

それらの重要性については、一見の価値がある討論があります。

チェックされた例外を詳細に定義しましょう。

3.1. IOException

入出力操作が失敗すると、メソッドはIOExceptionまたはその直接のサブクラスをスローします。 

これらのI/O操作の一般的な使用法は次のとおりです。

  • java.ioパッケージを使用したファイルシステムまたはデータストリームの操作
  • java.netパッケージを使用したネットワークアプリケーションの作成

FileNotFoundException

FileNotFoundException は、ファイルシステムでの作業中のIOExceptionの一般的なタイプです。

try {
    new FileReader(new File("/invalid/file/location"));
} catch (FileNotFoundException e) {
    LOGGER.info("FileNotFoundException caught!");
}

MalformedURLException

URLを操作するときに、URLが無効な場合、 MalformedURLException –が発生する可能性があります。

try {
    new URL("malformedurl");
} catch (MalformedURLException e) {
    LOGGER.error("MalformedURLException caught!");
}

3.2. ParseException

Javaはテキスト解析を使用して、指定された文字列に基づいてオブジェクトを作成します。 解析によってエラーが発生した場合、ParseExceptionがスローされます。

たとえば、Dateをさまざまな方法で表すことができます。 dd / mm / yyyyまたはdd、mm、yyyy、ただし、文字列を別の形式で解析してみてください。

try {
    new SimpleDateFormat("MM, dd, yyyy").parse("invalid-date");
} catch (ParseException e) {
    LOGGER.error("ParseException caught!");
}

ここで、 String は不正な形式であり、ParseExceptionを引き起こします。

3.3. InterruptedException

Javaスレッドがjoin()、sleep()、または wait()を呼び出すと、WAITING状態またはTIMED_WAITINGのいずれかになります。州。

さらに、スレッドは、別のスレッドの interrupt()メソッドを呼び出すことにより、別のスレッドに割り込むことができます。

その結果、 スレッドは、WAITINGまたはTIMED_WAITING状態のときに別のスレッドが割り込んだ場合、InterruptedExceptionをスローします。

2つのスレッドがある次の例を考えてみましょう。

  • メインスレッドは子スレッドを開始し、それを中断します
  • 子スレッドが開始し、 sleep()を呼び出します

このシナリオでは、 InterruptedException:が発生します

class ChildThread extends Thread {

    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            LOGGER.error("InterruptedException caught!");
        }
    }
}

public class MainThread {

    public static void main(String[] args) 
      throws InterruptedException {
        ChildThread childThread = new ChildThread();
        childThread.start();
        childThread.interrupt();
    }
}

4. 未チェックの例外

チェックされていない例外の場合、コンパイラはコンパイルプロセス中にチェックしません。したがって、メソッドがこれらの例外を処理することは必須ではありません。

チェックされていないすべての例外は、クラスRuntimeException。を拡張します。

いくつかのチェックされていない例外について詳しく説明しましょう。

4.1. NullPointerException

アプリケーションが実際にオブジェクトインスタンスを必要とする場所でnullを使用しようとすると、メソッドはNullPointerExceptionをスローします。 

nullを不正に使用するとNullPointerExceptionが発生するさまざまなシナリオがあります。それらのいくつかを考えてみましょう。

オブジェクトインスタンスを持たないクラスのメソッドを呼び出す:

String strObj = null;
strObj.equals("Hello World"); // throws NullPointerException.

また、アプリケーションが null 参照を使用してインスタンス変数にアクセスまたは変更しようとすると、 NullPointerException:が発生します。

Person personObj = null;
String name = personObj.personName; // Accessing the field of a null object
personObj.personName = "Jon Doe"; // Modifying the field of a null object

4.2. ArrayIndexOutOfBoundsException

配列は、その要素を連続して格納します。 したがって、インデックスを介してその要素にアクセスできます。

ただし、、コードの一部が配列の不正なインデックスにアクセスしようとすると、それぞれのメソッドはArrayIndexOutOfBoundException。をスローします。

ArrayIndexOutOfBoundExceptionをスローするいくつかの例を見てみましょう。

int[] nums = new int[] {1, 2, 3};
int numFromNegativeIndex = nums[-1]; // Trying to access at negative index
int numFromGreaterIndex = nums[4];   // Trying to access at greater index
int numFromLengthIndex = nums[3];    // Trying to access at index equal to size of the array

4.3. StringIndexOutOfBoundsException

JavaのStringクラスは、文字列の特定の文字にアクセスしたり、文字列から文字配列をスライスしたりするためのメソッドを提供します。これらのメソッドを使用すると、内部で変換されます。 文字列を文字配列に変換します。

この場合も、この配列でインデックスが不正に使用されている可能性があります。 このような場合、 String クラスのこれらのメソッドは、StringIndexOutOfBoundsExceptionをスローします。

この例外インデックスが文字列のサイズ以上であることを示します。  StringIndexOutOfBoundsException 拡張します IndexOutOfBoundsException

クラスStringのメソッドcharAt(index)は、 Stringのの長さに等しいインデックスまたはその他の不正な文字にアクセスしようとすると、この例外をスローします。索引:

String str = "Hello World";
char charAtNegativeIndex = str.charAt(-1); // Trying to access at negative index
char charAtLengthIndex = str.charAt(11);   // Trying to access at index equal to size of the string		

4.4. NumberFormatException

多くの場合、アプリケーションはStringの数値データで終了します。 このデータを数値として解釈するために、JavaではStringを数値型に変換できます。 Integer、Floatなどのラッパークラスには、この目的のためのユーティリティメソッドが含まれています。

ただし、変換中に文字列の形式が適切でない場合、メソッドはNumberFormatExceptionをスローします。

次のスニペットについて考えてみましょう。

ここでは、英数字データを使用してStringを宣言します。 さらに、 Integer ラッパークラスのメソッドを使用して、このデータを数値として解釈しようとします。

したがって、これにより NumberFormatException:が発生します

String str = "100ABCD";
int x = Integer.parseInt(str); // Throws NumberFormatException
int y = Integer.valueOf(str); //Throws NumberFormatException

4.5. ArithmeticException

プログラムが算術演算を評価し、例外的な条件が発生すると、ArithmeticExceptionがスローされます。さらに、 ArithmeticException は、intおよびlongにのみ適用されます。 データ型。

たとえば、整数をゼロで除算しようとすると、ArithmeticExceptionが発生します。

int illegalOperation = 30/0; // Throws ArithmeticException

4.6. ClassCastException

Javaでは、継承とポリモーフィズムをサポートするために、オブジェクト間で型キャストを使用できます。 オブジェクトをアップキャストすることも、ダウンキャストすることもできます。

アップキャストでは、オブジェクトをそのスーパータイプにキャストします。 そして、ダウンキャストでは、オブジェクトをそのサブタイプの1つにキャストします。

ただし、実行時に、コードがオブジェクトをインスタンスではないサブタイプにダウンキャストしようとすると、メソッドはClassCastExceptionをスローします。

ランタイムインスタンスは、型キャストで実際に重要なものです。 Animal Dog、およびLion間の次の継承について考えてみます。

class Animal {}

class Dog extends Animal {}

class Lion extends Animal {}

さらに、ドライバークラスでは、Lionのインスタンスを含むAnimal参照をDogにキャストします。

ただし、実行時に、JVMは、インスタンスLionがクラスDogのサブタイプと互換性がないことに気付きます。

これにより、 ClassCastException:が発生します

Animal animal = new Lion(); // At runtime the instance is Lion
Dog tommy = (Dog) animal; // Throws ClassCastException

4.7. IllegalArgumentException

不正または不適切な引数を指定してメソッドを呼び出すと、メソッドはIllegalArgumentExceptionをスローします。

たとえば、 Threadクラスのsleep()メソッドは正の時間を予期し、引数として負の時間間隔を渡します。 これにより、IllegalArgumentExceptionが発生します。

Thread.currentThread().sleep(-10000); // Throws IllegalArgumentException

4.8. IllegalStateException

IllegalStateException は、メソッドが不正または不適切な時間に呼び出されたことを通知します。

すべてのJavaオブジェクトには、状態(インスタンス変数)といくつかの動作(メソッド)があります。 したがって、 IllegalStateException は、現在の状態変数を使用してこのオブジェクトの動作を呼び出すことが違法であることを意味します。

ただし、いくつかの異なる状態変数を使用すると、それは合法である可能性があります。

たとえば、イテレータを使用してリストを反復します。 1つを初期化するときはいつでも、内部的にその状態変数lastRetを-1に設定します。

このコンテキストで、プログラムはリストのremoveメソッドを呼び出そうとします。

//Initialized with index at -1
Iterator<Integer> intListIterator = new ArrayList<>().iterator(); 

intListIterator.remove(); // IllegalStateException

内部的には、 削除するメソッドは状態変数をチェックします lastRet 0未満の場合は、 IllegalStateException。 ここでは、変数はまだ値-1を指しています。

その結果、IllegalStateExceptionが発生します。

5. 結論

この記事では、最初に例外とは何かについて説明しました。 例外は、プログラムの実行中に発生するイベントであり、プログラムの命令の通常のフローを中断します。

次に、例外をチェックされた例外とチェックされていない例外に分類しました。

次に、コンパイル時または実行時に発生する可能性のあるさまざまな種類の例外について説明しました。

この記事のコードはGitHubにあります。