无效的简单日期格式 + InputMisMatch

我正在创建一个大数组,其中每个元素都是对象 Temperature(String dayMonthYear, String hour, double degree, double speed)


然后我取 dayMonthYear 和 hour 并尝试将其解析为一个日期,该日期与度数和速度(风速)一起存储为一个实例。


下面是制作数组的代码,86793是文件中的行数


public Temperature[] readTemperatures(String filename) {

    Temperature[] temp = new Temperature[86793];

    File f = new File(filename);

    Scanner scan;

    int i = 0;

    try {

        scan = new Scanner(f);

        while(scan.hasNextLine()) {

            String dayMonthYear = scan.next();

            String hour = scan.next();

            double degrees = scan.nextDouble();

            double speed = scan.nextDouble();

            temp[i] = new Temperature(dayMonthYear, hour, degrees, speed);

            i++;

        }

    } catch (FileNotFoundException e) {

        e.printStackTrace();

    }

    return temp;

}

下面是承包商和日期解析器


public Temperature(String dayMonthYear, String hour, double degrees, double speed) {

    Date date = createDate(dayMonthYear, hour);

    this.date = date;

    this.temperature = degrees;

    this.windspeed = speed;

}


// Method to create date

public static Date createDate(String date, String hour) {

    Date returnDate = null;

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm");

    String stringDate = date + " " + hour;

    try {

        returnDate = formatter.parse(stringDate);

    } catch (Exception e) {

        System.out.println("Invalid format: " + stringDate);

    }

    return returnDate;

}

下面是我尝试输入的数据看起来像 1-Jan-2006 0:00 41.4 2


2006 年 1 月 1 日 1:00 39.8 1.9


[我尝试将输入更改为类似


2006 年 1 月 1 日 03:00 41.5 1.7


但无济于事]


我得到的错误是


Invalid format: 01-Jan-2006 00:00

Exception in thread "main" java.util.InputMismatchException

at java.base/java.util.Scanner.throwFor(Scanner.java:939)

at java.base/java.util.Scanner.next(Scanner.java:1594)

at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)

at P10.readTemperatures(P10.java:22)

at P10.main(P10.java:61)


慕容森
浏览 143回答 2
2回答

隔江千里

这个“可能”或“可能不”与您遇到的问题直接相关,但它应该作为警告......nb 这也可能是我的系统配置方式,但让我感到意外说明MMM符的工作方式似乎发生了变化(至少在 Java 10 中)。例如,如果我做类似...Calendar cal = Calendar.getInstance();cal.set(Calendar.MONTH, Calendar.JANUARY);cal.set(Calendar.DATE, 1);cal.set(Calendar.YEAR, 2066);SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");System.out.println(sdf.format(cal.getTime()));它将打印01-Jan.-2066... 注意.在月底。这可能是一个很好的机会,摆脱本质上已弃用的 API 并采用自 Java 8(或 3/10 向后移植)以来可用的新日期/时间类因此,相反,您可以执行以下操作:String date = "01-Jan-2006";String hour = "00:00";LocalDate ld = LocalDate.parse(date, DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.UK));LocalTime lt = LocalTime.parse(hour, DateTimeFormatter.ISO_LOCAL_TIME.localizedBy(Locale.UK));LocalDateTime ldt = LocalDateTime.of(ld, lt);System.out.println(ldt);这将打印 2006-01-01T00:00请注意,有人会指出您“不需要”进行两个单独的对话,并且您“可以”连接date/hour并一步完成,您“可以”这样做,但是由于无论如何您都将值分开了,它分开对待它们才有意义

慕斯王

使用 Scanner 的 useLocale(Locale.US) 函数为扫描仪设置正确的区域设置。您可能正在使用十进制分隔符不是“.”的语言环境。但其他一些字符,如逗号。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java