当有if和no时,返回java中的值

时间:2015-03-23 12:28:34

标签: java methods return

我被困在一个简单的方法中因为我无法进行编译。 我为objList的每个循环做了ArrayList<anObject>。我知道编译器无法编译它,因为没有&#34;顶级返回&#34;。

anObject getObjByID(int id){           
    for(anObject obj : objList ){      
      if (obj.getID() == id){
        return node;        
      }        
    }           
  }

此外,当条件不满足时,我也不知道该返回什么。我无法返回anObject,因为它没有。 希望你能帮助我提供解决方案。

8 个答案:

答案 0 :(得分:4)

你可以做几件事:

  • 返回null

不是最好的做法,因为方法的客户端将被强制处理可能返回的null(如果他没有,则可以抛出NullPointerException

您的方法如下:

anObject getObjByID(int id){           
    for(anObject obj : objList ){      
        if (obj.getID() == id){
            return obj;        
        }        
    }            
    return null;
}

在这种情况下,客户端必须处理null结果的情况:

anObject result = getObjByID(someId);
if (result != null) {
    //proceed
}

  • 抛出IllegalArgumentException(或其他Exception

您可以抛出IllegalArgumentException来表示所提供的Node没有对应的id。客户端将被迫处理异常。

您的方法如下:

anObject getObjByID(int id) throws IllegalArgumentException {           
    for(anObject obj : objList ){      
        if (obj.getID() == id){
            return obj;        
        }        
    }            
    throw new IllegalArgumentException("Invalid index");
}

并且客户端必须处理异常:

try {
    anObject result = getObjByID(someId);
    //proceed
} catch (IllegalArgumentException e) {
    //handle the exception
}

Java8引入了Optonal<T>类,它类似于外星人 - 它可能存在也可能不存在。将方法的返回类型指定为Optional<T>有助于客户端意识到返回值可能存在,或者可能不存在。

您的方法如下:

Optional<anObject> getObjByID(int id){           
    Optional<anObject> result = Optional.empty();
    for(anObject obj : objList ){      
        if (obj.getID() == id){
            result = Optional.of(obj);        
        }        
    }            
    return result;
}

客户端将使用以下方法:

Optional<anObject> result = getObjByID(someId);
if (result.isPresent()) {
    anObject realResultObject = result.get();
}

答案 1 :(得分:3)

如果找不到您的搜索return,则必须default一些object值。你可以在这里返回null

anObject getObjByID(int id){           
  for(anObject obj : objList ){      
    if (obj.getID() == id){
     return node;       // will return when searching matched 
    }        
  }          
  return null; // will return matching not found.
}

投掷exception是您可以使用的另一种选择。

anObject getObjByID(int id){           
    for(anObject obj : objList ){      
      if (obj.getID() == id){
        return node;        
         }        
    }
  throw new MyException("Element Not Found");           
}

答案 2 :(得分:1)

您需要在每种情况下都返回一个值。 Null在这里似乎很好。

anObject getObjByID(int id){           
  for(anObject obj : objList ){      
    if (obj.getID() == id){
      return node;        
    }        
  }  
  return null;         
}

您始终需要考虑可以调用此方法,并且if语句不等于true。那么你的方法应该返回什么?它需要anObject类型的对象或您返回null。如果这种情况永远不会发生,有时抛出异常是有意义的。

答案 3 :(得分:1)

  

此外,当不满足条件时,我不知道该返回什么。

这真的取决于你的逻辑。如果你想允许null,你不应该在没有找到对象的情况下返回它,你可以创建自己的对象来指示找不到该对象,或者抛出将在以后捕获的异常。

如果您的对象不能是null,则可以假设在找不到对象时返回null

如果您使用的是Java 8,那么您有更好的选择,请参阅Optional

请遵循Java命名约定

答案 4 :(得分:0)

anObject getObjByID(int id){           
    for(anObject obj : objList ){      
      if (obj.getID() == id){
        return node;        
      }        
    } 
      return null;
  }

答案 5 :(得分:0)

您可以简单地使用特定消息抛出异常,这在我看来是一个很好的解决方案。但如果没有捕获,这将破坏程序的流程。

anObject getObjByID(int id){           
        for(anObject obj : objList ){      
          if (obj.getID() == id){
            return node;        
             }        
        }
      thronw new UserDefinedException("Item not found in list");           
}

答案 6 :(得分:0)

基本上有两种不同的选择:

  1. 找不到对象是有效的场景;然后你可以返回null。或者也许是一些代表空搜索结果的特殊Singleton对象 - 因为许多人认为在这样的上下文中使用null是一个坏主意(它会强制你的方法的调用者检查null;或冒险NullPointerExceptions

  2. 找不到对象是一个不应该发生的错误:然后你可以在循环之后抛出异常。

答案 7 :(得分:0)

来自ls-8.4.7

  

如果声明方法具有返回类型,则如果方法的主体可以正常完成(第14.1节),则会发生编译时错误。

平均将您的预期对象返回到完成方法或返回null

来自jls-8.4.5

  

如果返回类型是引用类型,则返回类型可能会因覆盖彼此的方法而异。 return-type-substitutability的概念支持协变返回,即返回类型到子类型的特化。

     

当且仅当满足以下条件时,具有返回类型R1的方法声明d1是具有返回类型R2的另一个方法d2的return-type-substitutable:

     

如果R1无效,则R2无效。

     

如果R1是基本类型,则R2与R1相同。

     

如果R1是参考类型,则:

     

R1是R2的子类型,或者R1可以通过未经检查的转换(第5.1.9节)转换为R2的子类型,或

     

R1 = | R2 |

表示如果您使用的是java 7,则返回Type应该符合上述条件。

如果您使用的是java 8,请检查JLS 8.4.5. Method Result