2

私はJava言語に不慣れで、このプログラムのfinallyブロックの動作を理解できません。このプログラムは、BCDを印刷しているのに対し、BCを印刷した後に終了する必要があります。助けてください。

class Main 
{  
    public static void main(String [] args) 
    {
        try 
        {
            badMethod();  
            System.out.print("A"); 
        }  
        catch (Exception ex) 
        {
            System.out.print("B");  
        } 
        finally 
        {
            System.out.print("C"); 
        } 
        System.out.print("D"); 
    }  
    public static void badMethod() throws Exception
    {
        throw new Exception(); /* Line 22 */
    } 
}
4

10 に答える 10

8

例外を(catchブロックで)キャッチし、再スローしません。したがって、例外を効果的に処理し、スローされなかったかのように実行が続行されます。プログラムは、メソッドの最後に到達したためにのみ終了します。プログラムがmain突然終了したわけではありません。

コードを変更して、catchブロックから例外を再スローするか、最初から例外をキャッチしない場合(どちらも、もちろん、mainスローを宣言する必要がありますException)、出力されませんD

于 2012-04-17T13:59:17.130 に答える
4

プログラムを終了させるものは何もありません。

catchブロックの要点は、例外をキャッチし、それがさらに伝播するのを防ぐことです。
例外をキャッチした後、実行は続行されます。

于 2012-04-17T13:59:28.963 に答える
4

ブロックはプログラムをファイナライズしません。finally例外があるかどうかにかかわらず、trycatchブロックが実行されるたびに必ず実行されます。

于 2012-04-17T14:01:01.303 に答える
1

ブロックBCで例外を再スローすると出力されます。catch

catch (Exception ex) 
{
    System.out.print("B");  
    throw ex;
}

次に、メインを次のように宣言する必要があります

public static void main(String [] args) throws Exception
于 2012-04-17T13:58:50.780 に答える
1

最後に、try/catchブロックの最後に呼び出されます。tryが失敗してcatchが実行されても呼び出されます。ブロック自体は、Finallyプログラムが何らかの理由で強制終了された場合にのみ実行されません(JVMが停止したり、強制的に閉じられたりするなど)。

あなたの例では、Dはtry / catch /finally{}ブロックの外にあるため実行しています。

例外のキャッチとtry/catch/finallyの動作に関するすばらしいブログ投稿がここにあります。

于 2012-04-17T14:00:07.830 に答える
1

どちらが正しい。上記のコードはそうなります。

  1. 実行しようとするbadMethodと失敗します
  2. でコードを実行しますcatch
  3. でコードを実行しますfinally
  4. 実行を続行します-Dを印刷します
于 2012-04-17T14:00:21.137 に答える
1

ブロックは、またはブロックの実行finally後に処理されます(例外がスロー/キャッチされたかどうかによって異なります)。例外がすべて適切にキャッチされ、によって処理された場合、例外が実行され、残りのメソッドの実行が続行されます。trycatchcatchfinally

于 2012-04-17T14:00:49.057 に答える
1

プログラムは次のように機能しています。 1. 例外をスローする不適切なメソッドを呼び出す 2. 例外をキャッチする 3. finally ブロックを実行する 4. 再開する

Java では、例外がスローされたときに、例外が処理された場合、必ずしもプログラムの実行が終了するとは限りません。あなたのプログラムは実際には例外を処理しませんが、とにかくそれをキャッチします。これは、JVM が実行を再開しても問題ないと考えるのに十分です。

出力 BCD は非常に適切な出力です。

于 2012-04-17T14:02:20.247 に答える
1

最後に、Java プログラムの必須実行可能ブロックです。これにより、現在実行中のプログラムに割り当てられたすべてのリソースが解放され、必要に応じて他のアプリケーションで使用できるようになります。

これは主に、データベースやデバイスなどの共通リソースを共有する場合に使用されます。

于 2012-04-17T14:10:07.643 に答える
1

finally ブロックは独立したコードのブロックと考えてください。例外が発生するかどうかに関係なく、メソッドが引き続き実行されることが期待されます。

したがって、あなたの場合、badMethodcatch ブロックによって結果的にキャッチされる例外をスローし、メインは finally ブロックを個別に実行して続行します。

つまり、badMethod例外をスローしないことにした場合でも、finally ブロックはメソッドの最後に到達する前に引き続き実行されます。

したがって、最終的に独立したブロックになったので、必要に応じてメイン コードでこのようなことを行うこともできます。

try
{
 fooA();
}
finally
{
 fooB();
}
于 2012-04-17T14:14:00.810 に答える