0

我正在尝试设置一个程序,将用户输入保存到文件中,然后输出用户输入的平均值。我正在使用异常处理来检测用户是否输入了字母。但是,当用户输入一个字母时,它会进入一个无限循环。我无法弄清楚这个问题。请忽略坏的java。我只是希望它在修复坏的 java 之前运行。

import java.io.File;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.InputMismatchException;
import java.util.Scanner;

public class W11dot1 {
    public static void main(String[] args) throws IOException {
        System.out.println("This program gets ten numbers from the user, then computes and displays the average.");
        int numOf = 1;
        double doMath = 0;


        double[] numArray = new double[10];

        do {
            try{
                for(int i = 0; i<10; i++){
                    Scanner input = new Scanner(System.in);
                    System.out.print("Enter Integer " + numOf + ": ");
                    double num = input.nextDouble();
                    numArray[i] = num;
                    numOf+=1;
                }

            }catch (InputMismatchException e){
                System.out.println("Error: input must be an integer");
            }
        }while (numOf != 11);

        File file = new File("Average.txt");

        try {
            PrintWriter output = new PrintWriter(file);
            for(int y = 0; y<numArray.length; y++){
                output.println(numArray[y]);
            }
            output.close();
        } catch (IOException ex){
            System.out.println("Error: with file");
        }

        Scanner input = new Scanner(file);

        while (input.hasNext()){
            double moreNums = input.nextDouble();
            doMath += moreNums;

        }
        input.close();
        double average = doMath/10;
        System.out.printf("The average of the input values is %.2f", average);
        System.out.println("\nGoodbye...");
    }
}
4

2 回答 2

1

首先,您在输入时不需要嵌套循环,每次输入字符时嵌套循环都会导致问题。

每次你输入一个字符并且扫描器抛出一个异常并且内部的 for 循环再次重新启动。您可以通过简单地删除内部 for 循环(不是真正需要)来解决此问题,并且修改numOf变量将帮助您实现这一点,您可以执行以下操作 -

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.InputMismatchException;
import java.util.Scanner;

public class W11dot1 {
    public static void main(String[] args) throws IOException {
        System.out.println("This program gets ten numbers from the user, then computes and displays the average.");
        double doMath = 0;
        double[] numArray = new double[10];
        int numOf = 0;
        Scanner input = new Scanner(System.in);
        do {
            try {
                    System.out.printf("Enter Integer %d: ", (numOf+1));
                    double num = input.nextDouble();
                    numArray[numOf++] = num;
            } catch (InputMismatchException e) {
                System.out.println("Error: input must be an integer");
            }
        } while (numOf < 10);
        input.close();

        File file = new File("Average.txt");
        try {
            PrintWriter output = new PrintWriter(file);
            for (int y = 0; y < numArray.length; y++) {
                output.println(numArray[y]);
            }
            output.close();
        } catch (IOException ex) {
            System.out.println("Error: with file");
        }

        input = new Scanner(file);
        while (input.hasNext()) {
            double moreNums = input.nextDouble();
            doMath += moreNums;

        }
        input.close();
        double average = doMath / 10;
        System.out.printf("The average of the input values is %.2f", average);
        System.out.println("\nGoodbye...");
    }
}

此外,可以对程序进行许多优化和清理,但正如您所说,您将解决这些问题。

希望这可以帮助!

于 2020-07-04T05:00:39.300 回答
0

你不应该在你的循环中声明你的 Scanner 。就目前而言,您正在初始化 10 个不同的扫描仪,而不是关闭任何一个。它应该在你的循环之外声明。

你的 for 嵌套在你的 do...while 中也很有趣。我不认为内部 for 循环是必要的,因为您的 do...while 应该已经处理了正确的边界。如果你真的摆脱它,你会用 numArray[numOf] 替换 numArray[i] (并从 0 开始 numOf)。

于 2020-07-03T23:37:46.247 回答