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从构造函数中 - 这会导致在客户端没有注意到任何内容的情况下构造不正确的对象(构造函数的直接调用者应该如何知道打印到标准输出的内容?) . 相反,您需要抛出异常

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

在你的构造函数中抛出一个IllegalArgumentException而不是 Sysout & return。
由于这是一个例外情况,即构造函数无法创建具有这样值的类实例,因此简单地从构造函数中正常返回会使程序正常继续,这在这种情况下是您不希望的,因此抛出异常是最合适的在这里做。

于 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 回答