0

这是我关于多个 catch 块如何处理返回对象和处理错误的问题的后续内容

我更新的代码如下,但是我收到一个错误,即我的 draw() 方法必须返回一个 int,有没有办法让编译器认识到 endOfDeck() 将返回一个 int,从而满足返回要求?(参见“返回 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();

}
4

3 回答 3

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 块,您的方法将不会返回任何值。可能您可以返回任何表示异常的整数,或者将异常包装在 a 中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");
    }
于 2013-02-07T20:42:27.347 回答
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.
    }

或者,您需要在方法底部添加默认返回值。

于 2013-02-07T20:43:08.373 回答
0

当一个方法被声明为返回某些东西时,您必须确保通过该方法的每条执行路径都会导致(未捕获的)异常传播到调用者或返回一个值。

您的陈述return endOfDeck()非常好,但是您的代码路径仍然没有返回:

catch(Exception e)
    {
        System.out.println("Exception when drawing a card, check try/catch block in draw() method of Card");
        e.printStackTrace();
    }

如果发生这种情况,则说明编译器可以返回。

于 2013-02-07T20:45:36.867 回答