NumberFormatException для входной строки Java

Я пишу программу назначения на Java и сталкиваюсь с ошибкой, которая

Исключение в потоке "main" java.lang.NumberFormatException: для входной строки: ""

для следующих строк:

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:470)
at java.lang.Integer.parseInt(Integer.java:499)
at AppointmentNew.main(AppointmentNew.java:24)

Программа выполняется один раз, но как только она доходит до конца своего первого запуска, она выдает мне эти ошибки... Например, когда я запускаю программу следующим образом: я делаю выбор «1», чтобы назначить новую встречу Затем я ввожу дату моей новой встречи «мм/дд/гггг», затем добавляю описание встречи и, наконец, ввожу тип «Один раз, Ежедневно или Ежемесячно». После этого он должен начать сначала с самой первой строки «Выбрать (1: Создать, 2: Напечатать диапазон, 3: Напечатать все, выйти):» Но вместо этого он выдает мне ошибки Я описал выше...

Вот мой код, который у меня есть.

import java.util.*;

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============================\n");

  do
  {
     System.out.print("\tMake Choice ( 1: New, 2: Print Range, 3: Print All, 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();
        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 = ("\n\n\tNew " + typeChose + " Appointment Added for " + date + "\n");
          list.add(stringToAdd);

        System.out.println(stringToAdd);
        System.out.println("\t============================\n");

     }

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

     for(int i = 0; i < list.size(); i++)
        {
         int dateSpot = list.get(i).indexOf(" ");
         if (list.get(i).compareTo(lowDate) <= 0 && list.get(i).compareTo(highDate) >= 0)
        {
           System.out.println(list.get(i));   
       }}
     }

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

  }while (choice != "quit");      
}
}

Любая помощь будет здорово!


person user2213611    schedule 19.04.2013    source источник
comment
Когда вы вводите пустое значение, Integer.parseInt не может быть преобразовано в число. Отсюда исключение. Используйте эту проверку if(choice.equalls()){//do not parse}   -  person codeMan    schedule 19.04.2013


Ответы (2)


Вам нужно добавить еще один вызов nextLine() после этого оператора здесь:

type = stdin.nextInt();
// ED: stdin.nextLine();

Это связано с тем, что когда вы берете int из сканера, он не использует символ '\n', который помещается во входной поток, когда пользователь нажимает ввод.

Таким образом, когда stdin.nextLine() вызывается снова, возвращается String "" (все, что еще не обработано до следующего символа '\n'), и Integer.parseInt не знает, как с этим справиться, поэтому вы получаете ошибка.

person torquestomp    schedule 19.04.2013
comment
единственная другая проблема, которую он мне дает, - это когда я выбираю выход для первого выбора в программе, он дает мне ту же ошибку, что была описана выше .... Есть предложения? - person user2213611; 19.04.2013
comment
Что ж, Integer.parseInt(quit) не будет работать очень хорошо, не так ли? Вам нужно будет добавить код, чтобы исправить это: p - person torquestomp; 19.04.2013
comment
Хаха смешно! Я так понял: / Любые предложения по тому, как заставить его работать ?? - person user2213611; 19.04.2013

Окружите код оператором if, чтобы проверить, не закрывается ли значение, прежде чем пытаться его проанализировать.

person jason316    schedule 25.05.2017