【问题标题】:Handling an exception properly正确处理异常
【发布时间】:2011-10-02 12:30:57
【问题描述】:

我不擅长处理异常,所以在这个场合我需要一个提示: 我想将数组放在一个集合(ArrayList)中,所有这些都应该具有相同的长度。否则计算中会出现错误。当要在 ArrayList 中插入一个不需要长度的数组时,我想抛出一个带有消息的异常。什么样的例外适合这种场合?

让我担心的是我必须检查要插入的数组的大小(使用 if 语句)。在 try 块中使用 if 语句是否合理?

这里是相关的片段代码:

输入数据:数组列表

arraylength:插入的第一个数组指定的数组长度

有人可以修改 try - catch 块吗?

public void insertData(double[] arraydata){
    if(this.inputdata.isEmpty()){
        inputdata.add(arraydata);
        this.arraylength = arraydata.length; 
    }else{
        try {
           if(this.arraylength == arraydata.length)
               inputdata.add(arraydata);
        }catch(Exception exception){
            System.err.printf("Missmatch array dimensions in %d place",inputdata.size()+1);           
        }
    }
}

【问题讨论】:

  • 您是否打算将异常用于控制流?

标签: java arrays exception-handling


【解决方案1】:

例外应该只针对例外情况。如果这种情况经常发生,您可能希望以另一种方式处理它,在工作流中使用标准逻辑。例如,如果可以插入数据,则可以返回 n true,如果要插入的数组长度不正确,则可以返回 false。或者您可以检查用户何时输入数组值,然后告诉他们长度必须为x

如果这确实代表例外情况,则抛出IllegalArgumentException,如

if(this.arraylength == arraydata.length)
    inputdata.add(arraydata);
} else {
    throw new IllegalArgumentException("Ever array needs same length...");
}

类似的东西。

正如所写,您的代码现在正在捕获add 操作中引发的任何异常。正如我的示例所示,您应该在 insertData 方法中抛出异常,而不是 catch。应该在插入数据方法之外捕获异常。这意味着您不需要 insertData 中的 try/catch 语句。

还要注意IllegalArgumentException 是一个运行时异常,因此如果您不想抛出或捕获它,则无需抛出或捕获。如果你愿意,你仍然可以抓住它。

【讨论】:

  • 如果没有发生异常,如果尺寸不匹配并继续抛出异常不是更好吗?我的意思是这样的: if(this.arraylength != arraydata.length) { throw new IllegalArgumentException( String.format("Missmatch array dimensions in %d place",inputdata.size()+1)); } inputdata.add(arraydata);
  • 您首先测试是否相等,如果测试成功则添加元素,否则抛出异常。我的意思是相反的方式不是更好。请参阅我的第一条评论中的代码和 Hemal Pandya 的回答。
  • 重要的原因是在继续之前有一个检查错误的约定。此外,它还降低了代码的圈复杂度,因为不需要 else 子句。
【解决方案2】:

你在做什么

    try {
       if(this.arraylength == arraydata.length)
           inputdata.add(arraydata);
    }catch(Exception exception){
        System.err.printf("Missmatch array dimensions in %d place",inputdata.size()+1);           
    }

捕捉异常。但是inputdata.add 不会抛出任何异常。相反,您应该抛出异常,以便调用者知道有问题:

   if(this.arraylength != arraydata.length)
       throw new IllegalArgumentException("Array length " + arraydata.length 
           + " is not same as previous length " + this.arraylength);
   inputdata.add(arraydata);

异常包括一条有用的消息,让调用者知道不匹配是什么。

请注意,我已经反转了测试,如果长度不可接受,则抛出异常;否则执行到下一行。

【讨论】:

    【解决方案3】:

    什么例外是合适的?要看。以下是一些需要考虑的事项。

    1. 此代码是否是方法的一部分,用户是否有责任传递正确大小的数组?调用者犯了一个错误,所以使用 IllegalArgumentException。
    2. 此代码是否是较大代码行的一部分,是否旨在构建正确大小的数组?您的假设之​​一是错误的,因此请使用 IllegalStateException。
    3. 数组大小错误的情况在某种程度上是合法的,您的处理程序会在某种程度上修复这种情况,然后继续。对于这种情况,我会推出自己的例外。

    您的代码似乎是案例 (1)。提供的答案显示了一些处理此问题的好方法。我自己喜欢使用Guava Preconditions,因为它们是自我记录的并且不易出错(没有 if 语句只是为了指导执行需要维护的错误条件——只需在有意义的地方添加新的 checkSomething 调用):

    import static com.google.common.base.Preconditions.checkArgument;
    
    <snip>
    
    public void insertData(double[] arraydata) {
        checkArgument(this.arraylength == arraydata.length,
                "Ever array needs same length...");
        inputdata.add(arraydata);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 2023-03-07
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2021-05-22
      • 2011-08-25
      相关资源
      最近更新 更多