Java Integer.parseInt()打破程序

时间:2017-11-09 14:11:36

标签: java arrays string parseint

我在我的Java类中有一个问题,它要求我编写一个程序,该程序从用户接收 n 数字并输出它们的平均值。我知道我可以用更简单的方式做到这一点,只需要求用户输入他在开头需要输入的值的数量,但我想创建程序,这样用户不一定要知道开头的值的数量。 所以为此,我在for循环中创建了一个100长度的数组(希望能够覆盖用户需要输入的数量)(在循环之后渲染100长度数组为null,因此程序不会变得太重)每次迭代都运行一个计数器。一旦用户进入停止状态,循环结束,输入100长度数组的值将传输到计数大小的数组。 这是代码:

import java.util.*;
import java.lang.*;

public class main
{
   public static void main(String args[])
   {
      Scanner input = new Scanner(System.in);
      //Question 1
      System.out.println("Enter your numbers. (Enter 'Stop' when you're done)");
      int temp = 0;
      String uInput = "";
      char stopper;
      int count = 0;
      double total = 0;
      int a = 0;
      boolean inStop = true;
      for (boolean stop = false; stop != true;)
      {
         int array [] = new int [100];
         if (inStop == true)
         {
            System.out.println("point 5");
            System.out.print("Input: ");
            uInput = input.nextLine(); //reads user input
         }
         try //empty input repeater
         {
            System.out.println("point 1");
            try   //dealing with letters in string instead of numbers
            {
               System.out.println("point 2");

               temp = Integer.parseInt(uInput); //converts string to int
               array[count] = temp;
               count++;
               System.out.println(inStop);
               if (inStop == false) //executes when stop has been reached
               {
                  System.out.println("point 3");
                  int numberArray [] = new int [count]; //fills final array
                  for (int i = 0; i < count; i++)
                  {
                     numberArray[i] = array[i];
                  }
                  for (a = 0; a < numberArray.length; a++)
                  {
                     total = total + numberArray[a];
                  }
                  total = total / a;
                  stop = true; //ends parent loop
               }
            }
            catch (NumberFormatException e) //catches letters in string and checks for stop
            {
               System.out.println("point 4");
               stopper = uInput.charAt(0);
               stopper = Character.toUpperCase(stopper);
               if (stopper == 'S')
               {
                  inStop = false;

                  System.out.println("point 6");
               }
            }
         }
         catch (StringIndexOutOfBoundsException e)
         {
         }
      }
      System.out.println("The average of the values entered is: " + total + ".");
   }
}

问题是,正如您所看到的那样,有许多编号的打印输出指示(对我而言)程序目前的位置。除了点3之外,所有运行都很正常。由于某种原因,点3不执行任何操作。不管我做什么。现在,问题在于第34行,temp = Integer.valueOf(uInput); //converts string to int 如果我在该行之后直接输入打印功能,则该位置不会打印到屏幕上。我相信该部分没有语法或逻辑错误,我的讲师也是如此,但是代码仍然没有执行,程序之后无限循环。有些东西正在破坏该行的临时或uInput,我们无法弄清楚是什么。我已经通过不同的编译器编译并运行代码到我最初使用的代码,甚至尝试在命令提示符中使用相同的结果(因此不是导致问题的IDE)。

我们可能错过的任何见解都将受到赞赏。感谢。

p.s。:不要敲我的讲师,他没有写代码,而且不易读。他可以很容易地知道问题是什么,如果不是因为我的解释中的任何错误或他对我的程序运行方式的解释。

1 个答案:

答案 0 :(得分:0)

我认为您在确定问题时遇到问题的原因是您的代码结构。

您已经混合了通知使用的逻辑,读取输入的逻辑和计算。

如果你的main方法只处理通知用户,并依赖另一种方法来计算平均值,另一种方法来读取用户的输入,一切都会更容易阅读,然后看到你正在解析“停止”作为一个INT。

public static void main(String[] args) {
    System.out.println("instructions");
    int[] all = readUserInputs();
    double ave = calculateAverage(all);
    System.out.println("message " + ave);
}

private static double calculateAverage(int[] numbers) {
    // I will leave it to you to fill this out
    return yourValue;
}

private static String readUserInputs() {
    Scanner input;// as above
    int[] values; // is an array best? What about a List?
    for (int i = 0; ; i++) {
        String line = input.nextLine();
        if ("stop".equals(line) {
            break;
        }
        //try to parse and put into array/list
    }
    return values;
}

希望您会发现这更容易阅读和使用,我留下了一些空白让您填写。