Java 如果特定条件不正确,我可以不返回什么

Java 如果特定条件不正确,我可以不返回什么,java,arrays,indexoutofboundsexception,Java,Arrays,Indexoutofboundsexception,我正在编写一个矩阵类,并编写了一个getNumber方法,该方法返回矩阵中特定插槽中的数字。如果特定插槽不存在,我可以做什么?我被困在这里: public int getNumber(int row, int column) { if (row < matrix.length && column < matrix[0].length) { return data[row][column]; } else { //wh

我正在编写一个矩阵类,并编写了一个getNumber方法,该方法返回矩阵中特定插槽中的数字。如果特定插槽不存在,我可以做什么?我被困在这里:

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

我不想在创建返回类型Integer后返回null,因为它感觉不是一个好的设计。最好的方法是什么?我曾考虑回避IndexOutOfBoundsException,但认为这不是一个好主意,因为它不会改变任何东西

有两种可能的解决方案:

  • 如果未检索到号码,则引发异常
  • 返回一个
    整数
    null
    而不是
    int
    。使用整数可以返回空值,因为整数是标准对象而不是基元类型
抛出异常

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 int getNumber(int行,int列){
if(行
返回空值

 public Integer getNumber(int row, int column) {  
    if (row < matrix.length && column < matrix[0].length) {
        return data[row][column];
    } else {
        return null;
    }
}
public Integer getNumber(int行,int列){
if(行
是否可选?
可选的
是对象的包装,该对象的值可以为null。这是正确的情况吗?我想不是。这里没有必要返回非null对象而不是null。代码将始终检查
isPresent
函数,因此引入可选功能只会降低代码的可读性,而不会提高代码的可读性。所以我不认为一个可选的答案是正确的。可能正确的解决方案是返回一个
ArrayIndexOfBoundException

我将保留
IndexOutOfBoundsException
,在方法的文档中明确说明这一点


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

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

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];
}


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

抛出您自己的自定义异常?indexoutofbounds只会真正应用于访问超出数组边界的数组索引,这在技术上是不会发生的。@WalterM为什么你认为
-1
在这个矩阵中不是一个有效的数字?@WalterM你在做一个危险的假设,即所讨论的矩阵实际上不能保存值
-1
精确返回null有什么错?无论何时调用该方法,都可以使用条件来处理空值。否则,我建议返回一个您知道在matrix@DaneBrick由于
null
很糟糕,请改用
Optional
选项。是可选选项可以是java 8或更高版本的选项。如果使用“番石榴”,也可以是java 6+。不确定可选选项是否是正确的选择。可选的是一个容器,它将授予函数返回对象的权限。这里不需要对象,返回null是更好的解决方案。相反,如果您需要在不接受空值的集合或映射中插入该对象,则可选的是最佳解决方案。如果仍然抛出异常,为什么要检查边界?我只需要使用
返回数据[行][列],因为如果边界不正常,JVM将抛出异常本身。顺便说一句,你的检查只完成了一半。你能回答我要问的Tom的问题吗?@Tom我更喜欢故意扔的方法,而不是让JVM帮我扔。我知道也存在另一种方法,因此省略检查绝对有效。@dasblinkenlight如果只检查上界并在异常消息中“隐藏”使用过的/错误的索引,您更愿意抛出
indexootfboundsexception
?听起来不是个好主意;P.如果我想更改使用过的消息,我只会手动抛出异常:)。@dasblinkenlight我同意。我们不要在这一点上迷失了方向。以可控的方式处理事情是更好的做法,即使这意味着引发错误,而不是简单地陷入会引发错误的默认行为。最好明确表示可选操作适用于java 8或更高版本。@Davidorenzomarino只有在认为库不能使用的情况下才有效。@Jean是的,但。。。有多少人使用Java1.4。可能不多。有多少人使用Java1.8可能不多。因此,标准是为大多数用户公开解决方案。解释不适用于1.4的内容是无用的,解释不适用于1.8的内容是有用的。另外,如果您需要从函数中检索到的对象在某处使用,则可选选项非常有用。情况并非如此。引入像可选的包装器一样的包装器只是添加一些不有用的代码,以表明您知道如何使用Optional@DavideLorenzoMARINO为什么没有用?返回的每个对象都应该在某个地方使用
Optional
明确说明返回的对象可以为空,由调用方按照自己的方式处理。@Jean Logeart我认为在使用返回值的代码中,没有使用Optional方法(比如使用默认值而不是null)。当您处于以下情况之一时,可选值非常有用:您需要在集合或不接受null的自定义对象中重用该值,或者需要使用Opti的函数