Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有Try-Catch块的多种组合-Java_Java_Performance_Parsing_Try Catch - Fatal编程技术网

具有Try-Catch块的多种组合-Java

具有Try-Catch块的多种组合-Java,java,performance,parsing,try-catch,Java,Performance,Parsing,Try Catch,我所做的是获取字符串时间戳,并使用SimpleDateFormat类解析它们,以便在日历中使用。但是,这些时间戳可能有多种格式,例如,本例时间(上午10:30 vs上午10:00) 我正在创建的日历上有开始时间和结束时间,因此,如果开始时间没有按照我们典型的hh:mmaa格式设置,我不仅要处理异常,而且还要担心两者的结合。这是可行的办法,但我觉得完全没有效率 // Combination #1 ---------------------------------------------------

我所做的是获取字符串时间戳,并使用
SimpleDateFormat
类解析它们,以便在日历中使用。但是,这些时间戳可能有多种格式,例如,本例时间(上午10:30 vs上午10:00)

我正在创建的日历上有开始时间和结束时间,因此,如果开始时间没有按照我们典型的
hh:mmaa
格式设置,我不仅要处理异常,而且还要担心两者的结合。这是可行的办法,但我觉得完全没有效率

// Combination #1 -----------------------------------------------------
DateFormat format = new SimpleDateFormat("EEE MMM dd, yyyy hh:mmaa zzz");
DateFormat endTimeFormat = new SimpleDateFormat("EEE MMM dd, yyyy hh:mmaa  zzz");
Calendar date = Calendar.getInstance();
Calendar endTime = Calendar.getInstance();
try {
    date.setTime(format.parse(rawStartDate));
    endTime.setTime(endTimeFormat.parse(rawEndDate)));
} catch (ParseException e) {
    try {
        // Combination #2 ----------------------------------------
        format = new SimpleDateFormat("EEE MMM dd, yyyy hhaa zzz");
        endTimeFormat = new SimpleDateFormat("EEE MMM dd, yyyy hhaa  zzz");
        date.setTime(format.parse(rawStartDate));
        endTime.setTime(endTimeFormat.parse(rawEndDate)));
    } catch (ParseException ee) {
        //onto another iteration until our combination runs out THEN report the exception
        // start being hh:mmaa
        // end being hhaa -- etc etc
    }
}
当然,尽管此代码很奇怪,但可能不是正确使用
日历
;不管怎样,我想知道是否有更好的方法


显然,我只需要更改
格式
endTimeFormat
变量,但我不能忽略看似多余的
日期。设置时间
,否则我们就不知道它是否有效

我将为两个SimpleDataFormat使用一个变量。这样就可以只创建一次。注意:如果将其设置为字段,则如果在多线程中使用,则需要将其锁定,或者可以使用添加到Java8中的JSR-310库,该库不需要锁定


您可以查找
格式,而不是反复试验,例如
格式。包含(“:”
,它将确定它必须匹配的格式。这将允许您有一个常见的try-catch块。

这绝对是一个周日,我在xD,谢谢。尽管如此,在我结束这篇文章之前,这种尝试和错误的解决方案是否适用于其他任何地方?@echospot尝试和错误在没有简单的规则来区分差异时效果更好。有时更容易让解析器确定格式是否适用。但是,有时您必须告诉它,例如,
01/02/03
可能是2003年2月1日或1903年2月1日或
2001年2月3日
2003年1月2日
Trail and error不会告诉您,因为其中的wny将解析为ok。这些日期时间戳的格式相同,但显示时间的方式不同。因此,乍一看,尝试和错误似乎是最容易的。谢谢两个日期的格式是否相同?例如,如果rawStartDate是格式A,而rawEndDate是格式B,那么endTime将永远不会被设置。而且,这并不是final的真正目的。我建议将其分为两种格式,formatA和formatB。在其自己的try/catch块中执行每个日期。这样你就知道它会被设置好。@matt第一种格式有分钟,第二种格式没有。@matt ty代表最后的提醒。把密码也交给一位同事,第一眼就说了同样的话。