AP C.S.作业的Java断言

AP C.S.作业的Java断言,java,assertion,Java,Assertion,我正在创建一个简单的银行账户类“BankAccount”。目标是增强类以确保达到所需的值。例如,当构造类的新对象时,构造函数要求初始余额大于$0。它要求您使用断言 public class BankAccount { priavte int balance; public BankAccount(int initialBalance) { assert (initialBalance > 0); balance = initialBalance; } }

我正在创建一个简单的银行账户类“BankAccount”。目标是增强类以确保达到所需的值。例如,当构造类的新对象时,构造函数要求初始余额大于$0。它要求您使用断言

public class BankAccount 
{

priavte int balance;

public BankAccount(int initialBalance)
{
    assert (initialBalance > 0);
    balance = initialBalance; 
}
}    

这是使用断言的正确方法吗?如果InitialBalance<0,assert语句将做什么?

这不是使用断言的正确方法。事实上,Oracle认为断言不应检查方法参数,更重要的是,决不应断言具有副作用的函数调用的结果(因为无法保证它将实际执行)

它们被设计用于检查不变量(例如,列表类可能包括一些元素和
int length
,并且该长度必须等于元素的数量)。正确使用的另一个示例:

public Foo acquireFoo(int id) {
  Foo result = null;
  if (id > 50) {
    result = fooService.read(id);
  } else {
    result = new Foo(id);
  }
  assert result != null;

  return result;
}
如果Java应用程序在命令行上使用
-ea
运行,则将启用断言。当应用程序达到
assert(initialBalance>0)时,如果initialBalance小于0且启用了断言,则将抛出一个。如果未传递
-ea
,则不会抛出断言错误

更明智的做法是提出如下建议:

public BankAccount(int initialBalance)
{
    if (initialBalance < 0){
        throw new IllegalArgumentException("The initial balance may not be negative.");
    }
    balance = initialBalance; 
}
公共银行账户(int初始余额)
{
如果(初始余额<0){
抛出新的IllegalArgumentException(“初始余额可能不是负数”);
}
平衡=初始平衡;
}

您可以使用现有框架进行测试,其中包含许多常见断言。