我經歷了一個小程序,並且遇到了一個錯誤,我無法找到解決方案。將創建的對象添加到列表中時遇到問題
我的目標是通過觸發一個點擊來創建一個創建的對象(從JPanel擴展的BlockObject)列表(使用ArrayList),然後能夠讀取列表以在屏幕上打印它,但是當時閱讀這樣的列表我得到ArrayOutOfBoundsException。
我一直在調試,發現麻煩的原因,這就是我不知道爲什麼,我創建並添加到它的每個對象檢索最新類型(前面解釋),而不是與哪個它被創造了。
沿列表運行的代碼是
public void ListBlock(){
BlockObject auxb;
Point auxp;
for(int i = 0; i < list.size(); i++){
auxb = list.get(i);
if(auxb.getType() != 0){
auxp = list.get(i).limitBounds(0, list.get(i - 1).getHeight());
auxb.setBounds((int) auxp.getX(), (int) auxp.getY(), GlobalDataStorage.StatementWidth, GlobalDataStorage.StatementHeight);
}
add(auxb);
}
}
麻煩的說,這是因爲它在IF()條件總是得到,因此,即使第一個元素將前一個(爲OutOfBounds的原因),但已經有內部在每一時刻的元素這將是類型0到跳吧,剩下的在裏面輸入:
list = new ArrayList<BlockObject>();
startingBlock = new BlockObject(0);
類型有0,但它更改爲提前解釋,那是什麼不應該發生,不知道它爲什麼會這樣。
以下元素加入:
public void mouseClicked(MouseEvent evt) {
point = new Point(evt.getX(), evt.getY());;
if((findComponentAt(point) instanceof BlockObject) && (StatementPanel.getType() != 0)){
list.add(new BlockObject(StatementPanel.getType()));
ListBlock();
revalidate();
repaint();
}
}
類型在BlockObject創建它保存在一個變量,它應該不會改變,所以每次創作我認爲這會被保存在一個列表值,但它不斷更改在StatementPanel中選擇的新葉(StatementPanel在JTree後實現,每個葉不同類型)時創建的所有先前對象。 雖然也許這是獲得類型的靜態方法,但沒有添加不同的工作。
也許問題很明顯,我看不到它。
學習如何使用調試器,然後您可以自己調查這類錯誤,並且所花費的時間遠遠少於編寫此問題的時間。 http://www.vogella.com/articles/EclipseDebugging/article.html –
聽起來像一個靜態變量問題 – MadProgrammer
@MadProgrammer看到你的評論後,我檢查了變量,這是問題,保持一個靜態,離開它彷彿是正常的。沒想到會給我帶來這樣的麻煩。感謝您的幫助以及所有回覆帖子提示的人。 – user1869292