0

クラスの例があります。新しいカードを作成し、配列に入れます。カードの数を制御し、カードの数が 54 を超える場合はフローを終了したい:

public class Card {
    private final String rank; 
    private final String suit;
    private String[][] cards;
    private static int NoC = 0;

    public Card(String suit, String rank) {
        if (NoC >= 54) {
        System.out.println("You cannot create any more cards");

        // and this "return" doesn't work correctly. NetBeans says "variable rank might not have been initialized"
        return;   
    }

    this.suit = suit;
    this.rank = rank;

    cards = new String[54][2];
    cards[NoC][0] = this.suit;
    cards[NoC][1] = this.rank;
    NoC = NoC + 1;
}

プログラムはエラーなしでコンパイルされます。そして、期待どおりに機能します。55 番目のカードが作成されている場合、IF句に移動し、「これ以上カードを作成できません」という通知が出力されますが、 「コンパイルできないソース コード - 変数ランクが初期化されていない可能性があります」という警告もスローされます。

正しく実行するにはどうすればよいですか?コマンドの代わりに smth else を使用する必要がありますreturnか?

4

3 に答える 3

3

53 番目のカードが作成されないようにしたい場合はreturn、コンストラクターからだけではできません。クライアントが何も気付かずにオブジェクトが不適切に構築されることになります (コンストラクターの直接の呼び出し元は、stdout に出力されたものをどのように知る必要がありますか?) . 代わりに、例外をスローする必要があります:

public Card(String suit, String rank) {
    if (NoC >= 52) {
        throw new IllegalStateException("You cannot create any more cards");
    }

    this.suit = suit;
    this.rank = rank;

    cards = new String[54][2];
    cards[NoC][0] = this.suit;
    cards[NoC][1] = this.rank;
    NoC = NoC + 1;
}

IllegalStateExceptionは単なる例です。この目的で再利用できる既存の実行時例外です。または、代わりに独自の (チェック済み) 例外を定義して使用することをお勧めします。

より良い解決策

一般に、値が静的に認識され、制限されている型を定義するには、enum. これにより、新しい値を動的に構築することができないため、上記の問題全体が回避され、enum何もチェックする必要がなくなります。

于 2012-05-23T14:24:31.253 に答える
3

IllegalArgumentExceptionSysout & return の代わりに、コンストラクターでan をスローします。
これは例外的なケースであるため、つまり、コンストラクターはそのような値でクラス インスタンスを作成することはできません。コンストラクターから通常どおりに戻るだけでプログラムが通常どおり続行されますが、この場合は望ましくないため、例外をスローすることが最も適切です。ここで行う。

于 2012-05-23T14:24:35.403 に答える
1

コンストラクターから戻ることはできません。作成を防ぐためにすべきことは、コンストラクターから例外をスローすることです。

 public Card(String suit, String rank) {
    if (NoC >= 52) {
        throw new IllegalStateException("The limit has been reached");
    }
    ...
 }
于 2012-05-23T14:27:04.013 に答える