2012-08-02 66 views
2
import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 

public class Images { 
    try { 
     public static Image button = new Image("images/buttons/0/Button.png"); 
    } catch(SlickException e) { 
    e.printStackTrace(); 
    } 
} 

這只是給出了一個錯誤外,我希望能夠到一些圖像存儲在靜態變量和從其他類訪問它們沒有實例它。爪哇 - 使用TryCatch的方法

我可能會做一個方法來初始化它們併爲它們設置值,但是這些變量不會是靜態的。

我之所以需要TryCatch是因爲Image類的構造函數拋出一個SlickException

+0

什麼錯誤?你能給我們更多的細節,請問? – 2012-08-02 12:03:52

+0

也許還加上'final'。然後編譯器強迫你考慮在該catch塊中分配什麼。 – Thilo 2012-08-02 12:06:44

回答

9

兩個選項:

  • 使用一個靜態初始化塊

    public static final Image button; 
    
    static { 
        try/catch in here, assign to button 
    } 
    
  • 用於初始化

    public static final Image button = createButton(); 
    
    private static Image createButton() { 
        try/catch in here 
    } 
    
的方法

就我個人而言,我對這是一個好主意有點懷疑 - 使得類型初始化做「實際工作」可能會導致難以追蹤的錯誤。是否所有引用代碼確實爲設置爲空,以防出現問題?

+0

初始化靜態初始化器中的圖像很糟糕,因爲您要麼吃掉異常,要麼返回null(或者whoops img),要麼崩潰整個應用程序,並且出現以下LinkageError(有時會被屏蔽,吃掉和意外)。 – bestsss 2012-08-08 00:44:21

2

你可以把你的異常處理代碼在static塊。

public static Image button; 

static { 
    try { 
     button = new Image("images/buttons/0/Button.png"); 
    } catch(SlickException e) { 
     e.printStackTrace(); 
    } 
} 
0

您應該使用靜態構造函數。

public class Images { 
    public static Image button; 

    static{ 
     try { 
      button = new Image("images/buttons/0/Button.png");  
     } catch(SlickException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
1

嘗試把它變成一個靜態塊

public static Image button; 
    static{ 
      try { 
       button = new Image("images/buttons/0/Button.png"); 
      } catch(SlickException e) { 
      e.printStackTrace(); 
      } 
     } 
1

剛剛宣佈block..and將工作以外的靜態變量..

public static final Image button = setImageButt(); 

public static Image setImageButt(){ 
    try { 
     button = new Image("images/buttons/0/Button.png"); 
    } catch(SlickException e) { 
     e.printStackTrace(); 
    } 
} 
0

使用靜態塊初始化,並採取額外注意不要吞下例外:

public class Images { 

    public final static Image BUTTON; 
    static { 
     Image i; 
     try { 
      i = new Image("images/buttons/0/Button.png"); 
     } catch (SlickException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
     BUTTON = i; 
    } 
} 

我更正了一些代碼:

  • 創建在初始化圖像意味着它應該是恆定的,從而最終
  • 常量應該有大寫的名字,因此BUTTON
  • 初始化過程中的異常不應該被吞噬,而是正確指示。否則,您可以花數小時調試未找到的圖像,因爲沒有指示初始化失敗。 ExceptionInInitializerError是拋出這種情況的標準異常。

還有其他解決方案,但這是最乾淨的IMO。

0

我曾經遇到過類似的問題,並且找到了我剛纔遇到的這個問題的解決方案。我已經解決了將所有代碼放在默認構造函數中的類似問題。

您的解決方案的代碼將是這樣的:

import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 

public class Images { 

    public Images{ 
     try { 
     public static Image button = new Image("images/buttons/0/Button.png"); 
     } catch(SlickException e) { 
      e.printStackTrace(); 
     } 
    } 
}