2017-05-12 3 views
-1

私はJavaでinix式をposfixに変換し、posfix式を計算するプログラムを作ったが、特定の式で "java.lang.ArrayIndexOutOfBoundsException:-1"というエラーメッセージが出る。プログラムでこのエラーを無視して式を計算させるにはどうすればよいですか? 1 + 2 * 3^2/3-4 *(2-1)+9は123^2 * 3/+ 421 - * - 9+になり、結果は6, ,1 + 2 * 3となります。^2/3-4 *(2-1)+9+はこのエラーを示します。プログラムでArrayIndexOutOfBondsエラーを無視する方法

メインクラス:

import java.io.IOException; 
import java.util.*; 
public class Avaliador { 
    private Pilha Pilha1; 
    private String input; 
    private String output = ""; 
    public Avaliador(String in) { 
     input = in; 
     int TamanhoPilha = input.length(); 
     Pilha1 = new Pilha(TamanhoPilha,false); 
    } 
    public String Transformar() { 
     for (int j = 0; j < input.length(); j++) { 
     char ch = input.charAt(j); 
     switch (ch) { 
      case '*': 
      case '/': 
       temOperador(ch, 2); 
       break; 
      case '+': 
      case '-': 
       temOperador(ch, 1); 
       break; 
      case ')': 
       temParentesis(ch); 
       break; 
      case '(': 
       Pilha1.Inserir(ch); 
       break; 
      default: 
       output = output + ch; 
       break; 
     } 
     } 
     while (!Pilha1.Vazio()) { 
     output = output + Pilha1.Remover(); 
     } 
     return output; 
    } 
    public void temOperador(char opLer, int n1e) { 
     while (!Pilha1.Vazio()) { 
     char op = Pilha1.Remover(); 
     if (op == '(') { 
      Pilha1.Inserir(op); 
      break; 
     } else { 
      int n2e; 
      if (op == '+' || op == '-') 
      n2e = 1; 
      else 
      n2e = 2; 
      if (n2e < n1e) { 
       Pilha1.Inserir(op); 
       break; 
      } 
      else output = output + op; 
     } 
     } 
     Pilha1.Inserir(opLer); 
    } 
    public void temParentesis(char ch) { 
     while (!Pilha1.Vazio()) { 
     char chx = Pilha1.Remover(); 
     if (chx == '(') 
     break; 
     else output = output + chx; 
     } 
    } 

    public int CalculoExpressao(String exp) { 
     int n1,n2; 
     Scanner operadores = new Scanner(exp); 
     Pilha Pilha2=new Pilha(exp.length(),true); 
     while (operadores.hasNext()) { 
      if (operadores.hasNextInt()) { 
       Pilha2.Inserir(operadores.nextInt()); 
      } else { 
       n2=Pilha2.Remover2(); 
       n1=Pilha2.Remover2(); 
       String op = operadores.next(); 

       if (op.equals("+")) { 
        Pilha2.Inserir(n1 + n2); 
       } else if (op.equals("-")) { 
        Pilha2.Inserir(n1 - n2); 
       } else if (op.equals("*")) { 
        Pilha2.Inserir(n1 * n2); 
       } else { 
        Pilha2.Inserir(n1/n2); 
       } 
      } 
     } 
     return Pilha2.Remover2(); 
    } 
    public static boolean checarParen(String check){ 
     Pilha Pilha3=new Pilha(check.length(),false); 
     for(int a = 0; a < check.length(); a++) 
     { 
      char pal = check.charAt(a); 
      if(pal == '(') 
       Pilha3.Inserir(pal); 
      else if(pal == ')') 
      { 
       if(Pilha3.Vazio()) 
        return false; 
       switch(pal) 
       { 
        case ')': 
         if (Pilha3.Remover() != '(') 
          return false; 
         break; 
        default: 
         break; 
       } 
      } 
     } 
     if(Pilha3.Vazio()) 
      return true; 
     return false; 
    } 
    public static void checarErros(String input){ 
     int i=0,g=0,gg=0,erros=0; 
     String letrasz="",chval="()+-*/^"; 

     for(i=0;i<input.length();i++){ 
       char cju=input.charAt(i); 
       if(chval.indexOf(cju)==-1){ 
        letrasz+=cju+","; 
       } 
      } 
     i=0; 
     if(!letrasz.isEmpty()){ 
       letrasz=letrasz.substring(0,letrasz.length()-1); 
       System.out.println("ERRO: A expressão possui operadores inválidos: "+letrasz+"."); 
       erros++; 
      } 
     if(!checarParen(input)){ 
       while(i<input.length()){ 
        char cti=input.charAt(i); 
        if(cti=='('){g++;} 
        else if(cti==')'){gg++;} 
        i++; 
       } 
       int huh=0; 
       if(g>gg){ 
        huh=g-gg; 
        if(huh>1){System.out.println("ERRO: Há "+huh+" parênteses '(' sem a presença de parênteses ')' sucessores."); 
        }else{System.out.println("ERRO: Há um parênteses '(' sem a presença de um parênteses ')' sucessor.");} 
       }else{ 
        huh=gg-g; 
        if(huh>1){System.out.println("ERRO: Há "+huh+" parênteses ')' sem a presença de parênteses '(' antecessores."); 
        }else{System.out.println("ERRO: Há um parênteses ')' sem a presença de um parênteses '(' antecessor.");} 

       } 
       erros++; 
      } 
     if(erros>0){ 
      System.exit(0); 
     } 
    } 
    public static void main(String[] args) throws IOException { 
     Scanner scan=new Scanner(System.in); 
     boolean ler=true; 
     String input="",output,resultado=""; 
     if(!ler){ 
      /* 
      input="1+2*3^2/3-4*(2-1)+9"; 
      1+2*3^2/3-4*(2-1)+9 
      */ 
      input="1+2*3^2/3-4*(2-1)+9"; 
     }else{ 
      System.out.println("Digite a expressão a ser avaliada: "); 
      input=scan.nextLine(); 
     } 
     checarErros(input); 
     Avaliador Transformacao = new Avaliador(input); 
     output = Transformacao.Transformar(); 
     for (int j = 0; j < output.length(); j++) { 
      char tu = output.charAt(j); 
      resultado+=tu+" "; 
     } 
     System.out.println("Expressão Infixa: "+input+'\n'+"Expressão Posfixa: "+output+'\n'+"Resultado: "+Transformacao.CalculoExpressao(resultado)); 
    } 
} 

スタッククラス:

public class Pilha { 
    private int tammax,tammax2; 
    boolean het=false; 
    private char[] VetorP; 
    private int[] VetorI; 
    private int top; 
    private int top2; 
    public Pilha(int max,boolean hetz) { 
    if(!hetz){ 
     tammax = max; 
      VetorP = new char[tammax]; 
      top = -1; 
    }else{ 
     tammax2 = max; 
      VetorI = new int[tammax2]; 
      top2 = -1; 
    } 
    } 
    public char Checar() { 
     return VetorP[top]; 
    } 
    public char Remover() { 
     return VetorP[top--]; 
    } 
    public void Inserir(char j) { 
     VetorP[++top] = j; 
    } 
    public void Inserir(int i){ 
     VetorI[++top2]=i; 
    } 
    public int Remover2(){ 
     return VetorI[top2--]; 
    } 
    public boolean Vazio() { 
     return (top == -1); 
    } 
    public void setPilha2(){ 
     top2=-1; 
    } 
    public void getTop(){ 
     System.out.println(this.top); 
    } 
} 
+2

可能なこと:これらの問題に遭遇しないようにコードを修正し、例外が発生する理由、例外が発生する理由を見て、例外が発生する箇所に入力が届かないようにします。 – luk2302

+0

あなたはそうしてはいけません...。 –

+1

try-catchブロックを使用してください。しかし、私はあなたがそれを避ける代わりに問題を解決することを提案します。 –

答えて

0

あなたのプログラムが割り当てられている領域外のデータにアクセスしようとすると、奇妙なことのすべての種類が発生する可能性がありメモリ内の配列の場合重要なシステムファイルを上書きするか、プログラムが正常に実行される可能性があります。 Javaはチェックされた言語であり、毎回配列の要素にアクセスするときにチェックが行われることを意味します。このようなエラーが検出された場合、例外がスローされ、何も起こりません(Cとは異なります)。ここにいるのは本当にバグです。あなたがするべきことは、バグを修正することです。私はあなたのコードを見て気にしませんが、プログラムは常に配列境界内にある要素にのみアクセスするようにしてください。

関連する問題