写了一个每一秒循环更新一次好友列表,并将在线好友置顶的JList,结果运行的时候打印出数组越界异常。
而且不是每次寻环都打印异常,大概十几二十秒才打印一次,而且中间间隔时间不确定。
如果我把循环时间改为一毫秒,控制台就是飞快打印异常;如果改成5毫秒,就是等待一段时间,并不是刚才的五倍时间。
挺纳闷的,本人新手,望高手解答,第一次发帖,请多关照!
import java.util.HashMap;import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;public class WhileTest { JFrame jf = new JFrame();
@SuppressWarnings("unchecked")
DefaultListModel lm = new DefaultListModel();
JList jl = new JList(lm);
public WhileTest(){
jf.setVisible(true);
jf.setBounds(300, 300, 300, 300);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(jl);
lm.add(0, "好友a");
lm.add(1, "好友b");
lm.add(2, "好友c");
String[] s= new String[]{"好友a","好友b"};//a、b是要置顶的在线好友
// 问题处在下面;
while (true) {
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < lm.size(); j++) {
if (s[i].equals(lm.get(j))) {
lm.removeElementAt(j);
lm.add(0, s[i]);


}
}
//  上面是问题 try {
Thread.sleep(1);//线程停止一毫秒重新循环
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}




public static void main(String[] args){


WhileTest wt = new WhileTest();
  }
}

解决方案 »

  1.   

    import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JList;public class WhileTest { JFrame jf = new JFrame();
    DefaultListModel lm = new DefaultListModel();
    JList jl = new JList(lm);
    public WhileTest(){
    jf.setVisible(true);
    jf.setBounds(300, 300, 300, 300);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.add(jl);
    lm.add(0, "a");
    lm.add(1, "b");
    lm.add(2, "c");
    String[] s= new String[]{"a","b"};
    // 问题处在下面;
    while (true) {
    for (int i = 0; i < s.length; i++) {
    for (int j = 0; j < lm.size(); j++) {
    if (s[i].equals(lm.get(j))) {
    lm.removeElementAt(j);
    lm.add(0, s[i]);


    }
    }
    //  两端注释之间是问题所在
    try {
    Thread.sleep(1);//线程停止一秒重新循环
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }




    public static void main(String[] args){


    WhileTest wt = new WhileTest();
      }
    }
      

  2.   


    import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JList;public class WhileTest { JFrame jf = new JFrame();
    DefaultListModel lm = new DefaultListModel();
    JList jl = new JList(lm);
    public WhileTest(){
    jf.setVisible(true);
    jf.setBounds(300, 300, 300, 300);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.add(jl);
    lm.add(0, "a");
    lm.add(1, "b");
    lm.add(2, "c");
    String[] s= new String[]{"a","b"};
    // 问题处在下面;
    while (true) {
    for (int i = 0; i < s.length; i++) {
    for (int j = 0; j < lm.size(); j++) {
    if (s[i].equals(lm.get(j))) {
    lm.removeElementAt(j);
    lm.add(0, s[i]);


    }
    }
    //  两端注释之间是问题所在
    try {
    Thread.sleep(1);//线程停止一秒重新循环
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }




    public static void main(String[] args){


    WhileTest wt = new WhileTest();
      }
    }
      

  3.   

    import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JList;public class WhileTest { JFrame jf = new JFrame();
    DefaultListModel lm = new DefaultListModel();
    JList jl = new JList(lm);
    public WhileTest(){
    jf.setVisible(true);
    jf.setBounds(300, 300, 300, 300);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.add(jl);
    lm.add(0, "a");
    lm.add(1, "b");
    lm.add(2, "c");
    String[] s= new String[]{"a","b"};
    // 问题处在下面;
    while (true) {
    for (int i = 0; i < s.length; i++) {
    for (int j = 0; j < lm.size(); j++) {
    if (s[i].equals(lm.get(j))) {
    lm.removeElementAt(j);
    lm.add(0, s[i]);


    }
    }
    //  两端注释之间是问题所在
    try {
    Thread.sleep(1);//线程停止一秒重新循环
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }




    public static void main(String[] args){


    WhileTest wt = new WhileTest();
      }
    }
      

  4.   

    主要是循环要放到独立线程中运行,楼主参见下面的代码public class WhileTest { JFrame jf = new JFrame();
    @SuppressWarnings("unchecked")
    DefaultListModel lm = new DefaultListModel();
    JList jl = new JList(lm); public WhileTest() {
    jf.setVisible(true);
    jf.setBounds(300, 300, 300, 300);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.add(jl);
    lm.add(0, "好友a");
    lm.add(1, "好友b");
    lm.add(2, "好友c");
    final String[] s = new String[] { "好友a", "好友b" };// a、b是要置顶的在线好友
    // 问题处在下面;
    new Thread(){
    public void run(){
    while (true) {
    for (int i = 0; i < s.length; i++) {
    String item = s[i];
    moveToTop( item );
    // 上面是问题
    try {
    Thread.sleep(1000);// 线程停止一毫秒重新循环
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    }
    }.start();
    } private void moveToTop( String item ) {
    for (int j = 0; j < lm.size(); j++) {
    if (item.equals(lm.get(j))) {
    lm.removeElementAt(j);
    lm.add(0, item); }
    }
    } public static void main(String[] args) { WhileTest wt = new WhileTest();
    }
    }
    moveToTop方法是我重构出来的,为了好看一点点。
      

  5.   

    lz单步调试下,应该是i,j的问题,超过了数组大小
      

  6.   

    for (int j = 0; j < lm.size(); j++) { //改为 for (int j=lm.size()-1; j>=0; j--) 就好了
    if (s[i].equals(lm.get(j))) { //这样删除会造成越界
    lm.removeElementAt(j);
    lm.add(0, s[i]);
      

  7.   

    看调用堆栈是在UI重绘界面的时候抛出的异常,所以可以肯定是线程同步的问题。JList在重绘界面的时候调用的数据被你程序的线程修改了。正在想怎么解决
      

  8.   

    问题找到了:http://blog.csdn.net/swingline/article/details/5496008