在servlet中使用assert

时间:2016-03-15 14:37:43

标签: java assert

我有以下问题:在servlet中,我需要处理来自已经实现的供应商的不同输入(在以下列表中)(只知道接口)。如果列表具有相同的大小(几乎肯定是这种情况,除非供应商函数搞砸了),这种处理才有意义,因此我想对大小使用assert(否则它将抛出和索引超出绑定异常或类似之后的东西,这对于后来的开发人员来说很难调试)。这里的问题是,我的程序将在没有-ea参数的服务器上运行。我的问题是:assert是否仍然可以采用正确的方式:

try{
    List listA = supplier.getListA();
    List listB = supplier.getListB();
    assert listA.size()==listB.size();

    List listC = supplier.getListC();
    assert listA.size()==listC.size();
}
catch(AssertionError error){
   //error handling
}

或者我被抛回异常:

try{
    List listA = supplier.getListA();
    List listB = supplier.getListB();
    if(listA.size()!=listB.size())
        throw new RuntimeException();

    List listC = supplier.getListC();
    if(listA.size()!=listC.size())
        throw new RuntimeException();
}
catch(RuntimeException exception){
   //error handling
}

为了便于阅读,前一种方式是首选,但不一定能在服务器上运行。

2 个答案:

答案 0 :(得分:2)

有些语言的设计方式不同,但在Java中,使用流量控制的异常是一种很好的方式来拍摄自己。

为什么不只是制作一个if语句并检查条件?

List listA = supplier.getListA();
List listB = supplier.getListB();
List listC = supplier.getListC();
if(listA.size()==listB.size() && listA.size()==listC.size()) {
    //happy path :)
} else {
    //sad path :(
}

答案 1 :(得分:1)

我会扩展我的评论:

您可以使用包含Assert类的外部库,也可以自行滚动,例如:像这样:

class AssertionException extends Exception {
  //content goes here
}

class Assert {
  public void sameSize( Collection<?> a, Collection<?> b ) {
    //TODO: handle null as well
    if( a.size() != b.size() ) {
      throw new AssertionException("some message"); 
    }
  }
}

然后您的代码变为:

try{
  List listA = supplier.getListA();
  List listB = supplier.getListB();
  Assert.sameSize( listA, listB );

  List listC = supplier.getListC();
  Assert.sameSize( listA, listC );
 }
catch(AssertionException ex){
  //error handling
}

它与语言级断言基本相同(错误和异常都是抛出的,但错误通常用于表达致命条件,而这种情况并非如此)。

我想重申一下CptBartender所说的内容:错误和异常是表达意外行为的一种方式,即是否使用它们取决于您的错误处理代码将执行的操作以及是否应该发生错误情况在正常执行期间与否。