【问题标题】:Java Integer.parseInt() breaks programJava Integer.parseInt() 中断程序
【发布时间】:2018-04-22 13:45:36
【问题描述】:

我在我的 Java 类中有一个问题要做,它要求我编写一个程序,从用户那里获取 n 个数字并输出它们的平均值。我知道我可以做一个更简单的方法,只需要求用户输入他在开始时需要输入的值的数量,但我想创建程序,这样用户就不必知道开头的值的数量。 因此,为此,我在 for 循环中创建了一个长度为 100 的数组(希望涵盖用户需要输入的数量)(在循环后将该 100 长度的数组呈现为空,因此程序不会变得太占用内存)和在每次迭代中运行一个计数器。一旦用户输入 stop ,循环结束,输入到 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 如果我在该行之后直接输入打印功能,则该位置不会打印到屏幕上。我相信那部分没有语法或逻辑错误,我的讲师也是如此,但是代码仍然没有执行并且程序在之后无限循环。该行中的某些东西破坏了 temp 或 uInput ,我们无法弄清楚是什么。我已经通过与我最初使用的编译器不同的编译器编译并运行了代码,甚至在命令提示符中尝试了相同的结果(因此它不是导致问题的 IDE)。

我们可能错过的任何见解将不胜感激。谢谢。

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

【问题讨论】:

  • "不管我做什么" 好吧,你做什么做什么?你给它的输入是什么?
  • 提示:在编写接受用户输入并在稍后快速结束的程序时... 绝对无需担心内存问题。尤其是当您的优化策略基于一厢情愿(并且与现实无关)时。
  • 只是数字。通常是 1、2、3、4 和停止,因为我知道答案应该是什么。 (2.5)
  • 您只将inStop 设置为trueinStop == false 永远不会是真的。
  • 一旦inStop == falseuInput 将不再变化,并且始终等于“停止”,因此Integer.valueOf(uInput) 将始终抛出NumberFormatException

标签: java arrays string parseint


【解决方案1】:

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

您将通知使用的逻辑与读取输入和计算的逻辑混合在一起。

如果您的主要方法只处理通知用户,并依赖于另一种方法来计算平均值,而另一种方法来读取用户的输入,那么一切都会更容易阅读,请遵循并看到您将“停止”解析为诠释。

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;
}

希望您会发现这更易于阅读和使用,我留了一些空白供您填补。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多