我正在通过一个小程序并得到一个我无法找到解决方案的错误。
我的目标是通过触发点击添加到列表(使用ArrayList)创建的对象(从JPanel扩展的BlockObject)创建,然后能够读取列表以在屏幕上打印它,但是在阅读这样的列表我得到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之后实现的,每个叶子都是不同的类型)。 虽然这可能是获取类型的静态方法,但是没有添加不同的方法。
也许问题很明显,我看不到它。
答案 0 :(得分:1)
我认为你有这个问题:
Example e = new Example();
e.ChangeValue("e");
List<Example> examples = new List<Example>();
examples.add(e);
e.ChangeValue("e2");
examples.add(e);
这个问题是,如果你在列表中添加e,它只是创建一个对象的引用,并且添加到列表中的两个都指向相同的引用(因此更改一个也会改变另一个),解决方案将创建一个新的对象作为一个新的示例并将其值复制到它,这样你就不会有参考问题,并且一次只能改变一个