这是关于多个catch块How to deal with returning an object and handling errors
的问题的后续内容我的更新代码如下,但是我得到一个错误,我的draw()方法必须返回一个int,有没有办法让编译器认识到endOfDeck()将返回一个int,从而满足返回要求? (参见“return endOfDeck())
任何更聪明的方法来实现这一目标?
import java.util.ArrayList;
import java.util.ListIterator;
/**
* @author L
*
*/
public abstract class Deck
{
private ArrayList<Card> cards;
private ListIterator<Card> deckPosition = cards.listIterator();
private Card lastDrawn;
/**
*
*/
public Deck()
{
}
public int draw()
{
try
{
if(deckPosition.hasNext())
{
lastDrawn = deckPosition.next();
return 1;
}
else if(cards.isEmpty())
{
throw new EmptyDeckException();
}
else
{
throw new EndOfDeckException();
}
}
catch(EmptyDeckException e)
{
emptyDeck();
return 0;
}
catch(EndOfDeckException e)
{
return endOfDeck();
}
catch(Exception e)
{
System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
e.printStackTrace();
}
}
public abstract int endOfDeck();
public abstract void emptyDeck();
}
答案 0 :(得分:6)
您的上一个catch
区块没有任何退货声明: -
catch(Exception e)
{
System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
e.printStackTrace();
}
因此,如果执行了catch块,则您的方法不会返回任何值。可能是您可以返回表示异常的任何整数,或者将异常包装在RuntimeException
中并重新抛出它。
但是,您的代码似乎有些问题。你不必要地抛出异常。无论您在catch
区块中执行什么操作,都可以直接在if-else
区块中进行操作。
因此,您可以将代码修改为: -
try {
if(deckPosition.hasNext())
{
lastDrawn = deckPosition.next();
return 1;
}
else if(cards.isEmpty())
{
emptyDeck();
return 0;
}
else
{
// throw new EndOfDeckException(); // Don't throw it
return endOfDeck();
}
} catch(Exception e) {
/** Also, if possible, replace this catch block with the one catching
more specific exception than all the `Exceptions` **/
System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
throw new RuntimeException("Exception drawing a card");
}
答案 1 :(得分:1)
您的底部catch
必须返回int
才能满足所有代码路径。
catch(Exception e)
{
System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
e.printStackTrace();
// Return needs to be here.
}
或者,您需要在方法的底部添加默认返回值。
答案 2 :(得分:0)
当一个方法被声明为返回某个东西时,你必须确保通过该方法执行的每个路径都会导致(未捕获的)异常传播给调用者或返回的值。 / p>
您的陈述return endOfDeck()
完全没问题,但您的代码路径仍未返回:
catch(Exception e)
{
System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
e.printStackTrace();
}
如果发生这种情况,那么注意到编译器可以返回。