gpt4 book ai didi

java - 关于断言和异常; java

转载 作者:行者123 更新时间:2023-11-30 06:36:26 25 4
gpt4 key购买 nike

在这种特定情况下,断言比异常更合适吗?

据我了解,当程序 FUBAR 到无法恢复并将退出的程度时,应该使用断言。

我还被告知要始终抛出异常以明确和处理错误消息。

何时使用它们之间是否有明确的界限?有无条件必须用assert代替exception的例子吗?

   public void subscribe(DataConsumer c) throws IllegalArgumentException {
if (c == null) {
// Almost certainly FUBAR
throw new IllegalArgumentException("Can't subscribe null as a DataConsumer. Object not initialized");
}

if (dataConsumerList == null) {
// Definetely FUBAR
throw new IllegalArgumentException("Nothing to subscribe to. DataConsumerList is null");
}

dataConsumerList.add(c);
}

最佳答案

就我个人而言,我并不热衷于对这类事情使用断言,只是因为它们可以被关闭。有些地方在运行测试时使用断言,但为了速度而在生产中禁用它们。对我来说,这就像正常参加驾驶考试,但在上高速公路时解下安全带。

当然,断言只会抛出异常。如果您绝对立即关闭 JVM,则需要使用类似 Runtime.halt 的东西。

所以我很喜欢这里的异常,尽管我通常会在给定空参数时使用 NullPointerException,并且如果 dataConsumerList 是您的 state 那么我个人会使用 IllegalStateException 来区分这种情况。 (令人遗憾的是,Java 没有 .NET 所具有的相同 ArgmentNullException,考虑到它是多么常见的检查。)

Guava有用Preconditions可以让你更简洁地写这个的类:

public void subscribe(DataConsumer c) throws IllegalArgumentException {
Preconditions.checkNotNull(c,
"Can't subscribe null as a DataConsumer. Object not initialized");
Preconditions.checkState(dataConsumerList != null,
"Nothing to subscribe to. DataConsumerList is null");
dataConsumerList.add(c);
}

关于java - 关于断言和异常; java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4863694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com