[英]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。 我不能中断调用静态方法的行,调试器只会忽略它-发生了什么?
编辑:感谢您的建议。
旁注,除了缺少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.