JAvaの異常状況処理


異常分類
  • 私は異常を2つの状況に分けた:1つは私が処理する&他の人が投げた異常;もう一つは、私が処理できないときに投げ出す異常です.
  • 他人が投げ出す異常
    このような異常に対する解決策は大きく2つに分けられる:throws|try...catch...(finally...).自分でも投げ出された異常を処理できない場合はthrowsを使用して上層部に通知する.このときに現在の異常を処理することができる場合、try...catchを用いて異常に対する処理を実現する.
    throws Demo
    読み出しファイルから投げ出された異常を処理しないと仮定すると、直接投げ出すことを選択します.
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    
    public class Test {
        public void methodA() throws FileNotFoundException {
            FileReader file = new FileReader("a.txt");
        }
    }
    

    try…catch…(finally…)Demo
    ファイルに見つからない例外を処理できる場合はtry...catch...(finally...)形式を使用します.
        public void methodB(){
            try {
                FileReader file = new FileReader("a.txt");
            } catch (FileNotFoundException e) {
                System.out.println("            ");
                e.printStackTrace();
            } finally {
                System.out.println("      ,               ");
            }
        }
    

    異常を投げ出す
    場合によっては、ネガティブな結果を返すよりも、例外を投げ出すほうが役立ちます.たとえば、条件が不足して最終的な結果が得られない場合、処理に失敗した結果を直接返すのではなく、どのような条件が不足している異常を投げ出すことができます.(このように開発者やユーザーが得た情報はいずれもわけがわからず、自分のどのステップに問題が発生したのか分からない).
  • カスタム例外(オプション)
  • 発生すると判断できる異常については、「インタフェース呼び出し者に情報を提供したい場合」(その場での処理も選択可能)を直接投げ出すことができる.
    カスタム例外
    public class CannotBeZeroException extends Exception {
        String msg;
    
        public CannotBeZeroException(){}
        
        public CannotBeZeroException(String msg){
            super(msg);
            this.msg = msg;
        }
    
        public String getMsg() {
            return msg;
        }
    }
    

    カスタム例外を投げ出す
    /**
         *            
         * @param value    
         * @return value  0      (         ,     true)
         */
        public boolean methodC(int value) throws CannotBeZeroException {
            if (value == 0) throw new CannotBeZeroException("         ");
            return true;
        }
    
  • **methodC(0)**を呼び出すと次の結果が得られます.
  • Exception in thread "main" com.company.CannotBeZeroException:          
    	at com.company.Test.methodC(Test.java:29)
    	at com.company.Test.main(Test.java:34)
    

    簡単にまとめる
  • 直接失敗結果を返すよりも異常を投げ出す方が役に立つ場合がある
  • 異常に対しては処理するか、処理しないか(throw‖throws)
  • 特殊な異常については、異常クラスをカスタマイズして異常の記述を行うことが望ましい