2017-04-03 2 views
0

J'ai commencé à apprendre Java récemment et j'ai un problème avec la classe StringBuilder. J'ai une instance StringBuilder et après avoir ajouté plusieurs chaînes, je veux la vider pour ajouter une nouvelle séquence.Réutilisation de StringBuilder et ArrayIndexOutOfBoundsException

J'ai essayé beaucoup de choses différentes comme l'allocation d'un nouveau StringBuilder pour cette variable, delete, setLength et tout cela, mais j'obtiens une exception ArrayIndexOutOfBoundsException.

Pourquoi ai-je reçu cette exception? Comment puis-je faire cette tâche efficacement?

Modifier: donc en détail ce que je tente de programmer l'application de caculate comme fenêtre app caculate, la chose principale est variable de processus enregistre le nombre et le fonctionnement ainsi quand il besoin d'avoir un résultat, il sera cal méthode caculate à faire cette. Cela fonctionnera exactement comme l'application de fenêtre de caculate. Cela fonctionne très bien si je continue à faire "+" opération répétée, il met à jour le résultat après le bouton d'opération de coup, mais quand frappé "=" le bouton obtient une exception ArrayIndexOutOfBoundsException à la variable de processus. Je Connaît mon code est compliqué, espère que vous les gars wil trouver la solution et j'ai essayé toute la solution que vous les gars recommandé, tout cela Ges exception

public class Cal extends javax.swing.JFrame { 

/** 
* Creates new form Cal 
*/ 



    StringBuilder process ; 
    StringBuilder textOutcome ; 

    boolean isResult; // it means that you just hit the operation button or "=" button 

    boolean isRestart;// it means after you hit "=" button if after that you continue hit the operation button that will false ,if you hit numbe button it will true 
    public double caculate() 
    { 

     String[] split = process.toString().split(" "); 
     double result = Double.valueOf(split[1]); 
     for(int i = 2 ; i < split.length;i++) 
     { 
      if(split[i].equals("+")) 
      { 
       result += Double.valueOf(split[i + 1]); 
       i += 1; 
      } 


     } 
     return result; 


    } 
public Cal() { 
    initComponents(); 
    process = new StringBuilder(); 
    textOutcome = new StringBuilder(); 

    isResult = true; 
    isRestart = false; 
    GridLayout grid = new GridLayout(4,4,10,10); 


    JButton btnAdd = new JButton("+"); 
     btnAdd.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      //To change body of generated methods, choose Tools | Templates. 
      txtOutcome.setText(String.valueOf(caculate())); 
      process.append(" "+e.getActionCommand()); 
      txtProcess.setText(process.toString()); 
      isResult = true; 
      isRestart = false; 





     } 
    }); 

    pGrid.add(btnAdd); 
    JButton btn4 = new JButton("4"); 
    btn4.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(isResult) 
       { 
        isResult = false; 
        textOutcome = new StringBuilder(); 
        textOutcome.append(e.getActionCommand()); 
        txtOutcome.setText(textOutcome.toString()); 
        if(isRestart) 
      { 
       process = new StringBuilder(); 

        isRestart = false; 
      } 
        process.append(" "+e.getActionCommand()); 



       } 
      else 
      { 

        textOutcome.append(e.getActionCommand()); 
        txtOutcome.setText(textOutcome.toString()); 

        process.append(e.getActionCommand()); 

      } 

     } 
    }); 
     pGrid.add(btn4); 
     JButton btnResult = new JButton("="); 
     btnResult.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      txtOutcome.setText(String.valueOf(caculate())); 
      process.delete(0, process.length()); 

       process.append(String.valueOf(caculate())); 
       txtProcess.setText(process.toString()); 
       isResult = true; 
       isRestart = true; 

     } 
    }); 

    pGrid.add(btnResult); 
     pGrid.setLayout(grid); 
} 

// Variables declaration - do not modify      
private javax.swing.JPanel jPanel1; 
private javax.swing.JPanel pGrid; 
private javax.swing.JTextField txtOutcome; 
private javax.swing.JTextField txtProcess; 
// End of variables declaration     

}

+2

double possible de [StringBuilder - Reset ou créer un nouveau] (http://stackoverflow.com/questions/18766780/stringbuilder-reset-or-create-a-new) – JRR

+0

Je pense que ce est une broche htly question différente b/c l'utilisateur obtient une exception par opposition à s'interroger sur les implications de performance de différentes façons d'effectuer la tâche. – WattsInABox

Répondre

0

s'il vous plaît essayer de créer un nouveau StringBuilder vide

sb = new StringBuilder(""); 
0
StringBuilder sB = new StringBuilder(); 
    sB.append("Aaa"); 
    sB.append("Bbb"); 
    sB.append("Ccc"); 
    System.out.println(sB); // prints: AaaBbbCcc 

    sB.delete(0, sB.length()); 
    sB.append("Ddd"); 
    System.out.println(sB); //prints: Ddd