这是我正在参加的java课程.该书提到了先决条件和后置条件,但没有给出任何如何编码它们的例子.它继续讨论断言,我把它断了下来,但我正在做的赋值具体说明插入前置条件并用断言测试前置条件.
任何帮助都会很棒.
我有一个db升级脚本来删除列上的非null约束.我想做一个前置条件检查,ALTER TABLE只有当它非空时才调用.
master.xml脚本是一个渐进式脚本,我不断添加脚本,每次都运行整个脚本.我的Alter Table脚本第一次运行后,我不希望它再次运行.
无法为此找到预定义的前提条件,也无法编写sqlcheck.
您是否知道Apache Commons Validate或Guava Preconditions的一些不错的替代方案,当检查对象是否为null(Spring Assert除外)时会抛出IllegalArgumentException而不是NullPointerException ?
我知道Javadocs说:
应用程序应抛出此类的实例[NullPointerException]以指示null对象的其他非法使用.
不过,我只是不喜欢它.对我来说,NPE总是意味着我只是忘了在某个地方获得null引用.我的眼睛是如此受过训练,我可以发现它以每秒几页的速度浏览日志,如果我这样做,那么我的头脑中始终会启用bug警报.因此,如果将它抛到我期望IllegalArgumentException的位置,那将是非常令人困惑的.
说我有一个豆子:
public class Person {
private String name;
private String phone;
//....
}
Run Code Online (Sandbox Code Playgroud)
和服务方法:
public void call(Person person) {
//assert person.getPhone() != null
//....
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,一个人没有电话可能没问题(我的奶奶不拥有任何电话).但是如果你想打电话给这样的人,对我而言,它会调用带有IllegalArgument的调用方法.查看层次结构 - NullPointerException甚至不是IllegalArgumentException的子类.它基本上告诉你 - 再次尝试在null引用上调用getter.
此外,已经有讨论,我完全支持这个很好的答案.所以我的问题只是 - 我是否需要像这样做丑陋的事情:
Validate.isTrue(person.getPhone() != null, "Can't call a person that hasn't got a phone");
Run Code Online (Sandbox Code Playgroud)
有我的方式,或者是否有一个库只会抛出IllegalArgumentException进行notNull检查?
java nullpointerexception apache-commons preconditions guava
使用std::shared_ptr表达共享所有权和可选性(可能为null).
我发现自己处于只想在代码中表达共享所有权的情况,而且没有选择性.当使用a shared_ptr作为函数参数时,我必须让函数检查它是否为null以保持一致/安全.
在许多情况下,传递引用而不是当然是一种选择,但我有时也希望转移所有权,因为它可以使用shared_ptr.
是否有一个类可以替换shared_ptr而没有可能为null,一些常规来处理这个问题,或者我的问题没有多大意义?
我在github上有一个通过编码进行分析的项目.分析建议对以下代码行使用"避免使用null":
def doSomethingWithPath(path:Path) = {
require(path != null, "Path should not be null") //<-to avoid
...
}
Run Code Online (Sandbox Code Playgroud)
什么是最简单的scala惯用法来修复它?
我不喜欢java assert关键字,因为它并不总是在生产代码中启用.我正在寻找一个好的"ProductionAssert"类来使用,它始终运行着名的断言.
一个候选人是番石榴的先决条件.这是不错的,但有点限制(例如,没有assertEquals(),assertNull(),assertGreaterEquals()).
一种替代方案是包括jUnit或另一个测试框架......但我不愿意仅仅为一个简单的断言类依赖整个测试框架.
如果我在Groovy中编程,我会使用PowerAssert.
Java有一个很好的"ProductionAssert"类吗?
PS - 一个选项是最终检查像Java Contracts ...但我现在正在寻找的是绝对最小,零摩擦,只是在构建过程类的类中没有任何变化的drop-it-in. ..我不确定合同符合这种描述.
通常在编写公共方法时,我会进行一些错误检查,例如
public SomeResult processSomething (int i, List<String> items) {
if( i < 0 ) {
throw new IllegalArgumentException();
}
if(items == null) {
throw new NullPointerException();
}
etc
}
Run Code Online (Sandbox Code Playgroud)
在android编程中,这是什么标准方法?我注意到当一个片段崩溃时,模拟器会转到上一个片段,所以从显示给用户的行为我觉得没问题.但是,处理异常/错误条件的最佳方法是什么?
在为具有相似参数的不同函数编写前置条件时,我想将断言或异常分组到静态方法中,而不是明确地将它们写出来.例如,而不是
GetFooForUser(User user)
{
assert(null != user);
assert(user.ID > 0); // db ids always start at 1
assert(something else that defines a valid user);
...
// do some foo work
}
GetBarForUser(User user)
{
assert(null != user);
assert(user.ID > 0); // db ids always start at 1
assert(something else that defines a valid user);
...
// do some bar work
}
Run Code Online (Sandbox Code Playgroud)
我更愿意写
GetFooForUser(User user)
{
CheckUserIsValid(user);
// do some foo work
}
GetBarForUser(User user)
{
CheckUserIsValid(user);
// do some bar …Run Code Online (Sandbox Code Playgroud) 我正在学习如何编程,但我无法理解的一件事是 preconditions 和postconditions。
调用函数之前的 if 语句是否被视为前提条件,或者在大多数语言中是否有单独的更有效的方法?
我也在努力寻找任何我可以用我目前的编程知识理解的先决条件的例子,如果有人能证明一个简单的例子,那么我真的很感激(任何语言都可以)
programming-languages design-by-contract preconditions post-conditions
我有一个 db upgrade 脚本来更改几列上的一些数据类型。我想做一个preCondition检查,并且ALTER TABLE只在它是 DECIMAL 数据类型时调用,但我希望它被更改为 INTEGER。
无法为此找到预定义的先决条件,也无法编写sqlCheck。
preconditions ×10
java ×5
assert ×2
liquibase ×2
android ×1
assertions ×1
c# ×1
c++ ×1
codacy ×1
contracts ×1
groovy ×1
guava ×1
hibernate ×1
idiomatic ×1
invariants ×1
methods ×1
mysql ×1
null-pointer ×1
scala ×1
teradata ×1