如果特定条件不正确,我什么都不能返回

时间:2015-12-21 15:20:43

标签: java arrays indexoutofboundsexception

我正在写一个Matrix类,我写了一个getNumber方法,它返回矩阵中特定插槽中的数字。如果特定插槽不存在,我该怎么办?我被困在这里:

public int getNumber(int row, int column)
{  
    if (row < matrix.length && column < matrix[0].length) {
        return data[row][column];
    } else {
        //what now then?
    }
}

我不想在返回类型为Integer之后返回null,因为它并不像一个好的设计。做这个的最好方式是什么?我考虑过抛弃IndexOutOfBoundsException,但认为这不是一个好主意,因为它没有改变任何东西。

3 个答案:

答案 0 :(得分:4)

由于您的代码检查输入的边界,您应该抛出而不是返回:

public int getNumber(int row, int column) {  
    if (row >= matrix.length || column >= matrix[0].length) {
        throw new IndexOutOfBoundsException("("+row+", "+column+") is not a valid pair of indexes.");
    } 
    return data[row][column];
}

你应该抛出而不是静默返回的原因是超出边界是编程错误。调用者应该通过不首先进行调用来修复它,而不是通过检查返回值。

答案 1 :(得分:3)

我会离开IndexOutOfBoundsException,在方法的文档中明确说明。

另一种方法是返回Optional<Integer>,如果给定索引中没有元素,则Optional为空。

答案 2 :(得分:0)

有两种可能的解决方案:

  • 如果未检索到该号码,则会引发异常
  • 返回Integer null而不是int。使用Integer可以返回null值,因为Integer是标准对象而不是基本类型。

抛出异常

public int getNumber(int row, int column) {  
    if (row < matrix.length && column < matrix[0].length) {
        return data[row][column];
    } else {
        throw new IllegalArgumentException("Invalid value");
        // or throw new ArrayIndexOutOfBoundException("Invalid value");
    }
}

返回空值

 public Integer getNumber(int row, int column) {  
    if (row < matrix.length && column < matrix[0].length) {
        return data[row][column];
    } else {
        return null;
    }
}

是否可选? Optional是Object的包装器,其值可以为null。这是正确的情况吗?我想不是。没有必要在这里返回一个非null对象而不是null。代码将始终检查isPresent函数,因此引入Optional只会增加代码的可读性,而不会改进它。因此,我不认为Optional是正确的答案。可能正确的解决方案是返回ArrayIndexOfBoundException