-1

我有一个相当标准的创建模式,其中一个类公开了一个用于返回自身实例的静态方法,如下所示:

public class MyClass {

    private MyClass(/*parameter list*/) {
        // internal construction
    }    

    public static MyClass GetMyClass(/*parameter list*/) {
        return new MyClass(/*parameter list*/);
    }
}

...

//this line wont break in the debugger and seemingly never gets called - why?
MyClass inst = MyClass.GetMyClass(/*parameter list*/);

但是,inst始终为空。我无法中断调用静态方法的行,调试器只是忽略它 - 发生了什么?

编辑:感谢您的建议。

  • 所有项目都已清理和重建(在 NetBeans 中手动)
  • 我在静态方法中添加了一个中断,不,它没有被击中。
  • 是的,上面的代码(最终)在 Swing 'FrameView' 的构造函数中被调用,尽管我从哪里调用它肯定不重要,不是吗?
  • 随地吞咽也不例外

旁注,除了缺少class声明(这是一个错字)之外,为什么这不是有效的 Java?为什么这显然是C# 代码?解释会比投反对票更有帮助:)

编辑二:Params只是应该表示一个完整的参数负载 - 对不起,如果这让任何人感到困惑,我显然知道参数有类型声明等等,上面的代码是一个快速的速记版本,而不是一个完整的和(复杂的)真实样本...

4

7 回答 7

1

没有任何问题:

MyClass inst = MyClass.GetMyClass(Params);

这取决于那行代码之前或之后的内容。

于 2009-12-30T20:36:08.603 回答
1

几个选项:

  • 抛出一个异常,你不知何故失踪了
  • 您没有调试您认为的代码(即您的构建代码与您的源代码已过时)

后者是最有可能的,IMO。

于 2009-12-30T19:46:27.190 回答
1

显然,您在构造函数中吞下了一个异常,例如:

try {
    // Something.
} catch (Exception e) {
}

你不应该那样做。它使调试和确定根本原因变得更加困难。而是throw它或至少做一个e.printStackTrace(). throws如果抛出并且由于某些原因不想使用该子句,请考虑使用 a RuntimeException(或其子类之一)。例如

try {
    // Something.
} catch (Exception e) {
    throw new RuntimeException("Construction failed.", e); // Try to be more specific, e.g. IllegalArgumentException or so. Or just write robust code, i.e. nullchecks and so on.
}

或(但我认为在您的情况下不太适用):

try {
    // Something.
} catch (Exception e) {
    e.printStackTrace();
}
于 2009-12-30T19:49:51.743 回答
1

我了解您正在尝试制作一个简单的示例来显示您的问题,但是如果您将适当的类型语句添加到示例代码中,那么它既可以编译又可以执行您期望的操作。

但是,在您的原始代码库中,您可以简单地将断点放在静态方法中以查看它是否被调用。

也许是一个简单的问题,但你永远不知道……你确定你正在运行你认为正在运行的代码吗?也就是说,所有东西都是从最新的来源重新编译和构建的吗?

于 2009-12-30T19:50:53.797 回答
1

从这样做开始:

public class MyClass 
{
    private MyClass(/*parameter list*/) 
    {
        System.out.println("entering MyClass(...)");
        // internal construction
        System.out.println("leaving MyClass(...)");
    }    

    // Java uses lower case for method names - so get not Get
    public static MyClass getMyClass(/*parameter list*/) 
    {
        final MyClass foo;

        System.out.println("entering getMyClass(...)");

        foo = new MyClass(...);

        System.out.println("leaving getMyClass(...)");

        return (foo);
    }
}

...

MyClass inst = MyClass.getMyClass(/*parameter list*/);

查看是否在调试器之外调用了代码。

如果您发现任何异常,请至少执行以下操作:

catch(final WhateverException ex)
{
    // at the very least do this so you can see that the exception happens
    ex.printStackTrace();
}

避免捕获 Throwable、Error、Exception 和 RuntimeException。事实上,最好的方法是去掉所有的 catch 语句,然后只为编译器告诉你必须拥有的内容添加 catch。

另一件事是你不说哪里 MyClass inst = MyClass.getMyClass(/参数列表/); 被称为从。这条线完全有可能永远不会被击中。

于 2009-12-30T21:10:10.367 回答
1

您提到您从 FrameView 的构造函数中调用它,但我假设您正在谈论该接口/对象的实现或扩展。我的理由是确保您不会递归地调用构造函数。

于 2009-12-30T21:10:33.937 回答
0

我认为捕获java.lang.Exception没有发现问题的原因是因为在这种情况下它可能太具体了。尝试捕获java.lang.Throwable它将捕获诸如java.lang.NoClassDefFoundError 之类的错误- 当您在某处丢失 jar 时经常会出现这种错误。

于 2010-01-13T00:13:37.567 回答