2013-04-29 25 views
2

我確定在這裏閱讀了try catch性能的其他帖子,但我不確定如果在我的觀點中使用它,那很好。
我正在使用它在我的gameLoop的某些點上。
起初。我正在使用libgdx的Stage and Actor系統。但是當我改變地圖清除舞臺時,它有時會在舞臺上拍攝NullPointerException是一個可以在mapchange場景中使用的try catch

Exception in thread "LWJGL Application" java.lang.NullPointerException 
at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48) 
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:202) 
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:166) 
at com.portaaenigma.screens.GameScreen.render(GameScreen.java:91) 
at com.badlogic.gdx.Game.render(Game.java:46) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:202) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110) 

因此,我添加了一個簡單的嘗試抓住,因爲我不能以任何其他方式處理它。我嘗試了一個狀態,並在改變地圖,清除舞臺和添加新怪物的同時將狀態改爲別的東西。但它實際上做了同樣的錯誤。在嘗試捕捉看起來是這樣的:

if (this.status == GameStatus.GAME) { 
     try { 
      this.figureStage.act(); // figures act <-- this is line 91 
     } catch (NullPointerException e) { 
      // catching nullpointer at mapchange 
      Gdx.app.log(this.getClass().getSimpleName(), 
        "Nullpointer catched at mapswitch: " + e.getMessage()); 
     } 
    } 

我有點糊塗了,如果這是可以的,因爲我在我看來或多或少像一個「修復」的解決方案。它確實沒有任何問題。當我改變地圖時,它確實會拋出,但我不明白爲什麼。
我還需要在我的怪物的查找方法中添加一個try catch。如果我進入地圖變化,而它在我的碰撞檢測中出現在怪物的界限之外。

好的一般問題是,如果這是一個可接受的解決方案,或者如果應該有一個更好的解決方案?

回答

5

你說得對。這是一個黑客。黑客可能會很好地幫助你取得進展,但在某些時候你需要弄清楚導致你的NPE的原因。

讀取堆棧,找到NPE行,找出哪個指針爲空,然後找到一種方法來防止它爲null或添加一個分支,以防止代碼運行。

一個技巧可能會幫助如果在可能的情況下使用有效的對象來代替null。例如,如果您正在查找一個不存在的人,請返回一個NOBODY對象(您自己定義)而不是null。用中性值覆蓋所有選擇器(獲取方法)。

+0

是的,我認爲是的。但是我沒有從它那裏得到它。我很困惑它是如何發生的。如果角色與mapchange字段發生衝突,則該字符將調用更改Map方法。在那種情況下,我確實拯救了我的老怪物,並清除了迭代過程使我的所有演員變得更加強壯的舞臺。儘管渲染試圖採取行動是不可能的。我真的沒有得到它...... Id發佈,但它有點「更多」 – BennX 2013-04-29 19:08:43

+0

看看Group.java,第48行。該行預計要填寫一些值。在那裏找到值,然後找到該地點在你的代碼中它應該被填充(更少見的是,你已經正確地填寫了這個值,並且這個錯誤在庫中,但是不要把它作爲你的第一個猜測) – 2013-04-29 19:12:08

+0

我在你引用的庫中探索過, NOBODY技巧在這裏不適合你,但要記住未來。 – 2013-04-29 19:12:55

相關問題