在一个 switch
语句在一些情况下,我需要将字符串形式的用户输入解析为日期对象。我正在使用 java.text.SimpleDateFormat
,而不是示例化和调用 parse
对于每种情况,我都希望将日期解析封装在某种实用方法中。重要的是,当用户输入的字符串与传递给 SimpleDateFormat
.
我在java中经常遇到的问题是将 return
陈述这就是我尝试过的:
public class MainMenu {
// a bunch of other stuff
public static Date parseStrDate(String dateStr) throws ParseException {
String pattern = "yyyy/mm/dd";
SimpleDateFormat dateParser = new SimpleDateFormat(pattern);
try {
Date date = dateParser.parse(dateStr);
}
catch (ParseException e) {
System.out.println(e);
}
return date;
}
}
通过这种方式实现,编译器抱怨 date
未定义,因为它仅在try子上下文中定义。如果我想从火车站回来 try
上下文并删除最后一个 return date;
,编译程序抱怨它期望 return
方法声明中承诺的语句。我也试过先定义 date
在下面方法的范围内 pattern
希望它只在 try
陈述不过,我也不去那里。开始觉得整个实用程序方法可能不是要走的路线。对如何实施有何意见?
3条答案
按热度按时间lhcgjxsq1#
这在很大程度上取决于您返回的类型以及
Exception
就您的方法流而言是指。例如,在以下情况下,发送结果通知失败,但仍可以返回结果:
在其他情况下,您可以返回一些关于发生了什么的信息。例如,假设您的返回类型是
Response
对象,该对象具有isError
标记,然后您可以执行以下操作:对于您发布的方法,我认为对于不可解析的
String
(在大多数上下文中没有默认的“日期”)。因此,对我来说,处理方式类似于:其他时候,只是传播
Exception
返回到任何被调用的方法都是合适的。这实际上取决于上下文,以及在特定情况下,您是否可以返回或执行一些合理的操作Exception
.正如另一个答案所提到的,您可以通过在
try
布洛克:但这不一定是最好的做法,除非你能给出合理的“违约”。uinbv5nw2#
正如beundead的回答所说,没有合理的违约,因此抛出异常是一个不错的选择。我认为最好抛出一个checked异常来强制调用方处理丢失的日期。不能返回日期这一事实是函数api的一部分,应该公开。
还有一个合理的选择,就是将返回类型更改为
Optional<Date>
.这将强制调用方处理丢失日期的情况。
最佳解决方案取决于预期的是无效日期(例如,字符串来自用户输入)还是真正的异常日期(例如,字符串来自另一个服务,只有在某个地方引入错误时才无效)。
我也会提出动议
pattern
到static final
封闭类的成员。正如内森·休斯所指出的,SimpleDateFormat
不是线程安全的,所以我们需要为每个方法调用创建一个示例。最好使用新的日期api:
还有一个基本测试:
t40tm48m3#
定义
date
外try
. 用一个无意义的日期初始化它,或者null
. 像以前一样解析。移除
throws
因为它不是throw
因为它catch
锿。