为什么没有在Java中调用静态方法?

时间:2009-12-30 19:41:31

标签: java static-methods

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

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#代码?解释比downvotes更有帮助:)

编辑II:Params只是表示一大堆参数 - 抱歉,如果这让任何人感到困惑,我显然知道参数有类型声明等等,上面的代码旨在作为快速简写版本,而不是完整和(复杂)真实样本......

7 个答案:

答案 0 :(得分:1)

有两种选择:

  • 正在抛出一个你不知何故失踪的例外
  • 您没有调试您认为自己的代码(即您的构建代码与源代码已过时)

后者最有可能是IMO。

答案 1 :(得分:1)

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

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

你永远不应该这样做。它使调试和确定更多的根本原因更难。而是throw它或者至少做e.printStackTrace()。如果由于某些原因而抛出并且您不想使用throws子句,请考虑使用RuntimeException(或其子类之一)。 E.g。

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();
}

答案 2 :(得分:1)

我知道你正在尝试用一个简单的例子来展示你的问题,但是如果你在你的示例代码中添加了相应的类型语句,那么它既可以编译也可以达到预期的效果。

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

也许是一个简单的问题,但你永远不知道......你确定你运行的是你认为正在运行的代码吗?也就是说,是否所有内容都是根据最新资源重新编译和构建的?

答案 3 :(得分:1)

没有错:

MyClass inst = MyClass.GetMyClass(Params);

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

答案 4 :(得分: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(/ 参数列表 /);被称为。这条线完全有可能永远不会被击中。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

我认为捕获 java.lang.Exception 的原因并没有解决问题,因为在这种情况下它可能过于具体。尝试捕获 java.lang.Throwable ,它会捕获 java.lang.NoClassDefFoundError 等错误 - 当你在某个地方丢失一个jar时会频繁出现。