我有一个相当标准的创建模式,其中一个类公开了一个静态方法来返回自身的实例,如下所示:
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
始终为空。我不能打破调用静态方法的行,调试器只是忽略它 - 发生了什么?
编辑:感谢您的建议。
旁注,除了缺少的class
声明(这是一个错字),为什么这不是有效的Java?为什么这个显然是 C#代码?解释比downvotes更有帮助:)
编辑II:Params
只是表示一大堆参数 - 抱歉,如果这让任何人感到困惑,我显然知道参数有类型声明等等,上面的代码旨在作为快速简写版本,而不是完整和(复杂)真实样本......
答案 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时会频繁出现。