簡體   English   中英

空指針異常錯誤,我無法搞清楚?

[英]Null pointer exception error that I am having trouble figuring out?

我無法弄清楚如何修復我的空指針。 我的持有人(持有人模式類)未定義 - 我不知道如何解決它。 我對編程還很陌生。 感謝有關如何解決這個問題的任何想法!

public Goose (JPanel container, GooseBehavior behavior, BehaviorHolder holder) {
    super(container); 
    _holder = holder;
    double rnd = Math.random(); //local variable to create random angle
    //System.out.println(rnd);
    this.setRotation(rnd);//sets the rotation angle to a random angle
    this.setSize(25, 20); //sets size 
    this.setFillColor(java.awt.Color.RED); //sets color 
    this.setWrapping(true); //sets wrapping to true
    _gooseBehavior = behavior; //stores _gooseehavior
    _gooseBehavior = _holder.getBehavior();
}

public void react() {
    _gooseBehavior.stop(); //tells the current _gooseBehavior to stop
    _holder.getBehavior(); //gets the stored behavior from the holder
    _gooseBehavior = _holder.getBehavior(); //sets the new value to one stored in holder
    _gooseBehavior.setTarget(this); //sets the target on goose
    _gooseBehavior.start(); //starts the behavior

}

堆棧跟蹤:

Exception in thread "main" java.lang.NullPointerException
at Animal.Goose.<init>(Bee.java:26)
at Animal.DrawingPanel.<init>(DrawingPanel.java:30)
at Animal.ControlPanel.<init>(ControlPanel.java:27)
at Animal.App.<init>(App.java:28)
at Animal.App.main(App.java:39)

這是我在控制面板(頂級對象)中實例化BehaviorHolder的代碼,然后我將它存儲在我的drawingPanel,Goose類和BehaviorButtons中,以便它與三者相關聯。

public ControlPanel() {
    super();
    this.setLayout(new BorderLayout());//sets a new BorderLayout
    _drawingPanel = new DrawingPanel(_holder); 
    _moveRandomly = new MoveBehavior();
    _doNothing = new StopBehavior();
    _kingGoose = new FollowBehavior(_kingGoose);
    _holder = new BehaviorHolder(_moveBehavior);

沒有堆棧跟蹤和不完整的代碼示例很難說,但是您的代碼存在多個潛在問題:

public Goose (JPanel container, GooseBehavior behavior, BehaviorHolder holder) {
    super(container); 

    // removed some code for clarity

    _gooseBehavior = behavior;                     // <<- You store behaviour here
    _gooseBehavior = _holder.getBehavior();        // <<- then immediately override it
}

public void react() {
    _gooseBehavior.stop();
    _holder.getBehavior();                  // <-- this isn't getting assigned to anything
    _gooseBehavior = _holder.getBehavior(); // A duplicate assignment, previously done in constructor. Are you changing holder's behaviour outside of the display class?

    _gooseBehavior.setTarget(this); //sets the target on goose
    _gooseBehavior.start(); //starts the behavior    
}

我猜_gooseBehaviour是null,但是如果你包含完整的堆棧跟蹤(打印出的錯誤讓你知道你有一個空指針異常),你可以幫助我們回答你的問題。

編輯

基於你的NPE,我會把美元押在甜甜圈上,你的持有者將作為null傳遞給構造函數。 檢查它在調試器中的值或打印出其值以進行驗證。

它可以幫助顯式驗證構造函數/方法參數,並在出現錯誤時拋出更具信息性的異常:

if (behavior == null)
    throw new NullPointerException("behavior is null");
if (holder == null)
    throw new NullPointerException("holder is null");

那樣:

  1. 如果問題是一個空參數,你不僅會立即知道這是一個參數問題,而是哪個參數是問題。
  2. 如果您在沒有任何添加信息的情況下獲得NullPointerException ,則立即知道問題不是空參數。

然后,一旦您知道它們不為null就可以添加對參數的進一步驗證:

if (holder.getBehavior() == null)
    throw new IllegalArgumentException("holder's behavior is null");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM