【问题标题】:Program crashes when I assign a scanner object to a variable当我将扫描仪对象分配给变量时程序崩溃
【发布时间】:2018-10-12 21:18:56
【问题描述】:

我正在尝试创建一个程序来读取month/day/year 形式的日期输入。不幸的是,我目前停留在声明int year = dateScan.nextInt();。当我运行我的程序时,它在那条线上崩溃。但是,如果我删除整个语句并将 System.out.println("year: " + year); 更改为 System.out.println("year: " + dateScan()); ,程序不会崩溃。我担心的是我需要变量 year 来打印整个日期,所以最后的打印语句 System.out.println("\nThe date is: " + monthName + " " + day + "," + year); 将起作用。我需要知道为什么它在那条线上崩溃。谢谢!

公共类 DateFormat {

public static void main(String[] args) {
    Scanner keyboard = new Scanner (System.in); // define a Scanner object attached to the keyboard
    System.out.print("Enter a date in the form month/day/year: "); // prompt user for input
    String inputString = keyboard.nextLine(); // read entire input line as a String

    Scanner dateScan = new Scanner (inputString); // define a Scanner object attached to a String

    // set the Scanner's delimiter to "zero or more spaces followed by a slash (/) followed by zero or more spaces"
    dateScan.useDelimiter("\\s*/\\s*"); 

    int month = dateScan.nextInt();
    if ( ! dateScan.hasNextInt()) // is the first input value an int?
    {
        String badInput = dateScan.next();
        System.out.println("Error: expected an integer, encountered: " + badInput);
        System.out.print("Try again later...");
        System.exit(1);
    }
    System.out.println("month: " + month); // safe to read first input value

    int day = dateScan.nextInt();
    if ( ! dateScan.hasNextInt()) // is the next input value an int?
    {
        String badInput = dateScan.next();
        System.out.println("Error: expected an integer, encountered: " + badInput);
        System.out.print("Try again later...");
        System.exit(1);
    }
    System.out.println("day: " + day); // safe to read next input value

    int year = dateScan.nextInt();
    if ( ! dateScan.hasNextInt()) // is the next input value an int?
    {
        String badInput = dateScan.next();
        System.out.println("Error: expected an integer, encountered: " + badInput);
        System.out.print("Try again later...");
        System.exit(1);
    }
    System.out.println("year: " + year); // safe to read next input value

    // the user entered an integer
    String monthName = "Unknown month name";
    switch(month)
{
        case 1: monthName = "January"; break;
        case 2: monthName = "February"; break;
        case 3: monthName = "March"; break;
        case 4: monthName = "April"; break;
        case 5: monthName = "May"; break;
        case 6: monthName = "June"; break;
        case 7: monthName = "July"; break;
        case 8: monthName = "August"; break;
        case 9: monthName = "September"; break;
        case 10: monthName = "October"; break;
        case 11: monthName = "November"; break;
        case 12: monthName = "December"; break;                           
}
    if (month < 1 || month > 12)
        System.out.println("Error: " + month + " is an invalid month value");
    else
        System.out.println("\nThe date is: " + monthName + " " + day + "," + year);      
}   

}

【问题讨论】:

  • 您需要在调用nextInt 之前检查hasNextInt 才能真正获得该int。
  • dateScan 是一个引用,不能像方法dateScan()那样访问它

标签: java variables if-statement switch-statement java.util.scanner


【解决方案1】:

变化:

    int year = dateScan.nextInt();
    if ( !dateScan.hasNextInt()) // is the next input value an int?

    int year = dateScan.nextInt();
    if ( dateScan.hasNextInt()) // is the next input value an int?

由于您正在检查此错误:dateScan.hasNextInt() 并且由于 dateScan 没有您正在执行的下一个元素

String badInput = dateScan.next()

导致异常的原因:

Exception in thread "main" java.util.NoSuchElementException

【讨论】:

  • 没想到会马上得到答复。我改变了它并且它起作用了。谢谢!但是您能否详细说明“因为 dateScan 没有下一个元素”?我对 java 和编程还是很陌生,所以术语确实让我感到困惑。另一个问题 - if ( !dateScan.hasNextInt()) 怎么能很好地处理月份和日期变量,而不是年份变量?
  • 您正在使用 dateScan 迭代日期字段。由于 year 是最后一个字段,因此您使用 int year = dateScan.nextInt() 将其取出,因此 if ( !dateScan.hasNextInt()) 返回 true,但迭代器中没有更多字段,因此 String badInput = dateScan 。下一个();导致异常。
  • 您帮了我很大的忙,但我还有更多问题。希望你不要介意。我刚刚注意到,在我将 dateScan.nextInt() 分配给月、日和年之后,if 语句之后的语句块停止工作。它只是崩溃而不是打印 badInput。如果我将其恢复为原始状态(删除月、日、年变量并仅打印 dateScan.nextInt(),则语句块可以工作并打印 badInput(int 以外的数据类型)。我的问题是它为什么会崩溃以及如何崩溃我应该将这些值分配给这 3 个变量并能够像日期一样将它们打印在一起?
  • 基本上,if 语句的目的是检测不是整数的用户输入并打印出来,这样程序就不会崩溃。但是现在,如果我输入一个非整数输入,它就会崩溃。
  • 嘿,我现在修好了,别担心。我没有删除月日年变量,而是将它们放在每个相应的 badInput 语句块之后。我还将当年的条件改回 !dateScan.hasNextInt();
猜你喜欢
  • 2016-05-30
  • 2015-07-18
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
相关资源
最近更新 更多