为什么 return 在 Java 中不退出函数?



我在Java中使用此函数时遇到问题。我不明白为什么当lastNodeAttributes==null为真时,执行会像应该的那样跳到return null;,但在那之后,它没有从函数返回,而是直接跳到最后的return fight...;。为什么第一个返回不退出,而执行跳到第二个条件部分返回??这怎么可能呢?请解释一下,因为我显然不了解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());
    }
}

您所描述的是不可能的。return语句确实总是返回所声明的内容。有几种可能性可以解释为什么您可能在调试器中看到这种行为

  • 您没有调试您认为正在调试的代码。调试器加载的类可能与您想象的不同。请尝试清理并重新编译代码,然后再次调试
  • 该代码是在发布模式下编译的,并且已经转换了您的语句。在发布模式下使用优化代码进行调试有时会使调试器中断,从而使错误的语句在调试器中显示为已执行,而不是实际执行的语句。您确定要调试的代码未优化吗
  • 如果你不仔细思考,线程问题也会导致奇怪的跳跃。如果在返回语句和多个线程上都有断点,那么一个线程可能会达到第一个返回,然后另一个线程则可能达到第二个返回。这并没有错,这只是调试多线程应用程序的工作方式

检查实际的返回值也将确认实际上只有一个return语句被执行。要做到这一点,请将断点放置在调用者而不是被调用者

首先开始调试应用程序。一个好的调试教程可以在这里找到:http://www.vogella.com/articles/EclipseDebugging/article.html

验证lastNodeAttributes是否真的为null。还要检查,如果该方法可能执行了两次,在第一种情况下,lastNodeAttributes为null,而在第二种情况下则不是。

Return确实退出了该方法。请检查您是否使用了最新编译的类。试着做一个干净的构建。从第一行开始调试,确保没有两次运行相同的方法。如果有疑问,请在类的开头添加system.out,以确保您检查的是正确的类版本

最新更新