Ошибка за границей Индекс 99 Размер 1 - PullRequest
0 голосов
/ 27 мая 2018

Я делаю программу, которая решает выражения.Я заставил его работать, но когда код читает знак деления "/", он выглядит как 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.

1 Ответ

0 голосов
/ 28 мая 2018

Некоторые подсказки относительно вашего кода в целом:

  1. Для анализа проблемы было бы полезно, если код точно соответствует коду, который вы использовали при создании трассировки стека.Номера строк указывают на то, что это не так.

  2. if(index1 <= 0): не получить это: если index1 == 0, это означает, что было совпадение (первый символ строки, которую выиспытано).Я полагаю, вы хотите что-то вроде if(index1 < 0)

    Если честно, я не понимаю, почему тест - не выдал исключение.Может быть, код, который вы разместили, не синхронизирован с результатом теста?

  3. То, что вы называете index2, не является индексом, а логически логическим.Кажется, что вы все еще оцениваете его правильно, но это значительно повысит читабельность кода, если вы используете логическое значение и другое имя (например, boolean index1DidNotMatch или что-то подобное)

Мы могли бы обсудить еще кое-что, но, поскольку вам нужны некоторые советы, возможно, то, что я написал, поможет вам немного решить проблему.

...