簡體   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