![](/img/trans.png)
[英]I am having trouble figuring out what to do with the error I receive. This is my Shopping Cart project
[英]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");
那樣:
NullPointerException
,則立即知道問題不是空參數。 然后,一旦您知道它們不為null
就可以添加對參數的進一步驗證:
if (holder.getBehavior() == null)
throw new IllegalArgumentException("holder's behavior is null");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.