2017-03-29 47 views
-3

私はかなり数値と演算子の文字列を取り、それらを分割し、次に計算をしているプログラムを書いています。 Forループ内の各演算子に対して4つのIF文があります。コードはコンパイルされますが、私にはIndexOutOfBoundsExceptionが与えられます。0のサイズ:0行目は70と28になります。これはどうして起こっているのですか?ありがとう。IndexOutOfBoundsExceptionインデックス0サイズ0

import java.util.*; 
import java.io.*; 

public class Lab8 
{ 
public static void main(String[] args) 
{ 
    if (args.length<1) { System.out.println("FATAL ERROR: Missing expression on command line\nexample: java Lab8 3+13/5-16*3\n"); System.exit(0); } 

    String expr= args[0]; // i.e. somethinig like "4+5-12/3.5-5.4*3.14"; 
    System.out.println("expr: " + expr); 
    ArrayList<String> operatorList = new ArrayList<String>(); 
    ArrayList<String> operandList = new ArrayList<String>(); 

    StringTokenizer st = new StringTokenizer(expr,"+-*/", true); 
    while (st.hasMoreTokens()) 
    { 
     String token = st.nextToken(); 
     if ("+-/*".contains(token)) 
      operatorList.add(token); 
     else 
      operandList.add(token); 
     } 
    System.out.println("Operators:" + operatorList); 
    System.out.println("Operands:" + operandList); 

    double result = evaluate(operatorList, operandList); 
    System.out.println("The expression: " + expr + " evalutes to " + result + "\n"); 
} // END MAIN 





static double evaluate(ArrayList<String> operatorList, ArrayList<String> operandList) 
{ 
    String operator; 
    double result; 

    ArrayList<Double> andList = new ArrayList<Double>(); 

    for(String op : operandList) 
    { 
     andList.add(Double.parseDouble(op)); 
    } 

    for(int i=0;i<operatorList.size();++i) 
    { 
     if(operatorList.get(i).equals("*")) 
     { 
     operator = operatorList.get(i); 
     } 
      result = andList.get(i) * andList.get(i+1); 
      andList.set(i,result); 
     //operandList.set(i,result); 
      andList.remove(i+1); 
      operatorList.remove(i); 


     if(operatorList.get(i).equals("/")) 
     { 
      operator = operatorList.get(i); 
     } 
      result = andList.get(i)/andList.get(i+1); 
      andList.set(i,result); 
      andList.remove(i+1); 
      operatorList.remove(i); 



     if(operatorList.get(i).equals("+")) 
     { 
      operator = operatorList.get(i); 
     } 
      result = andList.get(i) + andList.get(i+1); 
      andList.set(i,result); 
      andList.remove(i+1); 
      operatorList.remove(i); 



     if(operatorList.get(i).equals("-")) 
     { 
      operator = operatorList.get(i); 
     } 
      result = andList.get(i) - andList.get(i+1); 
      andList.set(i,result); 
      andList.remove(i+1); 
      operatorList.remove(i); 

    } 

    return andList.get(0); 
} 

} //

+0

どの行が70と28ですか?私たち自身のために数えないでください...ところで、JavaScriptとJavaは完全に別の言語であるため、あなたの質問から「JavaScript」タグを削除しました。 – nnnnnn

+0

'return andList.get(0);'このリストは空です –

+0

それをコンパイルし、 'expr'にサンプル値を手動で入力すると、例外がスローされません:expr:4 + 5-12/3.55.4 * 3.14 オペレータ:[+、 - 、/、 - 、*] オペランド:[4,5,12,3.5,5.4,3.14] 式:4 + 5-12/3.5-5.4 * 3.14 evalutes to -0.2333333333333334 終了コード0で処理が完了しました – Coop

答えて

-1

以下のコードに問題があるように見えます。

if(operatorList.get(i).equals("*")) 
      { 
       operator = operatorList.get(i); 
      } 
      result = andList.get(i) * andList.get(i+1); 
      andList.set(i,result); 
      //operandList.set(i,result); 
      andList.remove(i+1); 
      operatorList.remove(i); 


      if(operatorList.get(i).equals("/")) 
      { 
       operator = operatorList.get(i); 
      } 
      result = andList.get(i)/andList.get(i+1); 
      andList.set(i,result); 
      andList.remove(i+1); 
      operatorList.remove(i); 



      if(operatorList.get(i).equals("+")) 
      { 
       operator = operatorList.get(i); 
      } 
      result = andList.get(i) + andList.get(i+1); 
      andList.set(i,result); 
      andList.remove(i+1); 
      operatorList.remove(i); 



      if(operatorList.get(i).equals("-")) 
      { 
       operator = operatorList.get(i); 
      } 
      result = andList.get(i) - andList.get(i+1); 
      andList.set(i,result); 
      andList.remove(i+1); 
      operatorList.remove(i); 

すべてすべてのループ場合は、コード

おそらくあれば、前のブロックの一部であるべき
result = andList.get(i) * andList.get(i+1); 
       andList.set(i,result); 
       //operandList.set(i,result); 
       andList.remove(i+1); 
       operatorList.remove(i); 

の同じセットを持っています。ここで起こっているのは、コードが70行目に達し、以前のoperatorList.removeステートメントでoperatorListから要素を削除したことです。コードがif loop .e.gに属しているかどうかを確認して修正する必要があります。最初のifループの場合 -

if(operatorList.get(i).equals("*")) 
    { 
     operator = operatorList.get(i); 
     result = andList.get(i) * andList.get(i+1); 
     andList.set(i,result); 
     //operandList.set(i,result); 
     andList.remove(i+1); 
     operatorList.remove(i); 
    } 

本当に必要ですか?

関連する問題