【问题标题】:Out of bounds error Index 99 Size 1超出范围错误索引 99 大小 1
【发布时间】:2018-11-06 09:35:07
【问题描述】:

我正在做一个解决表达式的程序。我已经让它工作了,但是当代码通过除号“/”读取时,它显示为index out of bounds,我不知道如何修复它。可能会问你伟大的Java头脑来看看并给我一些关于做什么的提示?我不希望答案只是提示,以便我可以学习。

谢谢!

我的程序的主类:

import java.util.ArrayList;
import java.util.Scanner;
import static java.lang.Integer.*;
import static java.lang.System.*;
public class ExpressionSolver
{
    int answer;
    String expString;
    ArrayList<String> exp;
    public ExpressionSolver(String s)
    {
        setExpression(s);
    }
    public void setExpression(String s)
    {
        expString = s;
        exp = new ArrayList<String>();
        for(String temp: s.split(" "))
        {
         exp.add(temp);
        }
    }
    public void solveExpression()
    { 
       int index1, index2, num1, num2;        
      while(exp.contains("*") || exp.contains("/"))
      {
           index1 = exp.indexOf("*");
           index2 = 0;
           if(index1 <= 0)
           {
             index1 = exp.indexOf("/");
             index2 = 1;
           }
         num1 = Integer.parseInt(exp.get(index1-1));
         num2 = Integer.parseInt(exp.get(index1+1));
        if(index2 == 0)
         {
            answer = num1 * num2;
         }
         else
         {
            answer = num1 / num2;
         }
         exp.remove(index1 - 1);
         exp.remove(index1 - 1);
         exp.set(index1 - 1, Integer.toString(answer));
      }
      while(exp.contains("+") || exp.contains("-"))
      {
           index1 = exp.indexOf("+");
           index2 = 0;
           if(index1 <= 0)
           {
             index1 = exp.indexOf("-");
          index2 = 1;
           }
         num1 = Integer.parseInt(exp.get(index1-1));
         num2 = Integer.parseInt(exp.get(index1+1));
        if(index2 == 0)
         {
            answer = num1 + num2;
         }
         else
         {
            answer = num1 - num2;
         }
         exp.remove(index1 - 1);
         exp.remove(index1 - 1);
         exp.set(index1 - 1, Integer.toString(answer));
      }
}
  public String toString()   
  {
   return expString + " = " + answer;
  }
}

我的跑步者课

import java.util.ArrayList;
import java.util.Scanner;
import static java.lang.Integer.*;
import static java.lang.System.*;

public class ExpressionSolverRunner
{
    public static void main( String args[] )
    {  
      ExpressionSolver test = new ExpressionSolver("3 + 3");
      test.solveExpression();
      System.out.println(test);

      test.setExpression("3 * 5");
      test.solveExpression();
      System.out.println(test);

      test.setExpression("3 - 5");
      test.solveExpression();
      System.out.println(test);

      test.setExpression("3 / 5");
      test.solveExpression();
      System.out.println(test);
    }  

}

我的输出

----jGRASP exec: java ExpressionSolverRunner
3 + 3 = 6
3 * 5 = 15
3 - 5 = -2
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 99, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.set(ArrayList.java:444)
    at ExpressionSolver.solveExpression(ExpressionSolver.java:60)
    at ExpressionSolverRunner.main(ExpressionSolverRunner.java:29)

 ----jGRASP wedge2: exit code for process is 1.
 ----jGRASP: operation complete.

每当程序读取3 / 5 时,就会出现越界错误。答案应该是 0。

【问题讨论】:

  • 什么语句对应'solveExpression'中的第60行

标签: java arrays indexoutofboundsexception


【解决方案1】:

关于您的代码的一般提示:

  1. 对于分析问题,如果代码准确反映了您在生成堆栈跟踪时使用的代码,将会有所帮助。行号表明情况并非如此。

  2. if(index1 &lt;= 0):不要明白:如果index1 == 0 表示匹配(您测试的字符串的第一个字符)。我想你想要类似if(index1 &lt; 0)

    说实话,我不明白为什么- 测试没有抛出异常。可能你贴的代码和测试结果不同步?

  3. 您所说的index2 不是索引,而是逻辑上的布尔值。您似乎仍在正确评估它,但如果您使用布尔值和不同的名称(例如 boolean index1DidNotMatch 或类似名称),它将大大提高代码的可读性

我们可以讨论更多的事情,但既然你想要一些提示,也许我写的内容会帮助你解决问题。

【讨论】:

  • 你的提示对我有帮助,我让程序打印输出没有任何异常错误,但我有一个小问题。当我添加一个额外的测试用例 5 / 5 * 2 + 8 / 2 + 5 我得到的答案是 17 而不是 11..
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2016-04-09
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多