如何让程序忽略ArrayIndexOutOfBonds错误?

时间:2017-05-12 14:28:33

标签: java error-handling stack

我在Java中创建了一个程序,它将中缀表达式转换为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+会出现此错误。

  

主类:

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="0123456789()+-*/^";

       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));
   }
}
  

Stack Class:

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);
    }
}

0 个答案:

没有答案