java计算等级的程序

时间:2012-12-09 05:23:13

标签: java arrays exception exception-handling joptionpane

我应该编写一个程序,根据要输入的科目数计算学生的平均成绩。

这是我的代码,但它不会在subject1上输入成绩的部分执行:

import javax.swing.*;

public class Arrays {
  static  int ctr = 0;
  public static void main(String[] args) {
    String inputStr = "";
    double num2process = 0.0;
    double sum = 0.0, ave = 0.0;
    double[] grade = new double[(int) num2process];

    while (true) {
      try {
        inputStr = JOptionPane.showInputDialog(
            "Enter number of subjects to enter: ");
        num2process = Double.parseDouble(inputStr);

        while (ctr < num2process) {
          grade[ctr] = getNumber();
          sum += grade[ctr];
          ctr++; 
        }
      } catch (NumberFormatException err) {
        JOptionPane.showMessageDialog(
            null,
            "There is an error on entry",
            "Error Message", JOptionPane.WARNING_MESSAGE);
        continue;
      }
      break;    
    }

    // Accumulate the output.
    String output = "";
    int ctr2 = 0;

    output = "";

    while (ctr2 > num2process) {
      output += ("Grade on subject " + (ctr2+1)
                + " is " + grade[ctr]);
      ctr2++;
    }
    ave = sum / num2process;
    output += "\nAverage is " + ave;

    // Display the output.
    JOptionPane.showMessageDialog(
        null,
        output,
        "The result is",
        JOptionPane.INFORMATION_MESSAGE);
  }

  public static int getNumber() throws NumberFormatException {
    String inputStr = "";
    int num = 0;

    try {
      inputStr = JOptionPane.showInputDialog(
          "Enter grade on subject " + (ctr+1));
      num = Integer.parseInt(inputStr);
      return num;
    } catch (NumberFormatException errorAgain) {
      throw errorAgain;
    }
  }
}

请帮我解决错误,谢谢

1 个答案:

答案 0 :(得分:0)

您的代码正在抛出ArrayIndexOutOfBoundException,因为您正在初始化

double[] grade = new double[(int) num2process];

在获得num2process之前

,因为您已初始化double num2process=0.0 所以它正在采取

double[] grade = new double[0.0];

因此,您需要将其更改为以下内容(在grade后初始化num2process

            String inputStr = "";
            double num2process = 0.0;
            double sum = 0.0, ave = 0.0;

            double[] grade ;          //Just Make an Instance of it

            while(true)
            {
                try
                {
                    inputStr = JOptionPane.showInputDialog("Enter number of subjects to enter: ");
                    num2process = Double.parseDouble(inputStr);
                    grade = new double[(int) num2process];     //Initialize it Here
                    while(ctr<num2process)
                    {
                        grade[ctr]= getNumber();
                        sum += grade[ctr];
                        ctr++; 
                    }

                }
                catch(Exception e){
                    //Your Exception Handling
                }
            }

修改:正如您所评论的那样:

它应该显示主题1到主题3的等级。平均值很好但我怎么能只减少两位小数呢

以下是适合您的整个计划:

import java.text.DecimalFormat;

import javax.swing.*;

public class ArrayWithException 
{
        static  int ctr = 0;
        public static void main(String[] args)
        {
            String inputStr = "";
            double num2process = 0.0;
            double sum = 0.0, ave = 0.0;
            double[] grade ;

            while(true)
            {
                try
                {
                    inputStr = JOptionPane.showInputDialog("Enter number of subjects to enter: ");
                    num2process = Double.parseDouble(inputStr);
                    grade = new double[(int) num2process];
                    marks = new double[(int) num2process];
                    while(ctr<num2process)
                    {
                        grade[ctr] = getNumber();
                        sum += grade[ctr];
                        ctr++; 
                    }

                }
                catch (NumberFormatException err)
                {
                    JOptionPane.showMessageDialog(null, "There is an error on entry",
                        "Error Message", JOptionPane.WARNING_MESSAGE);
                    continue;
                }
                break;      

            }

            //accumulate the output
            String output="";
            int ctr2 = 0;

            output = "";

            while(ctr2 > num2process)
            {
                output +=("Grade on subject " +(ctr2+1) + " is "
                                + grade[ctr]);
                ctr2++;

            }

            ave = sum / num2process;
            DecimalFormat df=new DecimalFormat("##.##");   //Here it defines the pattern to follow
            ave=Double.parseDouble(df.format(ave));        //ave is formatted like df
            output +="\nAverage is " + ave;
            for(int i=0;i<grade.length;i++){ 
                output+="\nGrade for Subject "+(i+1)+" is: "+grade[i];
            }

            // display the output

            JOptionPane.showMessageDialog(null,output, "The result is",
                        JOptionPane.INFORMATION_MESSAGE);

        }

        public static int getNumber() throws NumberFormatException
        {
            String inputStr="";
            int num = 0;

            try
            {
                inputStr = JOptionPane.showInputDialog("Enter grade on subject " + (ctr+1));
                num = Integer.parseInt(inputStr);

                return num;

            }
            catch (NumberFormatException errorAgain)
            {
                throw errorAgain;
            }
        }
}