0

これは、複数のキャッチブロックに関する私の質問の続きです。オブジェクトの返送とエラーの処理に対処する方法

更新されたコードは以下のとおりですが、draw()メソッドがintを返す必要があるというエラーが発生します。コンパイラに、endOfDeck()がintを返すことを認識させて、戻り要件を満たす方法はありますか?(「returnendOfDeck()」を参照)

これを達成するためのよりスマートな方法はありますか?

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ブロックにはreturnステートメントがありません:-

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");
    }
于 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 に答える