Javaオブジェクト指向の詳細な異常

Javaの例外オブジェクト指向[A]

Javaオブジェクト指向異常[2]

過去のイベント:我々は、大きく変わった連続システムを総括前には、例外を説明し、エラーの上位2つのカテゴリは、親クラスのThrowableから継承されたが、また、異常なコンパイル時と実行時の異常との違いについて話しました、およそ異常な話をしています途中でキャプチャのいくつかのタイプの取り扱いおよび治療。
Benpianネクサスは、異常はすべての後に、初期段階では、これはちょうど彼らが現在の仕上げに何を学ぶまとめて、都合の良い時に実際の場面での異常な使用を体験することができないかもしれない今、それに続く新しい経験で、残りの部分からまとめたが、それが更新されます。

例外ルールをキャプチャ

  • 異常がtryブロックの実行中に発生していない、あることは明らかであるもちろん、スキップされたcatch節の異常がありません
  • 例外がスローされた場合は逆に、それがされます試し中の残りのステートメントをスキップし、例外処理コードを探し始めます。以下の例外処理コードは、特定のプロセスを見つけることです。
  • 現在の方法から、コールチェーンに沿った方法は、例外の伝播の逆方向の異常を見つけるために、コードを扱います。
  • 最初から最後のチェックcatchブロックに、それが一致するか否かが判断されます。もしそうなら、おめでとうございます!処理例外ステートメントに直接catchブロックが実行され、そうでない場合、渡された異常なメソッドの呼び出し元は、同じステップの発信者で進行:マッチングをアップロードを処理する......一致しません
  • あなたは最後まで見つからない場合は、プログラムが終了し、印刷段階でエラーメッセージを出力します。
    この方法は、比較的簡単な言葉であれば、実際には、それは非常に簡単です。、状況はZeyangそれであることの方法ネストされた層ならば、LETのは、上記のことを確認します。
//主方法
public static void main(String[] args) {
    try{
    //调用m1()
        m1();
        System.out.println("ExceptionMyDemo.main");
    }catch (Exception e){
        System.out.println("ExceptionMyDemo.main.catch");
    }
}
//m1()
private static void m1(){
    try{
    //调用m2()
        m2();
        System.out.println("ExceptionMyDemo.m1");
    }catch (NullPointerException e){
        System.out.println("ExceptionMyDemo.m1.catch");
    }
}
//m2()
private static void m2(){
    String str = null;
    System.out.println(str.hashCode());
}
//测试结果:
ExceptionMyDemo.m1.catch
ExceptionMyDemo.main
  • あなたはそれがメインの方法で適切に実行されます、それは例外を受信しない、ヌルポインタ例外スロー平方メートルのタイプのマッチング、直接処理をキャプチャM1、見ることができます。
  • 私たちは、M1の例外タイプは他のタイプに置き換えられてキャッチした場合、例えばcatch (ArithmeticException e)、ときのテスト結果は次のようになります。
//更改之后的测试结果:
ExceptionMyDemo.main.catch

M2()が例外をスローしない正しくので、投げるmainメソッド内治療法を見つける、M1で処理するので、その後、処理文を実行します。

  • これによれば、我々は、例外条項の主な方法は、結果はシェーンを実行していることになる、削除、変更後の上に基づいている場合に対処言及?まあ、予想通り、次のような結果です。

例外投げ人々が対処しなかったので、それはコンソール上の例外スタックトレースを出力します、約投げ異常が、私たちは、詳細な分析を実施しようとしています。

アクセス例外情報

私たちは、珍しいエラーメッセージがそのように私たちはより良いハンドル例外に学び、その後、私たちはただ見ている、上記と従うことがあり、含まれている仮想マシンの両方が例外をスローしたり、我々は投げるためのイニシアチブを取る行うことを述べました例外スタックトレース:

  • public void printStackTrace():Throwableのは、オブジェクトのデフォルトのトレース情報とコールスタックを標準エラーストリームに。
  • public String getMessage():例外オブジェクト情報の文字列の説明を返します。
  • public String toString():例外情報メッセージは、そうでなければ返し、空の戻り例外クラスの完全な名前である全名:messageフォーム。
  • public StackTraceElement[] getStackTrace():アレイ内のスタックトレース要素を返し、例外オブジェクト関連付けられたスタックトレース情報を表します。

オーバーライドされたメソッドの異常

  • 異常なメソッドのオーバーロードには影響ありません。
  • メソッドを書き換える場合、例外は親コンパイルされたメソッドが例外サブクラススロー書き換えコンパイル時間をスローする方法の範囲を超えることはできません

最終的には詳細

有名な格言:かかわらず、例外が発生するかどうかの、最終的に修正条項が常に実行されます

だから我々は、単純な試みを行いました。

public static void m2(){
    try{
        System.out.println("0");
        System.out.println(1/0);
        System.out.println("1");
    }
    catch (Exception e){
        System.out.println("2");
    }
    finally {
        System.out.println("3");
    }
    System.out.println("4");
}
//测试结果
0 2 3 4 被打印在控制台上
  • 1を実行するので、見ることができます印刷されていないSystem.out.println(1/0);異常のは、catchブロックに、その後、発生し、finally節は、try文の後に、次の文を実行し、されます。
  • 次のことを想像して:別の型に受信珍しいインスタンスタイプが一致しない場合、正常にキャプチャすることができない、結果が起こるのだろうか?結果は以下の通りであります:

  • 明らかに、この時間は、最終的な結果は、あなたが異常で出ている場合でも、ブロック内のI finally文は、このための現実のシナリオで実行されなければならない、出てきたリソースの解放もあるため、重要な役割を果たしたが、特定の無さておき、その背後にあるコンテンツを学習し、いくつかのものは経験がより現実的な数になります後に優れています。
  • 注4点がキャッチ例外がないので、それは実行されませんので、例外は、呼び出し側にスローされ、印刷されていないが存在することSystem.out.println("4");

しかし、数十私たちはメソッドのリターンを返すことができるまで、不思議始めた理由の何百万人のための仮名、強制終了します。あなたは試しでreturnステートメントを使用するのであれば、最終的には心の始まり、それを強制するために継続することを忘れないのだろうか?

高エネルギーの前で!そのすべてのユニットを注意してください!
シェーン何、これらの4つの方法の結果であると思いますか?

private  static int m1(){
    try{
        return 1;
    }catch(Exception e){
    }
    return 2;
}
private static int m2(){
    try{
        return 1;
    }finally {
        return 2;
    }
    //使用finally子句时可以省略catch块
}
private static int m3(){
    try{
        return 1;
    }finally {
        try{
            return 2;
        }finally {
            return 3;
        }
    }
}
private static int m4(){
    int i = 4;
    try{
        return i++;
    }finally {
        i++;
    }
}

答えは明らかにされていますです:1,2,3,4。あなたは右のそれを推測しましたか?母......

私は答えは間違いなくその最初の3であるべきだと思うが、これは第4のビット言語道断です。finally文は、それを実行するために行ってきました、それを実行し、あなたが実行した場合、あなたは私はそれを行う6に変わるべきではないと言うことではありませんか?
金額......ケケ、まあ、私は少し困惑しているが、いくつかのアドバイスをした後、いくつかは少し知っています:

  • 試みを実行する前に、バック遂にがあれば、私たちは、地域への結果は、私は= 4という、遅延処理に戻ろうとします。
  • 次いで5となる領域増分演算子の計算において、最後にステートメントが実行されるが、領域のみの計算に6まで上昇させ、その結果は、元の4の領域ということであったからです。
  • あなたは私、私、その背後++ finally文の値を見ることができ、それを信じてはいけません!それは6です!だから、finally節は、それが疑いを超えているで実行する必要があります!

変更は、参照データ型の変数がある場合でも、それに応じて変わり、アドレスの村の人々は、その変更は、それ自体です。私はここでオーストリアの小さな簡単な例だろう。

public static Student m(){
    Student s = new Student();
    try{
        s.age = 20;
        s.name = "天乔";
        return s;
    }finally {

        s.name = "巴夏";
        s.age = 2;
    }
}
//测试结果
//Student{age=2, name='巴夏'}

この記事では、不適切な場合を説明するだけでなく、コメント欄に批判ああを願っています!

おすすめ

転載: www.cnblogs.com/summerday152/p/12180854.html