【问题标题】:Runtime errors when attempting to delete and shift array of object in GUI interface尝试在 GUI 界面中删除和移动对象数组时出现运行时错误
【发布时间】:2014-11-24 06:50:42
【问题描述】:

我的项目包含 2 个类文件和一个用于使用数据的测试应用程序 GUI 界面。这两个类文件,都是我自己创建的,分别是ToolItem(定义了一个硬件工具有get()set()方法,display()方法等)和HardWareStore,用来操作数据和放置使用insert()delete()searchArray() 等方法将其放入数组中。

包含相同相关按钮(插入、删除)的 GUI 界面在按下相应按钮时调用HardWareStore

到目前为止,除了删除按钮/delete() 方法外,一切正常。我的方法如下,包括我创建的searchArray() 方法,它在delete() 内部用于评估唯一ID 并确定该ID 是否已经存在:

搜索数组:

public int searchArray(int id)
    {
        for (index = 0; index < toolArray.length; index++)
        {
            if (toolArray[index].getToolID() == id)
            {
                System.out.println("ID found at location " + index);
                return index;
            }
        }   
        return -1;
    }//end searchArray

删除:

public int delete(int ID)
    {
        testArray = searchArray(ID);   

        if (testArray != -1)
        {   
            toolArray[testArray].setQuality(0);
            toolArray[testArray].setToolName("");
            toolArray[testArray].setID(0);
            toolArray[testArray].setNumberInStock(0);
            toolArray[testArray].setPrice(0.0);

            //counter for number of items in array. Array holds 10 objects
            numberOfItems--; 

            //shifting cells
            for (index = testArray + 1; index < toolArray.length; index++)
            {
                toolArray[index - 1] = toolArray[index];
            }

            toolArray[toolArray.length - 1] = null;

            System.out.println("Successful deletion");
            return 1;
        }
        else
            System.out.println("ID not found");
            return -1;

    }//end delete

这是用于在我的测试应用程序中删除数据的相应 GUI 按钮:

else if (ev.getSource() == deleteBtn)
            {
                input = idFld.getText();
                idInput = Integer.parseInt(input);

                responseCode = store.delete(idInput);

                if (responseCode == 1)
                {
                    messageFld.setText(idInput + " - Successful deletion");
                }
                else if (responseCode == -1)
                {
                    messageFld.setText(idInput + " - ID not found");
                }

            }//end delete button

现在,一切都可以正常插入,检测重复的 ID,等等。 delete 方法也有效,让我知道用户传递的 ID 已在 toolArray[index] 以及所有相关数据成员处删除。

当我去显示数组中的项目时发生错误。前 9 项使用 JOptionPane 显示正常,但是当我到达第 10 项时(我的删除方法应该在删除后将所有单元格向左移动)我收到几个运行时错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException.

我很确定我的错误始于HardWareStore 中的delete() 方法,特别是我的循环删除和向左移动项目。我已经把它弄乱了几个小时,但我似乎找不到原因,我尝试更改循环要么导致另一个运行时错误,要么该方法的行为不像它应该的那样。

【问题讨论】:

  • delete() 和从数组“get()”中读取是否同时发生?例如在不同的线程上说?
  • 我查看了例外列表,但并没有出现。我没有在运行时错误中看到对任何 get() 方法的引用,但我不是 100% 确定:/ 第一个例外是在 searchArray() 和 insert() ,具有讽刺意味的是,这些方法和方法在正常情况下工作正常。只有当我删除一个项目并尝试插入()另一个对象或显示()表示数据时才会发生运行时错误。这就是为什么我认为我移动数组的方式存在问题。
  • 我的意思是 get() 准确地说,我的意思是在删除的同时对数组进行任何形式的访问,因为如果你这样删除,同时移动和读取,数据将被损坏,有这个问题之前...stackoverflow.com/questions/24917931/…
  • 哦,好吧。好吧,如果有什么我学到了一些东西。感谢您的意见。

标签: java arrays user-interface


【解决方案1】:

我只有一个笼统的说法,那就是不要使用 Java 原始数组。为自己省去很多麻烦,使用ArrayList。这样您就可以简单地remove 索引处的元素,然后无需手动管理原始数组中的元素。

如果没有明确的异常跟踪和显示事物显示方式的代码 sn-p,我只是在推测,但是当您删除一个项目时,您会手动移动所有内容并在数组末尾附加一个 null 值。然后显示您的数组时,您很可能在取消引用 null 对象时遇到了 NullPointerException

一般来说,您应该很少需要原始数组。请改用ArrayList 并使用其remove 方法删除项目。

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多