0
enter code here
  `class Rethrow
   {
    public static void genException()
   {
        int n[]={4,8,16,32,64,128};
        int d[]={2,0,8,0,4};

        for(int i=0;i<n.length;i++)
        {                                     
            try{
                System.out.println("n/d is:"+n[i]/d[i]);

               }
            catch(ArithmeticException exc)
              {
                System.out.println("Cant Divide By Zero");
                throw exc;
              }
            catch(ArrayIndexOutOfBoundsException exc)
             {
                System.out.println("No match element found ");
                // rethrow the exception
             }
        }
    }
}

class RethrowDemo
{
    public static void main(String args[])
    {
        try 
        {
            Rethrow.genException();
        }
        catch(ArithmeticException exc)  // catch the rethrow Exception
        {
            // recatch exception
            System.out.println("Fatal Error "+"Program Termiated.");
        }
    }
}

これはプログラムの出力です

質問 1::「RethrowDemo」クラスの catch が、「Rethrow」クラスの catch(Arithmetic Exception) によってスローされた例外を終了させるのはなぜですか。

質問 2:: 制御権の移転はどのように機能しますか??

4

1 に答える 1

1

Java では、アプリケーションの通常のフローを中断するイベントが発生すると、Exceptionオブジェクトが作成され、コール スタックに渡されて、呼び出し元によって処理されるか、さらに上に渡されて、より上位の何かによって処理/処理されます。階層で。

ゼロで除算できないためArithmeticException、行からスローされ、ブロックSystem.out.println("n/d is:"+n[i]/d[i]);内でこれを行っているため、 「内からスローされた場合、私はそれを処理するためにここにいます」と言います。try...catchcatch(ArithmeticException exc)ArithmeticExceptiontry

このcatchブロックで、印刷してからCant Divide By Zero元の例外を再スローします。次に、これは呼び出し元のメソッドにバブルアップしますが、あなたの場合はメソッドになりますが、「再スローされたものに対処します」と言う内からmain呼び出しを行っているためです。この時点で、印刷してアプリケーションを終了します。try...catch(ArithmeticException exc)catchmainArithmeticExceptionFatal Error Program Termiated

Java で例外がどのように機能するかを完全に説明するチュートリアルはたくさんあるので、いくつか見てみると役に立ちます。

例外に関するチュートリアル

例外に関する別のチュートリアル

于 2016-07-19T13:22:15.300 に答える