我正在写一个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,但认为这不是一个好主意,因为它没有改变任何东西。
答案 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