キーワード:
してみてください:コードの実行が異常生み出すこと
キャッチ:例外をキャッチ
最後に:異常コードが常に実行されているかどうか
スロー: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抛出异常,位于方法参数列表后,可以跟多个异常类