相关疑难解决方法(0)

什么时候断言应该留在生产代码中?

有一个讨论,在comp.lang.c超过回事++.关于缓和与否的断言,这在C++中默认情况下只在调试中存在的构建,应保持在生产代码或没有.

显然,每个项目都是独特的,所以在这里我的问题是没有这么多是否断言应该保持,但在这情况下,这是值得推荐的/不是一个好主意.

通过断言,我的意思是:

  • 一个运行时检查,用于测试一个条件,当该条件为false时,会显示软件中的错误.
  • 程序停止的机制(可能是在最小的清理工作之后).

我不一定在谈论C或C++.

我自己的观点是,如果你是程序员,但不拥有数据(大多数商业桌面应用程序就是这种情况),你应该保持它们,因为失败的断言显示了一个错误,你不应该去有bug,有可能破坏用户的数据.这会强制您在发货前进行强力测试,并使错误更加明显,从而更容易发现并修复.

你有什么看法/经验?

干杯,

卡尔

在此查看相关问题


回应和更新

嘿格雷厄姆,

断言是错误的,纯粹而简单,因此应该像一个一样处理.由于应该在发布模式下处理错误,因此您不需要断言.

这就是为什么我在谈论断言时更喜欢"bug"这个词.它使事情更加清晰.对我来说,"错误"这个词太模糊了.丢失的文件是错误,而不是错误,程序应该处理它.试图取消引用空指针是一个错误,程序应该承认有些东西闻起来像坏奶酪.

因此,您应该使用断言来测试指针,但是存在具有正常错误处理代码的文件.


稍微偏离主题,但讨论中的一个重点.

作为一个单挑,如果你的断言在失败时闯入调试器,为什么不呢.但是有很多原因导致文件不存在,完全不受代码控制:读/写权限,磁盘已满,USB设备已拔下等等.由于您无法控制它,我觉得断言是不是处理这个问题的正确方法.

卡尔


托马斯,

是的,我有代码完成,并且必须说我非常不同意该特定建议.

假设您的自定义内存分配器搞砸了,并将一些仍然被其他对象使用的内存归零.我碰巧将这个对象定期解除引用的指针归零,并且其中一个不变量是该指针永远不为空,并且你有几个断言以确保它保持这种状态.如果指针突然为空,你会怎么做?你只是if()围绕它,希望它有效吗?

请记住,我们在这里讨论产品代码,因此不会破坏调试器并检查本地状态.这是用户机器上的一个真正的错误.

卡尔

assert

160
推荐指数
7
解决办法
5万
查看次数

为什么要使用Objects.requireNonNull()?

为什么要使用Objects.requireNonNull()

我注意到Oracle JDK中使用了许多Java 8方法,如果给定的对象(参数)是NullPointerException内部抛出nullNullPointerException.

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

但是null如果NullPointerException对象被解除引用,则无论如何都会抛出.那么,为什么要进行额外的空检查和抛出 Objects.requireNonNull()

一个明显的答案(或好处)是它使代码更具可读性,我同意.我很想知道Objects.requireNonNull()在方法开头使用的任何其他原因 .

java nullpointerexception java-8

158
推荐指数
5
解决办法
4万
查看次数

Java断言未得到充分利用

我想知道为什么assert关键字在Java中如此少用?我几乎从未见过它们,但我认为它们是个好主意.我当然更喜欢简洁:

assert param != null : "Param cannot be null";
Run Code Online (Sandbox Code Playgroud)

对于冗长的:

if (param == null) {
    throw new IllegalArgumentException("Param cannot be null");
}
Run Code Online (Sandbox Code Playgroud)

我怀疑是因为他们未得到充分利用

  • 他们来得相对较晚(Java 1.4),到那时许多人已经建立了他们的Java编程风格/习惯
  • 它们默认在运行时关闭

java assertion

66
推荐指数
5
解决办法
2万
查看次数

在Java中使用assert是一种好习惯吗?

我知道关键字assert存在于java中.但是我不记得看到使用它的代码.可能我正在使用异常并登录我可以使用它的地方.assert在java中使用关键字是一个好习惯吗?

编辑:我知道断言一般是一个很好的做法.我的问题是,更准确一点,如果在java中,断言的BKM使用assert关键字而不是使用异常,日志记录和其他技术.

java assert

27
推荐指数
4
解决办法
1万
查看次数

.NET生产代码中的"断言"语句

在代码中保留Trace.Assert并且Debug.Assert语句是"稳定的"并且已经转移到测试和生产环境中是否明智?

如果是这样,这些断言语句如何帮助?是否足以让Guard类等检查异常情况并根据需要引发异常?

.net assert

4
推荐指数
1
解决办法
627
查看次数

标签 统计

assert ×3

java ×3

.net ×1

assertion ×1

java-8 ×1

nullpointerexception ×1