2013-12-12 3 views
2

Мое задание - создать калькулятор GUI, который вычисляет среднее стандартное отклонение и отслеживает, сколько классов вы вводите, используя массив, методы и цикл while, чтобы вы могли повторно ввести столько допускаются классы.Калькулятор среднего и стандартного отклонения с массивом

Моя проблема в том, что я думаю У меня все правильно выложено, я могу ошибаться, потому что я новичок в Java и кодировании вообще. Моя программа подтягивает мою JOptionPane, чтобы вводить оценки, но когда я вхожу в классы и пытаюсь ввести пустой оператор или ударить отмену, я получаю исключение NullPointerException, которое я пробовал использовать лодку для путей исправления.

Я не могу правильно выйти из своего цикла и отобразить свои значения в своих текстовых областях.

import javax.swing.JOptionPane; 

public class GradeCalculatorForm extends javax.swing.JFrame { 

double[] gradeArray = new double [25]; 
private double avg; 
private double stdDeviation;  
int i; 
int numElem; 
double sum; 
String input; 


public GradeCalculatorForm() { 
    initComponents(); 
} 
/** 
* 
* @param gradeArray 
* @param numElem 
* @return 
*/ 
public double getAverage(double[] gradeArray, int numElem){ //getAverage Method 
    sum = 0; 

    for(i=0;i<numElem;i++){ 
     sum=sum+gradeArray[i]; 
    } 
    return (sum/numElem); 
} 
/** 
* 
* @param gradeArray 
* @param numElem 
* @param avg 
* @return 
*/ 
public double getStdDev(double[] gradeArray, int numElem, double avg){ //getStdDev method 
    sum = 0; 

    for(i=0;i<numElem;i++){ 
    sum=sum+Math.pow((gradeArray[i]-avg), 2); 
} 
    return Math.sqrt(sum/numElem); 
} 

Мой текущий основной код события:

GradeCalculatorForm grades = new GradeCalculatorForm(); 
    //initialize while loop 
    i=0; 
    while(i<25){ 

     //try for NumberFormateException 
     try 
     { 
      //enter values into array 
    for(i=0;i<25;i++) 

     numElem = Integer.parseInt(JOptionPane.showInputDialog("Enter grade:")); 
     gradeArray[i]=numElem; 
     avg = grades.getAverage(gradeArray, numElem); 
     stdDeviation = grades.getStdDev(gradeArray, numElem, avg); 



    //over 25 values error message  
    if(i>25) 
     { 
      JOptionPane.showMessageDialog(null, "You can only input 25 values!"); 
     } 
     } 
     //catch for NumberFormatException 
     catch(NumberFormatException e) 
     { 
      JOptionPane.showMessageDialog(null, "Your input must be numeric!"); 
     }  
    } 

     Numbertxt.setText(Double.toString(numElem)); 

     Meantxt.setText(Double.toString(avg)); 

     Stdtxt.setText(Double.toString(stdDeviation)); 
}           

Опять я довольно новыми для Java, методы и массива в частности. Это может быть совершенно неправильно, но у меня был некоторый успех с отсутствием каких-либо синтаксических ошибок, в основном застревание в моих собственных циклах, ошибки исключения и неправильное отображение моих данных. Этого я знаю. Я как бы сосать это.

EDIT: Я застрял в своем цикле JOptionPane, где я не могу выйти, не закончив всю программу, поэтому я не могу ухватить любую трассировку стека от своих ошибок.

EDIT *: Я, наконец, получил свой NPE, чтобы показать, когда я ударил Cancel.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at GradeCalculatorForm.GradesbtnActionPerformed(GradeCalculatorForm.java:168) 
at GradeCalculatorForm.access$000(GradeCalculatorForm.java:9) 
at GradeCalculatorForm$1.actionPerformed(GradeCalculatorForm.java:76) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6505) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6270) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Window.dispatchEventImpl(Window.java:2719) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:694) 
at java.awt.EventQueue$3.run(EventQueue.java:692) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:708) 
at java.awt.EventQueue$4.run(EventQueue.java:706) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

Я до сих пор вопрос, где, если ударить ОК в моем JOptionPane, когда он пуст тянет мой NumberFormatException поймать сообщение. Совет?

+0

Не могли бы вы обновить свой вопрос, включив в него трассировку стека 'NullPointerException'? –

+0

Я думаю, что было бы лучше расширить JPanel, а затем поместить ваш компонент в JFrame, а не расширять JFrame. Но это не связано с проблемой, с которой вы сталкиваетесь. –

ответ

2

Выньте цикл while.

Добавить {} в ваш цикл:

for(i=0;i<25;i++) { 
    numElem = Integer.parseInt(JOptionPane.showInputDialog("Enter grade:")); 
    gradeArray[i]=numElem; 
} 
0

Вы используете numElem для класса, который вводится, а также для управления из для петель в getAverage и getStdDev. Класс gradeArray имеет 25 элементов, поэтому, если введен класс 80, эти петли попытаются выйти за пределы массива. Массив знает свою длину, и вы можете ссылаться на него как на классArray.length. Однако вы можете легко поддерживать большее количество классов, переключаясь с массива на список.

Петли и тест для ввода в класс не имеют большого смысла. Нет причин иметь цикл while вокруг цикла for, и оператор if никогда не будет выполняться, так как к моменту его достижения значение i будет равно 25. Кроме того, как указывал M21B8, ваш цикл for требует скобок вокруг него. В остальном, JOptionPane будет показан 25 раз, а затем строки для установки записи в массиве и вычисления avg и stdDeviation будут выполняться один раз с i == 25.

Однако это должно вызвать ArrayIndexOutOfBoundsException, так как gradeArray имеет только 25 элементов с индексами от 0 до 24. Должна быть отдельная проблема, вызывающая NPE.

0

Самый простой способ выйти из циклов - использовать перерыв. Все, что вы делаете, это вставить слово «break»; везде, где это необходимо, и стрелы, ваша петля останавливается.

Кроме того, я считаю, вы должны подумать о том, что ваш ввод будет строкой, чтобы вы могли проверить несуществующие и нулевые ответы.

if ((input != null) && (input.length() > 0)) { 

Наконец, поскольку эти классы убедитесь, что ни один из входов не является отрицательным или 0.

Надежда, что помогает.

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