繁体   English   中英

为什么不调用Java中的静态方法?

[英]Why is call to static method in Java not being made?

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

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始终为null。 我不能中断调用静态方法的行,调试器只会忽略它-发生了什么?

编辑:感谢您的建议。

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

旁注,除了缺少class声明(这是拼写错误)之外,为什么这不是有效的Java? 为什么这显然是 C#代码? 解释比起投票要有用:)

编辑II: Params仅应指示参数的全部负载-抱歉,如果这使任何人感到困惑,我显然知道参数具有类型声明,依此类推,上面的代码旨在作为速记版本,而不是完整的(复杂的) )实际样本...

有两个选择:

  • 抛出异常,您以某种方式丢失了该异常
  • 您不是在调试自己认为的代码(即,内置代码与源代码已过时)

后者是最有可能的国际海事组织。

显然,您正在吞下构造函数中的异常,例如:

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

你绝对不应该那样做。 它使调试和确定根本原因变得更加困难。 宁可throw它,也至少要做e.printStackTrace() 如果抛出,并且由于某些原因不想使用throws子句,请考虑使用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();
}

我了解您正在尝试通过一个简单的示例来展示您的问题,但是,如果将适当的类型语句添加到示例代码中,则它既可以编译,又可以满足您的期望。

但是,在原始代码库中,您只需将断点放在静态方法中即可查看是否调用了该断点。

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

没错:

MyClass inst = MyClass.GetMyClass(Params);

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

首先开始:

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(/ parameter list /); 被称为。 这条线很可能永远不会被击中。

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

我认为捕获java.lang.Exception未能捕获问题的原因是因为在这种情况下它可能太具体了。 尝试捕获java.lang.Throwable ,它将捕获诸如java.lang.NoClassDefFoundError之类的错误-当您在某个位置缺少jar时经常出现这种错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM