【问题标题】:Constructor being called again?构造函数再次被调用?
【发布时间】:2011-02-12 09:28:00
【问题描述】:

我有这个构造函数;

public UmlDiagramEntity(ReportElement reportElement, int pageIndex, Controller controller) {
    super(reportElement.getX1(), reportElement.getY1(), reportElement.getX2(), reportElement.getY2());
    setLayout(null);

    this.pageIndex = pageIndex;
    this.controller = controller;
    reportElements = reportElement.getInternalReportElements();
    components = new ArrayList<AbstractEntity>();
    changedComponentIndex = -1;

    PageListener p = new PageListener();
    this.addMouseMotionListener(p);
    this.addMouseListener(p);

    setPage();
}

而且我在同一个类中有一个更新方法;

   @Override
    public void update(ReportElement reportElement) {
        if (changedComponentIndex == -1) {
            super.update(reportElement);
        } else {
            reportElements = reportElement.getInternalReportElements();
            if (components.size() == reportElements.size()) {
                if (!isCommitted) {
                    if (reportElement.getType() == ReportElementType.UmlRelation) {
                        if (checkInvolvementAndSet(changedComponentIndex)) {
                            anchorEntity(changedComponentIndex);
                        } else {
                            resistChanges(changedComponentIndex);
                        }
                        return;
                    }
                }
..................goes on

当我遵循调试器的流程时,我看到当调用 update 时,在方法的某处,程序进入构造函数并重新执行它(super、pageIndex 等)。为什么它会去构造函数 :D 我没有告诉它去那里。

如果你愿意,我可以进行更深入的分析,看看它去哪里构造函数。顺便说一句,changedComponentIndex 是一个静态变量。

【问题讨论】:

  • 你能显示一下它何时再次进入构造函数的堆栈跟踪吗?
  • “如果你愿意,我可以做一个更深入的分析,看看它去哪里构造函数。”我认为这可能会帮助您回答自己的问题...
  • 哦,对不起,我现在才知道,这可能不是一个不寻常的电话,而是我的错误。
  • @thomas 确实做到了:)

标签: java constructor methods call static-variables


【解决方案1】:

这是多线程的吗?是否可能正在调用在另一个线程上创建的不同实例的构造函数?

【讨论】:

  • 不不,谢谢,我以为发生了不可能的事情,所以我有点吓坏了。
【解决方案2】:

您确定更新不是从构造函数中间接调用的,这会导致更新中的断点被触发。

尝试在构造函数的开头和结尾设置一个断点,然后在更新中设置一个。当您点击第一个构造函数断点时,点击“继续”并查看下一个触发哪个断点。

【讨论】:

    【解决方案3】:

    您描述的行为几乎是不可能的。您的代码与您显示的不同,或者您没有调试您认为正在调试的代码。没有complete code that we can run,我们只能这么说。

    【讨论】:

    • 是的,我从更新中调用的方法有问题。有一分钟我以为“不可能”已经发生了。
    【解决方案4】:

    我会发现你看到它构造两个不同的对象的可能性要大得多。您必须提供更多信息,例如堆栈跟踪;在这里你甚至没有显示被调用的构造函数!

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多