1

Java で予約プログラムを作成していますが、「スレッド "main" で例外 java.lang.NumberFormatException: For input string : "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)

また、ユーザーがプログラムに入力した日付の範囲を印刷するコードで選択を行うと、何も印刷されず、「Make Choice ( 1: New, 2: Print Range , 3: すべて印刷して終了): "ユーザーが入力した日付の範囲を印刷する必要があります...

これが私が持っているコードです:

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 とスキャナーの 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);

これは、問題を解決する方法の 1 つです。文字列を数値型に変換しようとしたときに、文字列の形式が適切でない場合、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 に答える