モジュール java.base

クラスAbstractQueuedLongSynchronizer

java.lang.Object
java.util.concurrent.locks.AbstractOwnableSynchronizer
java.util.concurrent.locks.AbstractQueuedLongSynchronizer
すべての実装されたインタフェース:
Serializable

public abstract class AbstractQueuedLongSynchronizer
extends AbstractOwnableSynchronizer
implements Serializable
同期状態がlongとして保持されるAbstractQueuedSynchronizerのバージョンです。 このクラスにはAbstractQueuedSynchronizerとまったく同じ構造体、プロパティ、およびメソッドがありますが、状態関連のすべてのパラメータと結果は、intではなくlongとして定義されている点が異なります。 このクラスは、複数レベルのロックやバリアーといった64ビットの状態が必要なシンクロナイザの作成時に有用であることがあります。

使用上のノートや例については、AbstractQueuedSynchronizerを参照してください。

導入されたバージョン:
1.6
関連項目:
直列化された形式
  • ネストされたクラスのサマリー

    ネストされたクラス
    修飾子と型 クラス 説明
    class  AbstractQueuedLongSynchronizer.ConditionObject
    Lock実装の基盤として機能するAbstractQueuedLongSynchronizerのCondition実装です。
  • コンストラクタのサマリー

    コンストラクタ
    コンストラクタ 説明
    AbstractQueuedLongSynchronizer()  
  • メソッドのサマリー

    修飾子と型 メソッド 説明
    void acquire​(long arg)
    割込みを無視して、排他モードで取得します。
    void acquireInterruptibly​(long arg)
    排他モードで取得します。割込みが発生した場合は、中止します。
    void acquireShared​(long arg)
    割込みを無視して、共有モードで取得します。
    void acquireSharedInterruptibly​(long arg)
    共有モードで取得します。
    protected boolean compareAndSetState​(long expect, long update)
    現在の状態値が予想される値に等しい場合、同期状態を指定された更新値に原子的に設定します。
    Collection<Thread> getExclusiveQueuedThreads()
    排他モードで取得するために待機中のスレッドを含むコレクションを返します。
    Thread getFirstQueuedThread()
    キュー内の最初の(待機時間のもっとも長い)スレッドを返します。現在キューにスレッドが入っていない場合はnullを返します。
    Collection<Thread> getQueuedThreads()
    パーミットの取得を待機しているスレッドを含むコレクションを返します。
    int getQueueLength()
    パーミットの取得を待機しているスレッドの推定数を返します。
    Collection<Thread> getSharedQueuedThreads()
    共有モードで取得するために待機中のスレッドを含むコレクションを返します。
    protected long getState()
    同期状態の現在値を返します。
    Collection<Thread> getWaitingThreads​(AbstractQueuedLongSynchronizer.ConditionObject condition)
    このシンクロナイザに関連付けられた指定の状態で待機中のスレッドを含むコレクションを返します。
    int getWaitQueueLength​(AbstractQueuedLongSynchronizer.ConditionObject condition)
    このシンクロナイザに関連付けられた指定の状態で待機しているスレッドの推定数を返します。
    boolean hasContended()
    このシンクロナイザを取得しようとしているスレッドがあるかどうかを問い合わせます; つまり、取得メソッドがブロックされている場合です。
    boolean hasQueuedPredecessors()
    現在のスレッドより長いスレッドを待機中のスレッドが存在するかどうかを紹介します。
    boolean hasQueuedThreads()
    パーミットの取得を待機中のスレッドが存在するかどうかを照会します。
    boolean hasWaiters​(AbstractQueuedLongSynchronizer.ConditionObject condition)
    このシンクロナイザに関連付けられた指定の状態で待機しているスレッドが存在するかどうかを照会します。
    protected boolean isHeldExclusively()
    現在の(呼出し側の)スレッドに関して、同期が排他的に行われる場合はtrueを返します。
    boolean isQueued​(Thread thread)
    指定されたスレッドが、現在キューに入っている場合はtrueを返します。
    boolean owns​(AbstractQueuedLongSynchronizer.ConditionObject condition)
    指定されたConditionObjectがこのシンクロナイザをロックとして使用するかどうかを照会します。
    boolean release​(long arg)
    排他モードで解放します。
    boolean releaseShared​(long arg)
    共有モードで解放します。
    protected void setState​(long newState)
    同期状態の値を設定します。
    String toString()
    シンクロナイザおよびその状態を識別する文字列を返します。
    protected boolean tryAcquire​(long arg)
    排他モードでの取得を試みます。
    boolean tryAcquireNanos​(long arg, long nanosTimeout)
    排他モードで取得を試みます。割込みが発生した場合は中止し、指定されたタイム・アウト時間が経過した場合は失敗します。
    protected long tryAcquireShared​(long arg)
    共有モードでの取得を試みます。
    boolean tryAcquireSharedNanos​(long arg, long nanosTimeout)
    共有モードで取得を試みます。割込みが発生した場合は中止し、指定されたタイム・アウト時間が経過した場合は失敗します。
    protected boolean tryRelease​(long arg)
    排他モードでの解放を反映するように、状態の設定を試みます。
    protected boolean tryReleaseShared​(long arg)
    共有モードでの解放を反映するように、状態の設定を試みます。

    クラス java.util.concurrent.locks.AbstractOwnableSynchronizerで宣言されたメソッド

    getExclusiveOwnerThread, setExclusiveOwnerThread

    クラス java.lang.Objectで宣言されたメソッド

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • コンストラクタの詳細

    • AbstractQueuedLongSynchronizer

      public AbstractQueuedLongSynchronizer()
  • メソッドの詳細

    • getState

      protected final long getState()
      同期状態の現在値を返します。 この操作は、volatile読込みのメモリー・セマンティクスを保持します。
      戻り値:
      現在の状態値
    • setState

      protected final void setState​(long newState)
      同期状態の値を設定します。 この操作は、volatile書込みのメモリー・セマンティクスを保持します。
      パラメータ:
      newState - 新規状態値
    • compareAndSetState

      protected final boolean compareAndSetState​(long expect, long update)
      現在の状態値が予想される値に等しい場合、同期状態を指定された更新値に原子的に設定します。 この操作は、volatile読み込みおよび書込みのメモリー・セマンティクスを保持します。
      パラメータ:
      expect - 予想される値
      update - 新しい値
      戻り値:
      成功する場合はtrue falseは、実際の値が予想される値と等価ではないことを示す。
    • tryAcquire

      protected boolean tryAcquire​(long arg)
      排他モードでの取得を試みます。 このメソッドは、オブジェクトが排他モードでの取得を許可する状態にあるかどうかを照会し、許可する状態にあれば取得します。

      このメソッドは常に取得を実行するスレッドにより呼び出されます。 このメソッドが失敗をレポートし、かつスレッドがキューに入れられていない場合、取得メソッドは、ほかのスレッドからの解放により信号が送信されるまでそのスレッドをキューに入れることができます。 これは、Lock.tryLock()メソッドの実装に使用できます。

      デフォルト実装は、UnsupportedOperationExceptionをスローします。

      パラメータ:
      arg - acquireの引数。 この値は、常にacquireメソッドに渡される値、または状態待機へのエントリで保存される値になる。 それ以外の場合、この値は未解釈となり、任意の値を表すことができる。
      戻り値:
      成功する場合はtrue 成功時には、このオブジェクトは取得済みである。
      例外:
      IllegalMonitorStateException - 取得により、このシンクロナイザが不正な状態に置かれる場合。 同期が正しく機能するためには、この例外を一貫した方式でスローする必要がある。
      UnsupportedOperationException - 排他モードがサポートされていない場合
    • tryRelease

      protected boolean tryRelease​(long arg)
      排他モードでの解放を反映するように、状態の設定を試みます。

      このメソッドは、解放を実行するスレッドにより常に呼び出されます。

      デフォルト実装は、UnsupportedOperationExceptionをスローします。

      パラメータ:
      arg - releaseの引数。 この値は、常にreleaseメソッドに渡される値、または状態待機へのエントリでの現在の状態値になる。 それ以外の場合、この値は未解釈となり、任意の値を表すことができる。
      戻り値:
      待機中の任意のスレッドが取得を試みることができるように、このオブジェクトが完全に解放された状態にある場合はtrue、そうでない場合はfalse
      例外:
      IllegalMonitorStateException - 解放により、このシンクロナイザが不正な状態に置かれる場合。 同期が正しく機能するためには、この例外を一貫した方式でスローする必要がある。
      UnsupportedOperationException - 排他モードがサポートされていない場合
    • tryAcquireShared

      protected long tryAcquireShared​(long arg)
      共有モードでの取得を試みます。 このメソッドは、オブジェクトが共有モードでの取得を許可する状態にあるかどうかを照会し、許可する状態にあれば取得します。

      このメソッドは常に取得を実行するスレッドにより呼び出されます。 このメソッドが失敗をレポートし、かつスレッドがキューに入れられていない場合、取得メソッドは、ほかのスレッドからの解放により信号が送信されるまでそのスレッドをキューに入れることができます。

      デフォルト実装は、UnsupportedOperationExceptionをスローします。

      パラメータ:
      arg - acquireの引数。 この値は、常にacquireメソッドに渡される値、または状態待機へのエントリで保存される値になる。 それ以外の場合、この値は未解釈となり、任意の値を表すことができる。
      戻り値:
      失敗した場合は負の値。共有モードでの取得に成功したが、以後の共有モードでの取得に成功しない場合はゼロ。共有モードでの取得に成功し、以後の共有モードでの取得にも成功する可能性がある場合は正の値。正の値の場合、以後の待機スレッドで利用可能性をチェックする必要がある。 (3つの異なる戻り値のサポートにより、取得だけが時折排他的に動作するコンテキスト内でこのメソッドを使用することが可能になる。) 成功時には、このオブジェクトは取得済みである。
      例外:
      IllegalMonitorStateException - 取得により、このシンクロナイザが不正な状態に置かれる場合。 同期が正しく機能するためには、この例外を一貫した方式でスローする必要がある。
      UnsupportedOperationException - 共有モードがサポートされていない場合
    • tryReleaseShared

      protected boolean tryReleaseShared​(long arg)
      共有モードでの解放を反映するように、状態の設定を試みます。

      このメソッドは、解放を実行するスレッドにより常に呼び出されます。

      デフォルト実装は、UnsupportedOperationExceptionをスローします。

      パラメータ:
      arg - releaseの引数。 この値は、常にreleaseメソッドに渡される値、または状態待機へのエントリでの現在の状態値になる。 それ以外の場合、この値は未解釈となり、任意の値を表すことができる。
      戻り値:
      このリリースの共有モードで待機中の取得(共有または排他)を許可できる場合はtrue、そうでない場合はfalse
      例外:
      IllegalMonitorStateException - 解放により、このシンクロナイザが不正な状態に置かれる場合。 同期が正しく機能するためには、この例外を一貫した方式でスローする必要がある。
      UnsupportedOperationException - 共有モードがサポートされていない場合
    • isHeldExclusively

      protected boolean isHeldExclusively()
      現在の(呼出し側の)スレッドに関して、同期が排他的に行われる場合はtrueを返します。 このメソッドは、AbstractQueuedLongSynchronizer.ConditionObjectメソッドを呼び出すたびに呼び出されます。

      デフォルト実装は、UnsupportedOperationExceptionをスローします。 このメソッドは、AbstractQueuedLongSynchronizer.ConditionObjectメソッドで内部的にのみ呼び出されるため、状態が使用されない場合は定義する必要がありません。

      戻り値:
      同期が排他的に行われる場合はtrue、そうでない場合はfalse
      例外:
      UnsupportedOperationException - 状態がサポートされない場合
    • acquire

      public final void acquire​(long arg)
      割込みを無視して、排他モードで取得します。 一度以上tryAcquire(long)を呼び出すことで実装され、成功時に復帰します。 それ以外の場合、スレッドはキューに入れられ、たいていの場合ブロックおよびブロック解除を何度も繰り返し、成功するまでtryAcquire(long)を呼び出します。 このメソッドは、Lock.lock()メソッドの実装に使用できます。
      パラメータ:
      arg - acquireの引数。 この値はtryAcquire(long)に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる。
    • acquireInterruptibly

      public final void acquireInterruptibly​(long arg) throws InterruptedException
      排他モードで取得します。割込みが発生した場合は、中止します。 最初に割込みステータスをチェックしてから一度以上tryAcquire(long)を呼び出すことで実装され、成功時に復帰します。 それ以外の場合、スレッドはキューに入れられ、たいていの場合ブロックおよびブロック解除を何度も繰り返し、成功するかスレッドで割込みが発生するまでtryAcquire(long)を呼び出します。 このメソッドは、Lock.lockInterruptibly()メソッドの実装に使用できます。
      パラメータ:
      arg - acquireの引数。 この値はtryAcquire(long)に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる。
      例外:
      InterruptedException - 現在のスレッドで割込みが発生した場合
    • tryAcquireNanos

      public final boolean tryAcquireNanos​(long arg, long nanosTimeout) throws InterruptedException
      排他モードで取得を試みます。割込みが発生した場合は中止し、指定されたタイム・アウト時間が経過した場合は失敗します。 最初に割込みステータスをチェックしてから一度以上tryAcquire(long)を呼び出すことで実装され、成功時に復帰します。 それ以外の場合、スレッドはキューに入れられ、たいていの場合ブロックおよびブロック解除を何度も繰り返し、成功するかスレッドで割込みが発生するかタイムアウト時間が経過するまでtryAcquire(long)を呼び出します。 このメソッドは、Lock.tryLock(long, TimeUnit)メソッドの実装に使用できます。
      パラメータ:
      arg - acquireの引数。 この値はtryAcquire(long)に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる。
      nanosTimeout - 待機する最大ナノ秒数
      戻り値:
      取得した場合はtrue、タイム・アウトした場合はfalse
      例外:
      InterruptedException - 現在のスレッドで割込みが発生した場合
    • release

      public final boolean release​(long arg)
      排他モードで解放します。 tryRelease(long)がtrueを返す場合、1つ以上のスレッドをブロック解除することで実装されます。 このメソッドは、Lock.unlock()メソッドの実装に使用できます。
      パラメータ:
      arg - releaseの引数。 この値はtryRelease(long)に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる。
      戻り値:
      tryRelease(long)から返される値
    • acquireShared

      public final void acquireShared​(long arg)
      割込みを無視して、共有モードで取得します。 最初に一度以上tryAcquireShared(long)を呼び出すことで実装され、成功時に復帰します。 それ以外の場合、スレッドはキューに入れられ、たいていの場合ブロックおよびブロック解除を何度も繰り返し、成功するまでtryAcquireShared(long)を呼び出します。
      パラメータ:
      arg - acquireの引数。 この値はtryAcquireShared(long)に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる。
    • acquireSharedInterruptibly

      public final void acquireSharedInterruptibly​(long arg) throws InterruptedException
      共有モードで取得します。 最初に割込みステータスをチェックしてから一度以上tryAcquireShared(long)を呼び出すことで実装され、成功時に復帰します。 それ以外の場合、スレッドはキューに入れられ、たいていの場合ブロックおよびブロック解除を何度も繰り返し、成功するかスレッドで割込みが発生するまでtryAcquireShared(long)を呼び出します。
      パラメータ:
      arg - acquireの引数。 この値はtryAcquireShared(long)に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる。
      例外:
      InterruptedException - 現在のスレッドで割込みが発生した場合
    • tryAcquireSharedNanos

      public final boolean tryAcquireSharedNanos​(long arg, long nanosTimeout) throws InterruptedException
      共有モードで取得を試みます。割込みが発生した場合は中止し、指定されたタイム・アウト時間が経過した場合は失敗します。 最初に割込みステータスをチェックしてから一度以上tryAcquireShared(long)を呼び出すことで実装され、成功時に復帰します。 それ以外の場合、スレッドはキューに入れられ、たいていの場合ブロックおよびブロック解除を何度も繰り返し、成功するかスレッドで割込みが発生するかタイムアウト時間が経過するまでtryAcquireShared(long)を呼び出します。
      パラメータ:
      arg - acquireの引数。 この値はtryAcquireShared(long)に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる。
      nanosTimeout - 待機する最大ナノ秒数
      戻り値:
      取得した場合はtrue、タイム・アウトした場合はfalse
      例外:
      InterruptedException - 現在のスレッドで割込みが発生した場合
    • releaseShared

      public final boolean releaseShared​(long arg)
      共有モードで解放します。 tryReleaseShared(long)がtrueを返す場合、1つ以上のスレッドをブロック解除することで実装されます。
      パラメータ:
      arg - releaseの引数。 この値はtryReleaseShared(long)に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる。
      戻り値:
      tryReleaseShared(long)から返される値
    • hasQueuedThreads

      public final boolean hasQueuedThreads()
      パーミットの取得を待機中のスレッドが存在するかどうかを照会します。 いずれかの時点で割り込みおよびタイム・アウトによる取消しが発生した場合、trueが返されてもほかのスレッドが取得を実行することは保証されません。
      戻り値:
      取得を待機中のほかのスレッドが存在する可能性がある場合はtrue
    • hasContended

      public final boolean hasContended()
      このシンクロナイザを取得しようとしているスレッドがあるかどうかを問い合わせます; つまり、取得メソッドがブロックされている場合です。

      この実装では、この操作は一定の時間で復帰します。

      戻り値:
      競合が存在する場合はtrue
    • getFirstQueuedThread

      public final Thread getFirstQueuedThread()
      キュー内の最初の(待機時間のもっとも長い)スレッドを返します。現在キューにスレッドが入っていない場合はnullを返します。

      通常、この実装では、この操作は一定時間で復帰します。ただし、ほかのスレッドがキューの変更を並行して実行している場合は、競合により処理を繰り返す場合があります。

      戻り値:
      キュー内の最初の(待機時間のもっとも長い)スレッド。現在キューにスレッドが入っていない場合はnull
    • isQueued

      public final boolean isQueued​(Thread thread)
      指定されたスレッドが、現在キューに入っている場合はtrueを返します。

      この実装は、キューをトラバースして指定されたスレッドの存在を判別します。

      パラメータ:
      thread - スレッド
      戻り値:
      指定されたスレッドがキューに入っている場合はtrue
      例外:
      NullPointerException - スレッドがnullの場合
    • hasQueuedPredecessors

      public final boolean hasQueuedPredecessors()
      現在のスレッドより長いスレッドを待機中のスレッドが存在するかどうかを紹介します。

      このメソッドの呼出しは、次と同等です(ただし、効率的である場合があります)。

       
       getFirstQueuedThread() != Thread.currentThread()
         && hasQueuedThreads()

      いずれかの時点で割り込みおよびタイム・アウトによる取消しが発生した場合、trueが返されても、ほかのスレッドが現在のスレッドよりも前に取得を実行することは保証されません。 同様に、このメソッドがfalseを返したあと、キューが空であることが原因で、別のスレッドがエンキューの競争に勝つ可能性もあります。

      このメソッドは、バージ(barging) を回避するために公平なシンクロナイザによって使用されるためのものです。 そのようなシンクロナイザのtryAcquire(long)メソッドはfalseを返し、このメソッドがtrueを返す場合、そのtryAcquireShared(long)メソッドは負の値を返すはずです(これが再入可能な取得である場合を除く)。 たとえば、公平で再入可能な排他モードのシンクロナイザの tryAcquireメソッドは、次のようになります。

       
       protected boolean tryAcquire(long arg) {
         if (isHeldExclusively()) {
           // A reentrant acquire; increment hold count
           return true;
         } else if (hasQueuedPredecessors()) {
           return false;
         } else {
           // try to acquire normally
         }
       }

      戻り値:
      現在のスレッドよりも前にキューに入れられたスレッドがある場合はtrue、現在のスレッドがキューの先頭にあるか、キューが空の場合はfalse
      導入されたバージョン:
      1.7
    • getQueueLength

      public final int getQueueLength()
      パーミットの取得を待機しているスレッドの推定数を返します。 このメソッドが内部のデータ構造をトラバースしている間にも、スレッド数が動的に変化する場合があるため、この値は推定に過ぎません。 このメソッドは、同期の制御用としてではなく、システム状態の監視用として設計されています。
      戻り値:
      取得を待機しているスレッドの推定数
    • getQueuedThreads

      public final Collection<Thread> getQueuedThreads()
      パーミットの取得を待機しているスレッドを含むコレクションを返します。 実際のスレッド・セットは、結果の構築中にも動的に変化する可能性があるため、返されるコレクションは最善の努力を払った上での推定に過ぎません。 返されるコレクションの要素には、特定の順序は存在しません。 このメソッドは、より包括的な監視機能を提供するサブクラスの構築を容易にする目的で設計されています。
      戻り値:
      スレッドのコレクション
    • getExclusiveQueuedThreads

      public final Collection<Thread> getExclusiveQueuedThreads()
      排他モードで取得するために待機中のスレッドを含むコレクションを返します。 これは、排他的取得のために待機中のスレッドのみを返すことを除いては、getQueuedThreads()と同じプロパティを保持します。
      戻り値:
      スレッドのコレクション
    • getSharedQueuedThreads

      public final Collection<Thread> getSharedQueuedThreads()
      共有モードで取得するために待機中のスレッドを含むコレクションを返します。 これは、共有的取得のために待機中のスレッドのみを返すことを除いては、getQueuedThreads()と同じプロパティを保持します。
      戻り値:
      スレッドのコレクション
    • toString

      public String toString()
      シンクロナイザおよびその状態を識別する文字列を返します。 状態は括弧で囲まれ、文字列"State ="に続いてgetState()の現在値、およびキューが空かどうかに応じて"nonempty"または"empty"が含まれます。
      オーバーライド:
      toString 、クラス:  Object
      戻り値:
      このシンクロナイザおよびその状態を識別する文字列
    • owns

      public final boolean owns​(AbstractQueuedLongSynchronizer.ConditionObject condition)
      指定されたConditionObjectがこのシンクロナイザをロックとして使用するかどうかを照会します。
      パラメータ:
      condition - 状態
      戻り値:
      所有される場合はtrue
      例外:
      NullPointerException - 状態がnullの場合
    • hasWaiters

      public final boolean hasWaiters​(AbstractQueuedLongSynchronizer.ConditionObject condition)
      このシンクロナイザに関連付けられた指定の状態で待機しているスレッドが存在するかどうかを照会します。 タイム・アウトおよび割込みはいつでも発生する可能性があるため、trueが返されても、将来signalがスレッドを起動させることは保証されていません。 このメソッドは、主にシステム状態の監視に使用する目的で設計されています。
      パラメータ:
      condition - 状態
      戻り値:
      待機中のスレッドが存在する場合はtrue
      例外:
      IllegalMonitorStateException - 排他的同期が保持されない場合
      IllegalArgumentException - 指定された状態がこのシンクロナイザと関連付けられていない場合
      NullPointerException - 状態がnullの場合
    • getWaitQueueLength

      public final int getWaitQueueLength​(AbstractQueuedLongSynchronizer.ConditionObject condition)
      このシンクロナイザに関連付けられた指定の状態で待機しているスレッドの推定数を返します。 タイム・アウトおよび割り込みの発生する可能性はいつでも存在するため、推定数は、実際の待機者数に関する上限を示すに過ぎません。 このメソッドは、同期の制御用としてではなく、システム状態の監視用として設計されています。
      パラメータ:
      condition - 状態
      戻り値:
      待機中のスレッドの推定数
      例外:
      IllegalMonitorStateException - 排他的同期が保持されない場合
      IllegalArgumentException - 指定された状態がこのシンクロナイザと関連付けられていない場合
      NullPointerException - 状態がnullの場合
    • getWaitingThreads

      public final Collection<Thread> getWaitingThreads​(AbstractQueuedLongSynchronizer.ConditionObject condition)
      このシンクロナイザに関連付けられた指定の状態で待機中のスレッドを含むコレクションを返します。 実際のスレッド・セットは、結果の構築中にも動的に変化する可能性があるため、返されるコレクションは最善の努力を払った上での推定に過ぎません。 返されるコレクションの要素には、特定の順序は存在しません。
      パラメータ:
      condition - 状態
      戻り値:
      スレッドのコレクション
      例外:
      IllegalMonitorStateException - 排他的同期が保持されない場合
      IllegalArgumentException - 指定された状態がこのシンクロナイザと関連付けられていない場合
      NullPointerException - 状態がnullの場合