添加throws ParseException后,仍然出现解析异常,为什么?

问题描述

问题是计算两个日期之间的天数。这是我的代码

public static void main(String[] args) throws ParseException  {
    // Todo Auto-generated method stub
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd)");
    Scanner input=new Scanner(system.in);
    String date1=input.nextLine();
    String date2=input.nextLine();
    Date d1 =sdf.parse(date1);
    Date d2= sdf.parse(date2);
    if(d1.getTime()>d2.getTime()) {
        System.out.println(d2.getTime()-d1.getTime()/(24*60*60*1000));
    }
    else
        System.out.println(d1.getTime()-d2.getTime()/(24*60*60*1000));

输出

2010/05/29
2010/01/01
Exception in thread "main" java.text.ParseException: Unparseable date: "2010/05/29"
        at java.base/java.text.DateFormat.parse(DateFormat.java:396)
        at HW10_09156136_1092.HW10_Ex01.main(HW10_Ex01.java:15)

解决方法

? 您在 m [Month in year] 的地方使用了 M [Minute in hour]。

? 您的输入以 / 作为分隔符,而您在解析器中为它指定了 -。输入应与解析器指定的模式匹配。

除此之外,java.util 日期时间 API 及其格式 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

使用 java.time 的现代日期时间 API 的演示:

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Main {
    public static void main(String[] args) {
        String strDateStart = "2021-06-09";
        String strDateEnd = "2021-06-12";
        LocalDate dateStart = LocalDate.parse(strDateStart);
        LocalDate dateEnd = LocalDate.parse(strDateEnd);
        long days = ChronoUnit.DAYS.between(dateStart,dateEnd);
        System.out.println(days);
    }
}

输出:

3

ONLINE DEMO

现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter 对象。

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。

使用旧 API:

如果已经存在相同的 API,请避免自己执行计算,例如以下代码使用 Math#absTimeUnit#convert 来避免容易出错的 if-else 和计算。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) throws ParseException {
        String strDateStart = "2021-06-09";
        String strDateEnd = "2021-06-12";
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.ENGLISH);
        Date dateStart = sdf.parse(strDateStart);
        Date dateEnd = sdf.parse(strDateEnd);
        
        long millisInOneDay = TimeUnit.MILLISECONDS.convert(1,TimeUnit.DAYS);
        long days = Math.abs((dateEnd.getTime() - dateStart.getTime()) / millisInOneDay);
        
        System.out.println(days);
    }
}

ONLINE DEMO

添加 throws ParseException 后,解析异常仍然存在 发生了,为什么?

向方法添加 throws 子句会强制方法的调用者使用 try-catch 处理异常或重新抛出它。这不是防止抛出异常的方法。从 Oracle 的 this excellent tutorial 处了解更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...