你如何在java中返回方法的结果?

时间:2013-02-07 20:41:01

标签: java return

这是关于多个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();

}

3 个答案:

答案 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();
    }

如果发生这种情况,那么注意到编译器可以返回。