2014-10-05 3 views
0

Я пишу небольшую программу с компонентами swing для моего класса, и у меня есть проблема с хранением информации в двойном массиве. Программа работает точно так же, как я хочу, только с одним исключением: я объявляю массив через «public double [] noten;» за пределами частных методов действий пользователей. Однако массив инициируется внутри частного метода.двойной массив теряет информацию

[...] 
public double summe, notenschnitt; 
public int i, anzahlnoten, besteNote, schlechtesteNote; 
public double [] noten; 


private void jBÜbernehmen2ActionPerformed(java.awt.event.ActionEvent evt) {            

     if(!jTAnzahlNoten.getText().equals("") && Double.parseDouble(jTAnzahlNoten.getText())>=1 
      && Double.parseDouble(jTAnzahlNoten.getText())<=5){ 

      i++; //Counts clicks 

      DecimalFormat f = new DecimalFormat("#0.00"); 

      summe = summe + Double.parseDouble(jTNote.getText()); //sum for calculating the mean 

      anzahlnoten = Integer.parseInt(jTAnzahlNoten.getText()); //amount of grades 

      noten = new double[anzahlnoten]; 
      noten[i-1] = Double.parseDouble(jTNote.getText()); 


      jLANoten.setText("Noten: "); 
      jLANoten.setVisible(true); 


      for(double ae: noten){ 
       jLANoten.setText(jLANoten.getText()+" "+ae); 
      } 

      notenschnitt = summe/i; 

      jLBN.setVisible(true); 
      jLNN.setVisible(true); 
      jLSN.setVisible(true); 
      jLNA.setVisible(true); 

      jLNN.setText(f.format(notenschnitt)); 
      jLNA.setText(Integer.toString(i)); 
      jLNote.setText(i+". Note"); 

      if(Integer.parseInt(jTNote.getText()) < besteNote){ 
       //gets the best grade 
       besteNote=Integer.parseInt(jTNote.getText()); 
       jLBN.setText(Integer.toString(besteNote)); 
      } 

      if(Integer.parseInt(jTNote.getText()) > schlechtesteNote){ 
       //gets the worst grade 
       schlechtesteNote=Integer.parseInt(jTNote.getText()); 
       jLSN.setText(Integer.toString(schlechtesteNote)); 
      } 

      if (i >= Integer.parseInt(jTAnzahlNoten.getText())) { 
       //if clicks = amount of grades -> stop 

       jBÜbernehmen2.setVisible(false); 
       jBNeueBerechnung.setVisible(true); 
       jTNote.setBackground(Color.LIGHT_GRAY); 
       jTNote.setFocusable(false); 
      }else{ 
       jTNote.requestFocus(); 
       jTNote.setText(""); 
      } 

     } 


    } 
[...] 

это не весь код, только основная часть

Expectation: цикл Еогеасп должен давать оценки, которые я Введенные. Пример: нужно ввести три разряда и ввести 1,2 и 3. В конце строки следует указать: «Нот: 1.0, 2.0, 3.0»

Но вместо этого при первом нажатии он дает: «Нота: 1,0, 0,0, 0,0 ". Второй клик: «Noten: 0.0, 2.0, 0.0» Третий клик: «Noten: 0.0, 0.0, 3.0».

Он печатает только последние введенные оценки, но почему? Переменная для массива объявляется общедоступной?! Я просто не понимаю ...

ответ

2

Вы продолжаете повторно инициализировать массив перед вводом нового значения в нем:

 noten = new double[anzahlnoten]; 
     noten[i-1] = Double.parseDouble(jTNote.getText()); 

Убедитесь, что вы только звоните noten = new double[anzahlnoten]; один раз.

Например, вы можете инициализировать массив при объявлении его:

public double [] noten = new double[someFixedLength]; 
+0

Решение: не воссоздавать массив. Удалите верхнюю строку. 1+ –

+0

если я стираю вышеприведенную строку, я получаю java.lang.NullPointerException: -/ – SklogW

+0

@ user4102425 Вы не должны полностью ее удалять, вы должны перенести его в место, где он будет вызываться только один раз. – Eran

Смежные вопросы