-2

Javaでこの関数に問題があります。lastNodeAttributes==null真の実行がいつジャンプするのか理解できませんreturn null;が、その直後に、関数から戻るのではなく、return fight...;最後に直接ジャンプします。最初の return が終了しないのに、実行が 2 番目の条件部分で return にジャンプするのはなぜですか?? これはどのように可能ですか?Javaの基本がどのように機能するかを理解していない原因を明らかに説明してください。

public Node undo() {
    Node lastNode=fight.getLastChild();
    NamedNodeMap lastNodeAttributes = lastNode.getAttributes();
    if(lastNodeAttributes == null) { return null; }
    else { 
        String lastNodeFighter = lastNodeAttributes.getNamedItem("fighter")
                                 .getNodeValue();
        String lastNodePoints = lastNodeAttributes.getNamedItem("points")
                                .getNodeValue();
        if(Integer.parseInt(lastNodeFighter) == 1) {
            fighter1score-=Integer.parseInt(lastNodePoints);    
        }
        else { fighter2score -= Integer.parseInt(lastNodePoints); }
        return fight.removeChild(fight.getLastChild());
    }
}
4

3 に答える 3

0

あなたが説明していることは不可能です。実際、return ステートメントは常に指定された内容を返します。デバッガーでこの動作が見られる理由にはいくつかの可能性があります

  • デバッグしていると思われるコードをデバッグしていません。デバッガーは、あなたが考えているものとは異なるクラスをロードしている可能性があります。コードをクリーンアップして再コンパイルし、もう一度デバッグしてみてください。
  • コードはリリース モードでコンパイルされ、ステートメントが入れ替わっています。最適化されたコードを使用してリリース モードでデバッグすると、デバッガーがオフになり、実際に実行されたものよりも間違ったステートメントがデバッガーで実行されたように表示されることがあります。デバッグしているコードが最適化されていないことを確認してください。
  • 慎重に考えないと、スレッド化の問題によって奇妙なジャンプが発生する可能性もあります。return ステートメントと実行中の複数のスレッドの両方にブレークポイントがある場合、1 つのスレッドが最初の return にヒットし、別のスレッドが 2 番目の return にヒットする可能性があります。それは間違いではありません。マルチスレッド アプリケーションのデバッグがどのように機能するかということです。

実際の戻り値を確認すると、実際に 1 つのreturnステートメントだけが実行されたことも確認できます。これを行うには、呼び出し先ではなく呼び出し元にブレークポイントを配置します

于 2012-08-24T09:57:16.057 に答える
0

最初にアプリケーションのデバッグを開始します。優れたデバッグ チュートリアルは、http ://www.vogella.com/articles/EclipseDebugging/article.html にあります。

lastNodeAttributes が本当に null であることを確認します。また、メソッドが 2 回実行される可能性があるかどうかも確認してください。最初のケースでは lastNodeAttributes が null で、2 番目のケースではそうではありません。

于 2012-08-24T09:54:01.927 に答える
-1

Returnはメソッドを終了します。最新のコンパイル済みクラスを使用していることを確認してください。クリーンビルドを実行してみてください。同じメソッドを2回実行していないことを確認して、最初の行からデバッグを開始します。疑わしい場合は、クラスの先頭にsystem.outを追加して、正しいクラスバージョンをチェックしていることを確認してください。

于 2012-08-24T10:33:22.433 に答える