Tag: runtimeexception

当Java 8 Stream抛出RuntimeException时,预期的行为是什么?

在流处理期间遇到RuntimeException时,流处理是否应该中止? 应该先完成吗? 是否应该在Stream.close()上Stream.close()抛出exception? exception是否被重新抛出或被包裹? Stream的JavaDoc和java.util.stream包没什么好说的。 我发现的所有关于Stackoverflow的问题似乎都集中在如何从function界面中包装已检查的exception以便编译它们的代码。 事实上,互联网上的博文和类似文章都集中在同一个警告上。 这不是我关心的问题。 我根据自己的经验知道,一旦抛出RuntimeException , 顺序流的处理就会中止,并且这个exception会按原样重新抛出。 仅当客户端线程抛出exception时,对于并行流才是相同的。 但是, 此处的示例代码演示了如果在并行流处理期间由“工作线程”(=与调用终端操作的线程不同的线程)抛出exception,则此exception将永远丢失并且流处理完成。 示例代码将首先并行运行IntStream 。 然后是“正常” Stream并行。 这个例子将表明, 1)如果遇到RuntimeException, IntStream在中止并行处理方面没有问题。 exception被重新抛出,包装在另一个RuntimeException中。 2) Stream不好玩。 实际上,客户端线程永远不会看到抛出RuntimeException的痕迹。 流不仅完成处理; 将处理更多元素而不是指定的limit() ! 在示例代码中,使用IntStream.range()生成IntStream 。 “普通” Stream没有“范围”的概念,而是由1:s组成,但调用Stream.limit()将流限制为10亿个元素。 这是另一个转折点。 生成IntStream的示例代码执行如下操作: IntStream.range(0, 1_000_000_000).parallel().forEach(..) 将其更改为生成的流,就像代码中的第二个示例一样: IntStream.generate(() -> 1).limit(1_000_000_000).parallel().forEach(..) 此IntStream的结果是相同的:exception被包装并重新抛出,处理中止。 但是,第二个流现在也将包装并重新抛出exception,而不是处理超出限制的元素! 因此:更改第一个流的生成方式会对第二个流的行为产生副作用。 对我来说,这很奇怪。 ForkJoinPool.invoke()和ForkJoinTask JavaDoc表示exception被重新抛出,这是我对并行流的期望。 背景 当处理从Collection.stream().parallel()获取的并行流中的元素时,我遇到了这个“问题”(我没有validationCollection.parallelStream()的行为,但它应该是相同的)。 发生的事情是“工作线程”崩溃然后静静地离开,而所有其他线程成功完成了流。 我的应用程序使用默认的exception处理程序将exception写入日志文件。 但是甚至没有创建这个日志文件。 线程和他的例外根本就消失了。 由于我需要在捕获运行时exception时立即中止,因此一种替代方法是编写将此exception泄漏给其他工作程序的代码,使其在任何其他线程抛出exception时不愿意继续。 当然,这并不能保证流实现只是继续生成尝试完成流的新线程。 所以我可能最终不会使用并行流,而是使用线程池/执行器进行“正常”并发编程。 […]

如何映射Java流中的RuntimeExceptions以从无效流元素中“恢复”

想象一下,我正在构建一个库,它将接收一个整数流,并且所有库代码需要做的是返回一个字符串流,其中包含数字的字符串表示。 public Stream convertToString(Stream input) { return input.map(n -> String.valueOf(n)); } 但是,想象某人决定使用以下代码调用我的函数: Stream input = Stream.of(1,2,3) .map(n -> { if (n %3 ) { throw new RuntimeException(“3s are not welcome here!”); } else { return n; } } Stream output = convertToString(input); 由于我希望我的API协议能够处理这种情况并且仍然返回一个字符串流,我想知道如何更改我的代码,以便它检测到流中存在exception并从exception中“恢复”通过将其映射到特殊的”NaN”值。 最后,我希望我的输出流为”1″,”2″,”NaN” 笔记: 我不希望我的API必须为输入定义一个特殊的包装器。 由于依赖性的影响,我不想依赖第三方库。 我不知道流的大小或生成的速度有多大,所以我不能使用任何类型的缓存/预加载所有值。 这可能与Java 8 Streams一起使用吗? 有了Iterator,我想我可以做到: public class SafeIntegerToStringIterator […]

为什么捕获RuntimeException不被认为是一个好的编程习惯?

为什么使用catch(Throwable exc) {} RuntimeException不被认为是一个好的编程习惯? 处理RuntimeExceptions的正确方法是什么? 另外,为什么catch(Exception exc) {}没有捕获RuntimeException ? 这个行为是如何实现的?

在Java中处理RuntimeExceptions

任何人都可以解释如何处理Java中的运行时exception?

正确使用RuntimeException?

可能重复: 在Java中,何时应该创建一个已检查的exception,何时应该是运行时exception? 我应该何时从RuntimeException而不是Exception派生Exception ? RuntimeException不必在方法的throws子句中声明,这可能很好,因为它不必特别列出或坏,因为显式声明方法的exception是一种好习惯。 思考?

为什么运行时exception是未经检查的exception?

通常,如果任何类扩展了Exception ,它将成为检查exception。 Runtime exception还扩展了Exception。 那么如何unchecked exception呢? 对于这种特殊情况,他们是否有自定义检入编译器 ? 编辑:我对已检查的v / s未经检查的exception及其优缺点等有正确的想法。除了答案之间的差异,我没有。

如何包装已检查的exception但在Java中保留原始运行时exception

我有一些代码可能会抛出已检查和运行时exception。 我想捕获已检查的exception并将其包装为运行时exception。 但是如果抛出RuntimeException,我不必包装它,因为它已经是运行时exception。 我的解决方案有点开销,并不“整洁”: try { // some code that can throw both checked and runtime exception } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } 想要更优雅的方式吗?

为什么不捕获Exception catch RuntimeException?

这对我来说很奇怪。 RuntimeExceptioninheritance自Exception ,它inheritance自Throwable 。 catch(Exception exc) { /* won’t catch RuntimeException */ 但 catch(Throwable exc) { /* will catch RuntimeException */ 我知道RuntimeException是特殊的,因为它是未经检查的。 但据我所知,这仅适用于是否必须宣布例外,而不是它们是否被捕获。 即便如此,我也不知道为什么这个逻辑会在捕获Throwable时破坏。 这与我非常相关,因为我有一种情况,可以在终端操作中抛出RuntimeExceptions。 我不确定这个模式的名称,但是类似于我的类EmailRoller采用了一系列Callbacks 。 代码如下所示: for(Callback cb : callbacks) { try { cb.call(item); } catch(Exception exc) { logger.error(“Error in callback: “, exc); } } 所以这是一个像OOME这样的东西需要通过的情况,因为如果其中一个回调消耗所有的机器内存,那肯定会影响其他的运行。 但是NullPointerException ? 还是IndexOutOfBoundsException ? 这些会影响回调,但不会阻止其他人运行。 此外,这是一个企业设计。 不同的程序员或团队可以添加回调来处理项目,但它们应该彼此隔离。 […]

请解释Java中的RuntimeException以及它应该在何处使用

我在SO上进行了这个伟大的讨论,标题为: 针对已检查exception的情况 ,但我无法遵循应该使用RuntimeException的位置以及它与正常exception及其子类的不同之处。 谷歌搜索给了我一个复杂的答案,也就是说,它应该用于处理编程逻辑错误,并且应该在没有正常情况发生时抛出,例如在switch-case结构的默认块中。 你能否在这里详细解释一下RuntimeException。 谢谢。

运行时/已检查/未检查/错误/exception之间的差异

什么是运行时exception以及什么是选中/未选中的exception以及错误/exception之间的区别。为什么这么多类型? 相反,Java可能只是遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的exception情况?