数组索引越界 - Java

2023-12-26

我已经开始编写我的第一个 Java 程序,这是一个简单的计算器,但是我收到一条错误消息,声称我的数组超出范围。我尝试对其进行调试,以了解出现这种情况的位置和原因,并按照纸上的代码进行操作,这两者都显示了我期望和希望的结果。因此,我看不出问题到底出在哪里。代码不完整。

根据调试器,错误发生在这一行:

answer = outputNum.get(operationIndex) * outputNum.get(operationIndex+1);

这是我目前拥有的代码的主要部分:

   private class ButtonHandler implements ActionListener {

        /*
         * "outputNum" stores the numbers entered in order.
         * "orderOfOperations" stores all numbers in order after multiplication and division has been taken care of.
         * "operationList" stores the mathematical operations entered in order.
         * "currentNum" stores the most recently inputed numbers.
         * "currentString" stores the most recently inputed string of numbers.
         * "answer" stores temporary values and ultimately the answer to the inputed equation.
         * "start" stores whether or not the equals button has been pressed and a new equation has started.
         */
        ArrayList <Double> outputNum = new ArrayList <Double> (0);
        ArrayList <Double> orderOfOperations = new ArrayList <Double> (0);
        ArrayList <String> operationList = new ArrayList <String> (0);
        Double currentNum = 0.0;
        String currentString = "0";
        Double answer = 0.0;
        boolean start = false;

            public void actionPerformed(ActionEvent event) {

                if(event.getSource() == equalsBtn) {

                    /* Takes the current numbers string and convert it into a double.
                     * Let the order of operations be the inputed order for now.
                     * "operationIndex" to get values inside of the unchanging arrays "outputNum" and "operationList".
                     * "orderIndex" to get values inside of the changing array "orderOfOperations".
                     */
                    currentNum = Double.parseDouble(currentString);
                    outputNum.add(currentNum);
                    orderOfOperations = outputNum;
                    int operationIndex = 0;
                    int orderIndex = 0;

                        //Cycle through the mathematical operations that occur in the current equation.
                        for(String operation : operationList) {

                            if(operation == "x" || operation == "÷") {

                                // Multiply/divide numbers with the multiply/divide operations together.
                                if(operation == "x") {

                                    answer = outputNum.get(operationIndex) * outputNum.get(operationIndex+1);

                                }
                                else {

                                    answer = outputNum.get(operationIndex) / outputNum.get(operationIndex+1);

                                }

                                // Replace numbers multiplied/divided in the above statement with the new answer.
                                orderOfOperations.remove(orderIndex);
                                orderOfOperations.set(orderIndex, answer);
                                orderIndex++;

                            }

                            operationIndex++;

                        }

                    // Reset variables to the default values for the new equation.
                    System.out.println(orderOfOperations);
                    outputString = answer.toString();
                    answer = 0.0;
                    currentNum = 0.0;
                    currentString = "0";
                    outputNum.clear();
                    operationList.clear();
                    orderOfOperations.clear();
                    start = true;

                }
                else if(event.getSource() == additionBtn || event.getSource() == subtractionBtn || event.getSource() == multiplicationBtn || event.getSource() == divisionBtn) {

                    // Sets the text fields text blank if this is the start of a new equation.
                    if(start) {

                        outputString = "";
                        start = false;

                    }

                    /*
                     * Takes the current numbers string and convert it into a double.
                     * Add the mathematical operation and reset the current number.
                     */
                    currentNum = Double.parseDouble(currentString);
                    outputNum.add(currentNum);
                    operationList.add(event.getActionCommand());
                    currentString = "0";
                    outputString = String.format("%s%s", outputString, event.getActionCommand());

                }
                else {

                    // Sets the text fields text blank if this is the start of a new equation.
                    if(start) {

                        outputString = "";
                        start = false;

                    }

                    // Adds the button value to the text field text and the current number being inputed.
                    currentString = String.format("%s%s", currentString, event.getActionCommand());
                    outputString = String.format("%s%s", outputString, event.getActionCommand());

                }

            outputScreen.setText(outputString);

        }

    }

这是我收到的错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at MainWindow$ButtonHandler.actionPerformed(MainWindow.java:141)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6414)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
    at java.awt.Component.processEvent(Component.java:6179)
    at java.awt.Container.processEvent(Container.java:2084)
    at java.awt.Component.dispatchEventImpl(Component.java:4776)
    at java.awt.Container.dispatchEventImpl(Container.java:2142)
    at java.awt.Component.dispatchEvent(Component.java:4604)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4279)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4209)
    at java.awt.Container.dispatchEventImpl(Container.java:2128)
    at java.awt.Window.dispatchEventImpl(Window.java:2492)
    at java.awt.Component.dispatchEvent(Component.java:4604)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:717)
    at java.awt.EventQueue.access$400(EventQueue.java:82)
    at java.awt.EventQueue$2.run(EventQueue.java:676)
    at java.awt.EventQueue$2.run(EventQueue.java:674)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:690)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:687)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

When operationIndex等于最后一个元素索引outputNum, then operationIndex + 1将大于最后一个元素索引:因此你的异常

你最好使用for从索引 1 开始的循环,并执行以下操作:

// assuming that operationList and outputNum always 
//   have the same number of elements
for (int i = 1; i < operationList.size(); i++) {
  ...
  answer = outputNum.get(i - 1) * outputNum.get(i);
  ...
}

或者,使用当前循环,但执行以下操作:

  // operationIndex++; // remove this and use ..
  if (++operationIndex >= outputNum.size()) break;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组索引越界 - Java 的相关文章

  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐