[英]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.