我被困在一个简单的方法中因为我无法进行编译。
我为objList
的每个循环做了ArrayList<anObject>
。我知道编译器无法编译它,因为没有&#34;顶级返回&#34;。
anObject getObjByID(int id){
for(anObject obj : objList ){
if (obj.getID() == id){
return node;
}
}
}
此外,当条件不满足时,我也不知道该返回什么。我无法返回anObject,因为它没有。 希望你能帮助我提供解决方案。
答案 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
}
Optional<T>
类型 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)
基本上有两种不同的选择:
找不到对象是有效的场景;然后你可以返回null
。或者也许是一些代表空搜索结果的特殊Singleton对象 - 因为许多人认为在这样的上下文中使用null
是一个坏主意(它会强制你的方法的调用者检查null;或冒险NullPointerExceptions
)
找不到对象是一个不应该发生的错误:然后你可以在循环之后抛出异常。
答案 7 :(得分:0)
来自ls-8.4.7
如果声明方法具有返回类型,则如果方法的主体可以正常完成(第14.1节),则会发生编译时错误。
平均将您的预期对象返回到完成方法或返回null
。
如果返回类型是引用类型,则返回类型可能会因覆盖彼此的方法而异。 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