Javaのトレーニング:例外(のtry-catch実行順序やカスタム例外)

キーワード:
してみてください:コードの実行が異常生み出すこと
キャッチ:例外をキャッチ
最後に:異常コードが常に実行されているかどうか
スロー:Statementメソッドは、さまざまな例外によってスローされます
スロー:手動でカスタム例外を投げます
例外処理でのtry-catch-最後に:
I.(例外なく通常動作):
実行しようとした後、最終的には、finally文をブロック
ケース2(異常でみてください)
異常文(try文の後に文が異常で実行されていない)を実行する場合、ブロックをキャッチした後、最後に行われ、その後、最終的には後のステートメントを実行するためにスキップ
パブリック クラスTest2を{
     公共の 静的な 無効メイン(文字列[] args)を{ 
        スキャナ = 新しい新しいスキャナ(システム。); 
         システム。OUT .println(配当を入力してください:);
         試み { // 可能な異常なスタートコードトライに
            int型 NUM1 = .nextInt(); 
            。システムOUTの .println(" 受け入れ除数" );
             int型からnum2 = .nextInt(); 
            システム。OUT.println(NUM1 + " / " + NUM2 + " = " + NUM1 / NUM2);
             // 戻り;
             // 例外ブロック:キャッチし、最後に少なくとも一方が存在しなければならない、ブロックを試みなければならない 
        } キャッチ(InputMismatchException E){ // 試みで異常な試合、ステートメントの実行異常が直接キャッチを起動した後、catchブロックの後にプログラムを実行し、異例の場合は一致していないではないされた後、catchブロックが実行されていない、ルーチンは直接終了 
            システム。OUT .println(" エラー、被除数と除数の整数でなければなりません" );
             // e.printStackTrace(); // 出力例外スタック情報、印刷エラーシーケンス、発呼手順
            e.getMessage();
             // はSystem.exit(1); 
            リターン
        } キャッチ(はArithmeticException E){ 
            システム。OUT .println(配当が0でない); 
            e.printStackTrace(); 
        } 最後に { // キャッチコールシステムあれば異常が発生したか否か、異常が一致し、最終的に、実行されます。出口(1);そして最後に、最終的には後節は行いません 
            システム。OUT .println(" ご利用いただき、誠にありがとうございます" ); 
        } 
        システム。OUT(.println " finally文の後に");
リターンに含まれる特殊な状況を試してみてください。
。異常なし(実行順序):
1.return 4. 2.finally 3.return文の実行が完了する前に、コード(それがreturn文を実行していないが、文はfinallyブロックの後に実行されません)
。異常なB(実行順序):
1.异常之前与异常代码 2.catch语句 3.finally块 4.finally块之后语句 5.执行完毕(因为异常直接跳到catch块,所以try中return不会执行)
 
特殊情况之catch中含有return
a.无异常(执行顺序):
1.执行try代码块 2.执行finally块 3.执行finally之后的语句 4.退出(无异常,所以不执行catch,直接执行finally)
b.有异常(执行顺序):
这里有两种情况
情况一(异常匹配到的代码块中有return):
1.执行try块(异常语句后的try语句均不执行)2.执行catch块return之前的语句 3.执行finally块 4.执行catch中的return语句 5.退出
情况二(异常匹配到的代码块无有return,catch在其他chtch块中)
执行到异常语句时(不执行try中异常语句之后的语句),直接跳到catch块,然后执行finally,再执行finally之后的语句
catch块的执行原理:
对于异常的捕获,可以有多个catch,对于try发生的异常,他会根据发生的异常和catch里面的异常类型进行匹配(按照catch块从上往下匹配,但并不会执行不匹配的catch块语句),当他匹配到某个catch块时,他就直接进入这个catch块内,忽略这个catch块后面的所有catch块,所以,一般将catch(Exception e)放在最后,catch块承先子类后父类排列。
 
注意:无论是否发生异常,异常是否匹配,均会执行finally块,阻止finally执行的唯一方法是在catch块中调用 System.exit(1) 语句(System.exit(1)表示非正常退出程序)。
 
 
用 throw 进行异常处理:
开发方法遇到异常时,开发人员不一定要一定去处理这个异常,可以用throws向上继续抛出这个异常(异常可以抛出多个,每个用逗号隔开),强制调用者处理这个异常,调用者可以用try-catch处理,也可以继续向上声明,若在main方法处继续向上声明,就会让jvm去处理这个异常。
自定义异常:
第一步:若需要自定义异常名字,需新建一个类MyException,并让它继承Exception;重写构造方法,
若不需要自定义异常名字,则可以略过第一步,在第二步直接书写 throw new Exception("");
public class MyEcxeption extends Exception {
    public MyEcxeption(String message) {
        super(message);
    }
}
第二步:在你需要的类中引用他(需要用关键字throw),注意,在引用类必须抛出这个异常
public void setSex(String sex) throws MyException{
    if (sex.equals("") || sex.equals("") ){
        this.sex = sex;
    }else {
        throw new MyException("性别必须为男或女");
    }

}
throw与throws的区别:
throw自行定义并抛出异常,位于方法体内部,只可以跟一个异常对象
throws抛出异常,位于方法参数列表后,可以跟多个异常类
 

おすすめ

転載: www.cnblogs.com/chengxuxiaoman/p/10960822.html