1前書き

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

基本的に例外とは何かについて説明することから始めます。後で、さまざまな種類のチェック済みおよびチェックなし例外について詳しく説明します。


2例外

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

すべての例外タイプはクラス

Exception

のサブクラスです。このクラスは、チェック済み例外と未チェック例外にサブクラス化されます。以降のセクションで詳細に検討します。


3確認済みの例外

  • チェックされた例外は処理するために必須です** それらはクラス

    Exception

    の直接のサブクラスです。

その重要性については、一見の価値があるhttps://www.ibm.com/developerworks/library/j-jtp05254/index.html[debate]があります。

いくつかのチェック済み例外を詳細に定義しましょう。


3.1.

IOException



  • 入出力操作が失敗すると、メソッドは

    IOException

    またはその直接のサブクラスをスローします。

    **


    _

    _

これらの入出力操作の典型的な用途は次のとおりです。


  • java.io

    パッケージを使用してファイルシステムまたはデータストリームを操作する


  • java.net

    パッケージを使ったネットワークアプリケーションの作成





[

FileNotFoundException


ファイルシステムでの作業中の一般的なタイプの

IOException

です。
[source、java、gutter:、true]—-

試してください{
    new FileReader(新しいファイル( “/invalid/file/location”));
catch(FileNotFoundException e){
    LOGGER.info( “FileNotFoundExceptionがキャッチ!”);
}

__ ** **  __

URLを扱うとき、____MalformedURLException  - 私たちのURLが無効な場合 - に遭遇するかもしれません。

[source,java,gutter:,true]

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

====  **  3.2.  __ParseException__ **

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

たとえば、__Date__をさまざまな方法で表すことができます。

__dd/mm/yyyy__または__dd、mm、yyyy、__ただし、__string__を別の形式で解析してください。

[source,java,gutter:,true]

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が発生します。

[source,java,gutter:,true]

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();
    }
}

[[unchecked__exceptions]]

===  **  4未チェックの例外**

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

未チェックの例外はすべて__RuntimeException.__クラスを拡張します。

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

====  **  4.1.  __NullPointerException__ **

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

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

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

[source,java,gutter:,true]

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

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

[source,java,gutter:,true]

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__をスローする例をいくつか見てみましょう。

[source,java,gutter:,true]

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から文字配列を切り出すためのメソッドを提供します。

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

この例外** ** は、インデックスが__Stringのサイズ以上であることを示します。

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

[source,java,gutter:,true]

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などのラッパークラスには、この目的のためのユーティリティメソッドが含まれています。

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

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

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

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

[source,java,gutter:,true]

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

====  **  4.5.  __ArithmeticException__ **

** プログラムが算術演算を評価した結果、何らかの例外条件が発生した場合、__ArithmeticException __がスローされます。

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

[source,java,gutter:,true]

int illegalOperation = 30/0;//Throws ArithmeticException

====  **  4.6.  __ClassCastException__ **

Javaでは、継承と多態性をサポートするために、オブジェクト間でhttps://www.baeldung.com/java-type-casting[型指定]を許可しています。オブジェクトをアップキャストすることも、ダウンキャストすることもできます。

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

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

ランタイムインスタンスは、型キャストで実際に重要なものです。 __Animal__、__Dog、およびLion__の間の次の継承を検討してください。

[source,java,gutter:,true]

class Animal {}

class Dog extends Animal {}

class Lion extends Animal {}

さらに、ドライバクラスでは、__Lion__のインスタンスを含む__Animal__参照を__Dog__にキャストします。

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

これにより、__ClassCastExceptionが発生します。

[source,java,gutter:,true]

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

====  **  4.7.  __IllegalArgumentException__ **

** 不正または不適切な引数を指定して呼び出すと、__IllegalArgumentException__がスローされます。

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

[source,java,gutter:,true]

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

====  **  4.8.  __IllegalStateException__ **

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

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

しかし、いくつかの異なる状態変数で、それは合法的かもしれません。

例えば、リストを繰り返すためにイテレータを使います。初期化するたびに、内部で状態変数__lastRet__を-1に設定します。

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

[source,actionscript3,gutter:,true]

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

intListIterator.remove();//IllegalStateException

内部的には、

remove

メソッドは状態変数

lastRet

をチェックし、それが0より小さい場合は

__IllegalStateExceptionをスローします。

__ここで、変数はまだ値-1を指しています。

その結果、

IllegalStateException

が発生します。


5結論

この記事では、まず例外について説明しました。


exception

は、プログラムの実行中に発生し、プログラムの命令の通常の流れを妨げるイベントです。

次に、例外をチェック例外と未チェック例外に分類しました。

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


over on GitHub

この記事のコードが見つかります。