1

我正在用 Java 编写一个约会程序,遇到一个错误,即“线程“main”java.lang.NumberFormatException 中的异常:对于输入字符串:“quit””对于以下几行:

Exception in thread "main" java.lang.NumberFormatException: For input string: "quit"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at java.lang.Integer.parseInt(Integer.java:499)
at AppointmentNew.main(AppointmentNew.java:24)

此外,当我在打印用户在程序中输入的日期范围的代码中进行选择时,它什么也没有打印出来,它只是转到“进行选择”的下一行(1:新建,2:打印范围, 3: Print All, quit): " 它应该打印出用户输入的日期范围...

这是我的代码:

import java.util.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class AppointmentNew 
{
public static void main (String[] args)
{
  ArrayList<String> list = new ArrayList<String>();
  Scanner stdin = new Scanner(System.in);
  String choice = "";
  int choiceNum = 0;
  String date = "";
  String descrip = "";
  int type = 0;
  String typeChose = "";

  System.out.println("Welcome to Appointment App!\n");
  System.out.println("\t============================");

  do
  {
     System.out.print("\n\tMake Choice (1: New, 2: Print Range, 3: Print All, 4: Quit) ");
     choice = stdin.nextLine();
     choiceNum = Integer.parseInt(choice);

     if (choiceNum == 1)
     {
        System.out.print("\n\n\tEnter New Appointment Date in mm/dd/yyyy format: ");
        date = stdin.nextLine();

        System.out.print("\n\n\tEnter New Appointment Description: ");
        descrip = stdin.nextLine();

        System.out.print("\n\n\tEnter Type (1 = Once, 2 = Daily, 3 = Monthly): ");
        type = stdin.nextInt();
        stdin.nextLine();

        if (type == 1)
        {
           Once once = new Once(date, descrip);
           typeChose = "One-Time";
        }
        else if (type == 2)
        {
           Daily daily = new Daily(date, descrip);
           typeChose = "Daily";
        }
        else
        {
           Monthly monthly = new Monthly(date, descrip);
           typeChose = "Monthly";
        }
        String stringToAdd = "";
        stringToAdd = (date + " : \"" + descrip + "\", " + typeChose);
        list.add(stringToAdd);

        System.out.println("\n\n\tNew " + typeChose + " Appointment Added for " + date + "\n");
        System.out.println("\t============================\n");


     }

     if (choiceNum == 2)
     {
        System.out.print("\n\n\tEnter START Date in mm/dd/yyyy format: ");
        SimpleDateFormat sdf = new SimpleDateFormat("mm/dd/yyyy");
        Date lowDate = sdf.parse(stdin.nextLine());
        System.out.print("\n\n\tEnter END Date in mm/dd/yyyy format: ");
        Date highDate = sdf.parse(stdin.nextLine());  

        for(int i = 0; i < list.size(); i++)
        {
           int dateSpot = list.get(i).indexOf(" ");
           String currentDate = list.get(i);
           currentDate.substring(0, dateSpot);  

           if (currentDate.compareTo(lowDate) >= 0 && currentDate.compareTo(highDate) <= 0)
           {
              System.out.println("\n\t" + list.get(i));   
           }
        }
     }

     if (choiceNum == 3)
     {
        for(int i = 0; i < list.size(); i++)
        {
           System.out.println("\n\t" + list.get(i));     
        }
     }

  }while (choiceNum != 4);      
 }
}

提前感谢您提供的任何建议或帮助!

4

4 回答 4

2

你需要做的是改变你获得输入的方式。我不会更改代码中的逻辑,所以只需使用此方法即可。

  public static Integer getNextInteger(Scanner stdin) {
    String line = null;
    int parsed = 0;
    while ((line = stdin.nextLine()) != null) {
      try {
        parsed = Integer.parseInt(line);
        break;
      } catch (NumberFormatException e) {
        // Throw error message to user.
      }
    }
    return parsed;
  }

您还可以将整个菜单外部化为一个函数,并将返回值用于其余代码。

public int generateMenuAndGetChoice(Scanner stdin) {
  System.out.println("Make Choice ( 1: New, 2: Print Range, 3: Print All, quit): ");
  while (true) { //Keep trying until we get correct input.
    String input = stdin.nextLine().trim(); // To deal with extra spaces.
    if (input.equals("1") || input.equalsIgnoreCase("new")) {
      return 1;
    } else if (input.equals("2") || input.equalsIgnoreCase("print range")) {
      return 2;
    } else if (input.equals("3") || input.equalsIgnoreCase("quit")) {
      return 3;
    } else {
      //Throw error to user possibly reshow menu options as well after error.
    }
  }
}

您正在将一个巨大的字符串添加到列表中,然后尝试从中获取日期。此外,您正在与“日期”进行字符串比较,而不是日期比较。这可能就是您没有输出的原因。

替换任何你得到日期的地方,如下所示:

System.out.print("\n\n\tEnter START Date in mm/dd/yyyy format: ");
String lowDate = stdin.nextLine();

有了这个:

System.out.print("\n\n\tEnter START Date in mm/dd/yyyy format: ");
SimpleDateFormat sdf = new SimpleDateFormat("mm/dd/yyyy");
Date lowDate = sdf.parse(stdin.nextLine());

然后使用Dates.compareTo()比较日期。

注意:您的整个程序依赖于用户的正确输入。绝对不会是这种情况。使用 try-catch 和 Scanners hasNextInt() 等方法来确保您始终从用户那里获得正确的输入。

于 2013-04-19T05:16:11.377 回答
1

这是我的想法,你应该修改这里提到的代码:

System.out.print("\n\tMake Choice ( 1: New, 2: Print Range, 3: Print All, **4: quit**): ");
choice = stdin.nextLine();
choiceNum = Integer.parseInt(choice);

现在检查 while 循环条件:

while (choiceNum != 4);

这是解决您的问题的方法之一。当您尝试将字符串转换为数字类型时发生 java.lang.NumberFormatException,但字符串格式不正确。

Java API

更新:如果用户以适当的格式提供输入,上述解决方案将正常工作。如果用户提供了任何其他格式不正确的字符串,它将抛出 NumberFormatException。要使代码无错误,您可以执行以下操作:

try{
    choiceNum = Integer.parseInt(choice);
   }catch(NumberFormatException e){
        System.out.println("Please provide correct input");
   }

然后您将能够避免 NumberFormatException。

于 2013-04-19T05:18:36.793 回答
0
choiceNum = Integer.parseInt(choice);

在这里,您将 quit 作为输入字符串传递。所以它在这条线上抛出数字格式。

于 2013-04-19T05:00:23.983 回答
0

对于输入字符串:“退出”

choiceNum = Integer.parseInt(choice);

会给

java.lang.NumberFormatException

因为choice(="quit") 不是整数

于 2013-04-19T05:00:54.917 回答