为什么不能在方法级别抛出Java流中的检查异常?

DraegerMTN:

我一直在学习并发性和流,API并发现了这一点。offerLast()方法可以抛出InterruptedException,所以我必须处理它。我不明白的是为什么我不能通过添加throws Exception将其扔到方法级别因为这是code不能编译的。

static BlockingDeque<Integer> queue = new LinkedBlockingDeque<>();

public static void testing() throws Exception {
    IntStream.iterate(1, i -> i+1).limit(5)
            .parallel()
            .forEach(s -> queue.offerLast(s, 10000, TimeUnit.MILLISECONDS));
}

我知道可以通过将其包围在try/catch或通过创建wrapper method处理的来解决error,但我仍在尝试理解为什么不能在方法级别将其抛出。

清扫器:

因为lambda表达式并不总是立即求值。

让我们来看看这个:

public Supplier<String> giveMeASupplier() throws Exception {
    return () -> someMethodThatThrowsCheckedException()
}

根据您的说法,上述方法将起作用。对?

现在,用另一种方法,我可以这样做:

Suppler<String> supplier = null;
try {
    supplier = giveMeASupplier() // no exception is thrown here.
} catch (Exception ex) {
    ex.printStackTrace();
}
if (supplier != null) {
    System.out.println(supplier.get()); // this might throw an exception! Yet it's not in a try...catch!
}

现在,如果supplier.get()引发异常,您认为会发生什么?有什么要抓住的吗?否。如果以某种方式在catch运行几行之前将阻塞,那么它将真的很奇怪。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不能在Java 8流中抛出异常?

Java:为什么我不能在Comparator中抛出异常?

为什么我不能在方法中引发异常(Java)

为什么move方法不能在Java中工作?

为什么我不能在Java中抛出或捕获泛型类的实例?

为什么我不能在applet的处理方法中引发异常?

为什么我不能在Java 8 lambda表达式中引发异常?

为什么不能在节点REPL中打开严格检查?

Java 8:如何使用流中的异常抛出方法?

为什么抛出向上检查的异常

为什么我们不能在Java的普通方法中调用this()方法?

为什么我不能在类转换异常后检查实例类型?

为什么不能在主方法中创建方法?

为什么不能在Java中其他类的方法中创建类对象?

为什么不能在Java接口中定义静态方法?

为什么我不能在Java中“静态导入”“等于”方法?

为什么我不能在Java中的任何方法之外实例化?

为什么不能在Java中调用添加到匿名类的方法?

为什么不能在Java中的空指针上调用方法?

为什么我不能在ColdFusion 8中调用java-apns getInactiveDevices()方法?

为什么我不能在 java 中调用 nextLine() 方法两次?

Java流:根据流中的值从流中抛出异常

为什么我不能在异步方法中调试代码?

为什么不能在WindowAdapter中实现某些方法呢?

为什么由于注释而不能在onCreate()中添加方法?

为什么我不能在界面中创建默认方法?

如何声明Scala中抛出检查异常的Java方法的替代?

为什么我不能在Java中传递这样的数组

为什么Final字段不能在Java中易变?