繁体   English   中英

Java跳过尝试捕获以抛出功能

[英]Java skip try catch for throwable fuction

我想知道Java中是否有一种方法可以“跳过”我认为不会抛出异常的可抛出函数的try-catch方法。

我有这段代码:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = format.parse(dateString); // <-- Compiler error here
Log.i(PF.TAG, date.toString());

我收到编译器错误,提示未处理异常

错误:(97,30)错误:未报告的异常ParseException; 必须被抓住或宣布被抛出

我可以通过将format.parse()放在try-catch中来摆脱此错误。

在Swift 2错误处理中,有一个选项可以try! someFunction() try! someFunction()将编译并执行throwable函数,如果发生错误则崩溃。

Java中是否有类似的方法,所以我不必将所有我知道不会在任何地方的try-catch中引发异常的小任务放到哪里?

并非如此,但是您可以编写一个辅助方法来欺骗编译器,使他们认为未检查的异常是未检查的。 例如:

public static <T> T uncheck(Callable<T> callable) {
  try {
    return callable.call();
  } catch (Throwable t) {
    return rethrow(t);
  }
}

@SuppressWarnings("unchecked")
private static <E extends Throwable, T> T rethrow(Throwable t) throws E {
  throw (E) t;
}

您将像这样使用它:

Date date = uncheck(() -> format.parse(dateString));

您还可以将已检查的异常包装为未检查的异常,就像jOOL在这里所做的一样。

并不是的。

在Java中,通常有两种异常类型-选中(扩展Exception)或未选中(扩展RuntimeException)。

以某种方式处理已检查的异常是强制性的,不这样做就可能导致编译时异常,例如您的情况。 有两种处理方法:

  • 尝试-抓块。 如果需要,可以通过提供一个空的catch子句和一个有用的注释来忽略,并指定为什么永远不要发生这种情况。
    • throws声明。 它是方法声明的一部分,并将处理异常的责任转移给已声明方法的客户端。

如果要模拟您提到的Swift构造,则需要这样的内容:

try {
    someFunction()
} catch (Exception e) {
    throw new <some runtime exception>
}

这样,您可以“吞下”已检查的异常,停止其传播,而是抛出一个非已检查的运行时异常,该异常不会强制调用者对其进行处理,并且如果发生原始异常,则会导致崩溃。

您无法避免在某些时候处理该异常,因为它已被检查,但是如果将调用重构为一个单独的方法来处理该异常, 可以避免大量try-catch构造的需要:

public class DateUtils {

    private DateUtils() { throw new AssertionError(); }

    public static Date parse(String toParse, DateFormat format) {
        try {
            return format.parse(toParse);
        catch (ParseException e) {
            // Exception handling code here. Maybe you want to log the error
            // somewhere? Then either re-throw as a RuntimeException or return some
            // default value.
        }
    }
}

然后,您将执行以下操作:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = DateUtils.parse(dateString, format);
Log.i(PF.TAG, date.toString());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM