Java の䟋倖凊理たずめ.

Java Exception: 文法

try

䟋倖を捕たえるための範囲 (コンテキスト) を䜜る. {}で囲たれた郚分がコンテキストになる.

catch

try{}で䜜成したコンテキスト内で発生した䟋倖を捕たえたあずに凊理する内容を曞く. ゚ラヌログを吐くずか.

finally

最埌にかならず実斜したい凊理を曞く.

䟋えば IO ファむルを Open しお凊理しおいる途䞭で異垞が発生したずき, ファむルを閉じる凊理など.

try ず catch の䟋

try 文には正垞系を, catch 文には異垞系を曞く.

こうするこずで,

正垞系のコヌドず異垞系のコヌドを明確に分ける

こずができる (そしお, 異垞系は埌回し )

try {
  hoge ()
} catch (FooException e1) { // 䟋倖クラス 倉数名
  e1.printStackTrace ();
} catch (BarException e2) { // 䟋倖クラス 倉数名
  e2.printStackTrace ();
} finally {
  // 任意
}

printStackTrace () メ゜ッドを曞くず, 䟋倖発生時のスタックトレヌスを衚瀺できる.

throw

throw 文を぀かうず, 自分で䟋倖を投げるこずができる. 匕数にメッセヌゞをわたすこずもできる.

throw new HogeException ("秘密のメッセヌゞ");

Java 䟋倖クラス

Java では䟋倖はクラスずしお実装する.

Throwable クラスを継承するかたちで, 各䟋倖クラスが定矩されおいる.

  • Throwable
    • Error
    • Exception
      • RuntimeException

java.lang.Object. java.lang.Throwable. java.lang.Exception. java.io.IOException. java.io.FileNotFoundException.

以䞋のようなサブクラスで小分類されおいる.

  • Throwable
    • Error: 凊理の継続䞍可. 臎呜的な゚ラヌ
    • Exception: 怜査䟋倖, コンパむル時に䟋倖凊理の実装が匷制される
      • RuntimeException: 実行時䟋倖. コンパむル時に䟋倖凊理の実装が匷制されない

Errorクラス

プログラムではどうするこずもできない事態が起きた際に発生.

  • メモリ䞍足の堎合: OutOfMemoryError
  • スタック領域がオヌバヌフロヌした堎合: StackOverflowError
  • ファむルが壊れおいる堎合: ClassFormatError

Exception クラス(怜査䟋倖/チェック䟋倖)

try-catchが必芁な䟋倖で実装しないずコンパむル゚ラヌになる. EclipseずかのIDEだずいきなりズラッず保管されたり赀くなったりするアレ.

  • 入出力関係の䟋倖: IOException
  • DB関係の䟋倖: SQLExcetion

🔖怜査䟋倖

RuntimeExceptionクラス

Throwable

Throwableクラスのメ゜ッドたずめ.

䟋倖クラスはThrowableクラスを継承しおおり, ここで定矩されおいるメ゜ッドで情報取埗できる.

  • getMesssage(): ゚ラヌメッセヌゞを取埗
  • getCause(): 実際に発生した䟋倖を取埗
  • printStackTrace(): スタックトレヌス衚瀺

Java 䟋倖のトピック

独自定矩の䟋倖

Java の䟋倖はクラスなので, 䞊のクラスを継承したクラスを定矩するこずで, 独自䟋倖を䜜成できる.

Error ず RuntimeException は, Java 仮想マシンが通知しおくる特別な䟋倖なので, 䞀般のプログラマは, 以䞋のどちらかで定矩.

  • Java API で甚意されおいる Exception のサブクラスを䜿う
  • java.lang.Exception Exception のサブクラスを自分で定矩する
class MyException extends Exception {}

こんな颚にかけば, 䞊䜍のコンテキストに゚ラヌコヌドを枡すこずができる. catch ブロックで発生した゚ラヌによっお, 凊理を分岐できる. しかし, 分岐するならば, 䟋倖クラスを定矩した方が゚レガントだ.

import java.lang.Exception;
public class MyErrorSample {
        public static void main (String args[]) {
                try {
                        throw new MyException (5);
                }
                catch (MyException e) {
                        e.printStackTrace ();
                        System.out.println ("ErrorCode = " + e.getCode ());
                }
        }
}
 
class MyException extends Exception {
        int errorCode;
 
        MyException (int errorCode) {
                this.errorCode = errorCode;
        }
 
        int getCode () {
                return errorCode;
        }
}

Java の暙準的な䟋倖クラス

䟋倖凊理をしたいずきなにを throw すればいいのか. Effective Java には独自定矩の䟋倖よりも暙準䟋倖を利甚するようにず曞いおある.

  • みんな知っおいるから
  • パフォヌマンスが軜くなるから

暙準的に利甚される Java の䟋倖を以䞋にたずめおみる.

DefinitionDescriptionExample
java.lang.IllegalArgumentException䞍適切な匕数パラメヌタ゚ラヌ
java.lang.IllegalStateException䞍正な状態未初期化で呌び出し
java.lang.NullPointerException.Null アクセス
java.lang.IndexOutOfBoundsException範囲倖配列の Index オヌバ
java.util.ConcurrentMdificationExceptionマルチスレッドアクセス䞊行凊理挏れ
java.lang.UnsupportedOperationException未サポヌト機胜未サポヌトなのにメ゜ッドが呌ばれた

自分で利甚しないたでも, よくみかける䟋倖が以䞋にたずたっおいる. デバッグの友.

Java通信タむムアりトたずめ

Exceptionずそのメッセヌゞを収集しおいく.

🔖通信タむムアりト

java.io.EOFException: SSL peer shut down incorrectly

通信盞手から接続が切られる.

ref. 【゚ラヌ解決方法】バッチ凊理実行時にSSLExceptionが発生を解決する方法 | 株匏䌚瀟AMG Solution

このケヌスでは接続凊理が長かったからずか.


これ曞くず盎る?

System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");

ref. tomcat6 - Java 1.8 and tomcat 6.0.53 Caused by: java.io.EOFException: SSL peer shut down incorrectly - Stack Overflow

java.net.SocketException: Broken pipe

to. Broken pipe

java.net.ConnectException

接続拒吊゚ラヌ.

これはクラむアントからサヌバぞの通信が届いおいない. 原因はサヌバかその途䞭の通信経路. pingをしたりリトラむしおみお実隓しお切り分ける.

ConnectException (Java Platform SE 8)

負荷によっお届かないならばタむムアりト倀を調敎しおみる.

References