当前位置: 首页 > 知识库问答 >
问题:

如何在动态更新JComboBox时避免IndexOutOfBounds异常(调试帮助)

裴弘
2023-03-14

我使用SWING API编写了一个GUI。

我有一组表单,每个表单都帮助用户创建预定义类型的对象。完成后,用户通过单击JButton确认创建。

我得到了一个遵循单例模式的类(DataManager)。此外,该类遵循观察者和工厂模式。DataManager是一个可观察的对象。观察到的数据格式如下:

public static List<Target> targets = new ArrayList<Target>();

DataManager类包含一组方法,用于创建对象的预定义类型<示例:

public static final void createTarget(String id, double x, double y, double z){
    targets.add(new Target(id,x,y,z));
    notifyTargetObservers();
}

其中一种形式是观察者对象,它观察DataManager在其列表(例如列表目标…)中保存的任何数据中的更新。

IObserve:

public interface IObserve {
public void updateTargets();
public void updateSources();
public void updateFluids();
}

观测器实现了IObserver中引入的方法<示例

@Override   
public void updateTargets(){  
cbAnalysisTargets.addItem(DataManager.targets.get(DataManager.targets.size()-1));
    }

cbAnalysisTargets是一个JComboBox,当新对象引入到环境中时,它需要动态更新<可观察:

public abstract class IObservable {
private static Set<IObserve> targetObservers = new HashSet<IObserve>();
private static Set<IObserve> sourceObservers = new HashSet<IObserve>();
private static Set<IObserve> fluidObservers = new HashSet<IObserve>();

public final void addTargetObserver(IObserve o){
    targetObservers.add(o);
}

public final void addSourceObserver(IObserve o){
    sourceObservers.add(o);
}

public final void addFluidObserver(IObserve o){
    fluidObservers.add(o);
}


public static final void notifyTargetObservers(){
    for(IObserve observer : targetObservers){
        observer.updateTargets();
    }
}

public static final void notifySourceObservers(){
    for(IObserve observer : sourceObservers){
        observer.updateSources();
    }
}

public static final void notifyFluidObservers(){
    for(IObserve observer : fluidObservers){
        observer.updateFluids();
    }
  }
}

问题出在IndexOutOfBound Exception中。异常出现在以下场景中:
1.用户打开第一个表单并成功启动创建2个相同类型的预定义对象。
2.用户打开第二个表单;填写表单并在确认后(单击按钮)收到以下声明的异常。

理想情况下,我希望在解决以下问题和解决以下例外情况方面得到帮助。

例外:

异常在线程"AWT-EventQueue-0"andler.actionIndexOutOfBoundsException: Index: 1, size: 1 atjavax.swing.ArrayLodel.fire检查(未知来源)atjavax.swing.ArrayLodel.set(未知来源)atjavax.swing.plaf.basic.Analysis CreatorPistener.mouse源(Analysis CreatorPjava.awt.)atomponent.processIOjavax.swing.SourceObserver(IOomponent.process)atjava.awt.IDataMomponent.processSource(IDataManager.java:29)atfprof.application.data.frame.manager.content.SourceCreatorGroup$1.action执行(SourceCreatorPanel.java:127)atjavax.swing.AbstractButton.fire动作执行(未知来源)atjavax.swing.AbstractButton$Hjava.lang.执行(未知来源)atjava.util.DefaultButtonMist.range动作执行(未知来源)atjava.util.DefaultButtonMist.get按(未知来源)atfprof.application.data.frame.manager.content.BasicButtonLanel.update发布(未知来源)atanel.java:99Cfprof.application.utility.MouseEvent(未知来源)atbservable.notifyJCbservable.java:32MouseEvent(未知来源)atfprof.application.data.manager.Canager.createEvent(未知来源)at java. awa在java. awt上的轻量级调度器.进程MouseEvent(未知源)在java. awt上的轻量级调度器.调度事件(未知源)在java. awt上的容器.调度事件Impl(未知源)在java. awt上的窗口.调度事件Impl(未知源)在java. awt上的组件.调度事件(未知源)在java. awt上的事件队列.调度事件Impl(未知源)在java. awt上的事件队列. access 500美元(未知源)在java. awt上的事件队列3美元. run(未知源)在java. awt上的事件队列3美元. run(未知源)在java. security上的未知源。java. security上的AccessController. doPrivileged(本机方法)。java. security上的保护域1美元. doIntersectionPrivilge(未知源)。保护域1美元. doIntersectionPriijava. awt上的EventDispatchThread.泵浦事件(未知源)。java. awt上的EventDispatchThread.泵浦事件(未知源)。EventDispatchThread. run(未知源)

编辑1:updateSource方法:

@Override
    public void updateSources(){
        cbAnalysisSources.addItem(DataManager.sources.get(DataManager.sources.size()-1));
    }

共有1个答案

颜森
2023-03-14

Eclipse中基本调试的一些介绍,因为这非常重要,可以解决几乎所有的错误和错误。Eclipse可以帮助您做很多事情,但我将向您展示基础知识,您可以从那里阅读和探索。尽管如此,它还是很有用的。

我做了一段简单的代码来处理:

public class Example {

    public static void main(String[] args) {

        int[] array = new int[] {12, 14, 523, 5423, 12, 0 ,14, -3, 521, 2};
        int pos = 0;
        for (int i = 0; i < 16; i++) {
            array[i] = -1;
            pos = increment(pos);
        }
    }

    static int increment(int pos) {

        int num = pos + 1;
        return num;
    }
}

如果您运行它,它将抛出一个“ArrayIndexOutOfBoundsException”。为了调试,我们需要在代码中我们认为问题开始的地方设置断点,可能靠近引发异常的行。断点背后的想法是,代码到达标记有断点的行时将停止运行。双击编辑器中相应行旁边的左栏可以输入断点(请参见红色圆圈)。您可以在不同的位置输入多个断点。然后,单击调试按钮(黄色圆圈)。确保它不是“运行”按钮,因为这样会忽略断点。

然后,您将进入调试透视图,该透视图提供了不同的视图(我的视图从默认视图重新排列):

你在这里看到的是:

  1. 查看列出所有变量(包括字段、数组等)及其值。对于对象(类实例和数组),您将有一个展开箭头来显示其类成员和属性。每当其中一个值发生c变化时,它将以黄色突出显示
  2. 显示上面视图中选定线的值。有些物体又长又复杂,所以在那里看很方便
  3. 普通编辑器,但带有一个高亮显示器,可以显示代码所在的位置。我们很快就会讨论这个问题。代码位于断点处,因为这是它第一次停止的地方
  4. 只有控制台才能看到指纹
  5. 有关线程的信息。运行多线程程序时,它将列出所有线程及其状态。在这里,您将看到线程main被挂起,原因是断点位于第9行,这就是它应该是的

现在转到“调试本身”。您可以在“运行”菜单下找到许多选项,但有用的选项有:

  • F6-跳过:这将在跳过方法调用时前进到代码中的下一行。
  • F5-进入:这将前进到代码中的下一行并输入方法调用。请注意,如果您有JDK(或附加源代码的JRE),它将进入Oracle的库,这通常不是您想要的。有时他们的代码非常复杂,如果您继续进入它,您可能永远不会回来...
  • F8-恢复:这将运行代码,直到到达下一个断点。例如,如果您在循环中运行,它可以是编辑器中的相同断点。
  • F7-步骤返回:这将运行代码,直到当前方法返回(如果适用)。
  • Ctrl-R-运行到行:这将运行代码,直到您放置插入符号的行。

演示:

  1. 按F6的F5,您将看到在视图1中,变量i是在while循环中创建的,因此添加的。其赋值为0

试着在更复杂的情况下运行调试器,直到您感觉舒服为止。您可以将pos更改为i,使程序更有趣。这是

如何避免IndexOutOfBounds异常。

如果您有任何问题,请留下评论。

 类似资料:
  • 我正在尝试更新此代码以处理Discord。jsv12。我遇到了一个错误,我有点困惑于如何修复这个错误。我已经更新了一些代码来处理Discord。jsv12。 client.channels.fetch... 在客户端。(/home/runner/Log/index.js:44:40)在客户端。在客户端发出(events.js:314:20)。事件发射器。在MessageCreateAction处发

  • 问题内容: 我正在从数据库中成功获取数据值。我也将它们存储到一个数组中。我需要将String数组作为项的加载,以响应执行的关键操作。每当获取按键值时,如何获取按键值,就如何重新加载项目。相反,我需要动态刷新项目。 问题答案:

  • 问题内容: 我有一个带有标题的表,一个带有输入字段的行,一个带有数据的行。像这样。http://brow.hu/sitegen/stackoverflow_table_example.png 如果有人在输入字段中输入内容,我想使用ajax查询过滤数据。收到新表后,我更改了旧表的内容: 并闪烁。如何避免呢? 问题答案: 避免闪烁的一种方法称为双缓冲。在Ajax中,只需两个div占用相同的空间即可完成

  • 我正在用反应原生构建一个项目。我有一个动态的玩家列表,我希望用户能够编辑。 我想实现的是: 用户输入名称 用户按enter键 我们称之为addPlayer,它添加一个播放器 新的输入出现并得到关注(通过其他功能) 我得到的是: < li >用户输入姓名 < li >用户按enter键 < li >我们调用addPlayer来添加播放器 < li >键盘开始关闭一会儿,然后在新输入出现时重新打开。

  • 问题内容: 我正在研究从文件读取大量数据的应用程序。基本上,我有一个巨大的文件(大约1.5-2个演出),其中包含不同的对象(每个文件约5至1000万个对象)。我需要阅读所有内容,并将其放置在应用程序中的不同地图上。问题是该应用程序在某些时候读取对象时内存不足。仅当我将其设置为使用- Xmx4096m时,它才能处理该文件。但是,如果文件更大,它将无法再执行此操作。 这是代码片段: 首先,我使用的是

  • 我正在尝试正确地使用ByteBuffer和BigEndian字节顺序格式。。 我有几个字段,我试图把它存储在Cassandra数据库之前放在一个单一的ByteBuffer中。 我将要写入Cassandra的字节数组由三个字节数组组成,如下所述- 现在,我需要快速压缩attributeValue数据,然后再将其存储在Cassandra中- 现在,我将编写,和snappy压缩的一起组成一个单字节数组,