2012-08-16 30 views
0

這裏的對象的初始化的摘錄:有時會拋出NullPointerException,有時不會。怎麼修?

... 
      Rectangle b1 = tenBullets.getBounds(); 
    ... 

這裏的getBounds()方法:

public Rectangle getBounds() { 
    return new Rectangle(x, y, 200, 25); 
} 

這裏是控制檯消息:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at test.game.Board.checkCollisions(Board.java:75) 
at test.game.Board.actionPerformed(Board.java:53) 
at javax.swing.Timer.fireActionPerformed(Unknown Source) 
at javax.swing.Timer$DoPostEvent.run(Unknown Source) 
at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

Board.java :75是調用getBounds()方法的時候。有時會拋出異常,第10次中有1次不是。任何修復?

+3

已經看到了它。如果線75'tenBullets.getBounds()''然後是tenBullets'空出於某種原因,wihch我們可以不要猜測,因爲你沒有顯示相關代碼(=你初始化該變量的位置)。 – assylias 2012-08-16 10:31:22

+0

你可以檢查tenBullets的值,可能使用某種記錄器 – MadProgrammer 2012-08-16 10:33:10

+0

@ user1496383任何其他調用之間使用tenBullets和75行之間?任何try/catch塊? – assylias 2012-08-16 10:47:11

回答

0

NullPointerException被拋出,因爲tenBulletsnull當該方法被調用 - 而你試圖在空對象上調用一個方法(這是不可能的,並導致異常)。

爲了解決這個問題,你需要做兩件事情之一:

  1. 更改上述行爲,使tenBullets總是被分配一個值,你就可以打電話getBounds()之前。這是選擇的選項是tenBullets應該從來沒有此時爲空。
  2. 使問題容忍的代碼爲空 - 檢查if (tenBullets == null),並採取一些替代措施,如果這是真的。如果null可能是一個合理的值(這可能可能或可能不會被初始化),這是選擇選項。如果是這樣,你必須處理這種可能性。

不理解代碼的意圖或上下文,不可能給出具體的建議。但是,如果tenBullets是一個字段(而不是本地變量),請考慮它是否有有意義,因爲它未被設置(或修改);如果不是,則申報final。這將保證它在構造函數中初始化並始終保持該值。

一般來說,減少可變字段/變量的數量使得關於程序的推理變得容易得多,因爲您需要更少地意識到在執行時它可能或不可能處於什麼狀態。這聽起來像是你的問題在這裏,tenBullets正在被某些其他代碼分配,並且沒有明確的排序。

+0

感謝您快速回復!我宣稱它是一個全球性的最終目標 - 並解決了這個問題。 – fukijama 2012-08-16 10:48:28

0

從您所展示的內容來看,我不能肯定地說,但有時候我在Eclipse中遇到了不一致情況,當時我重命名文件和代碼片段。儘管一切都是正確的,但Eclipse已經緩存了一些可能會衝突的舊名稱。

要解決此問題,請轉至項目 - >清理並刪除所有已編譯的文件。

同樣,不知道這是你的問題在這裏,但我之前

相關問題