尝试使用输入捕获不捕获异常

时间:2014-12-05 21:01:46

标签: c#

我正在创建一个二十一点游戏,到目前为止我已经制作了一个卡片类。卡片类可以工作,但是当我在测试时测试我的卡类时,异常应该被捕获,因为" X"不在值数组中但由于某种原因它不会捕获并显示X而不是错误消息" Invalid Input"。我想要发生的是我的值集访问器应该搜索String [] values数组,然后确定value参数是否有效,如果它不是,那么抛出一个新的异常。我不知道如何解决这个问题。另外,我不能使用枚举来获取我需要使用values数组的值。

任何帮助将不胜感激

以下是我的卡片课程

class Card
{

    public enum SUIT { HEARTS, SPADES, DIAMONDS, CLUBS };

    private SUIT _suit;
    private String _value;

    public Card(SUIT suit, String value)
    {

        _suit = suit;
        _value = value;
    }

    public SUIT Suit
    {
        get
        {
            //Return member variable value
            return _suit;
        }
        set
        {
            _suit = value;
        }
    }

    private String[] values = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
    public String Value
    {
        get { return _value; }
        set
        {
            if (!values.Contains(value))
            {
                throw new ArgumentException("Invalid Input");
            }
            _value = value;
        }
    }
}
  

以下是我正在测试的代码

try
        {
            Card testCard1 = new Card(Card.SUIT.SPADES, "Q");
            Console.WriteLine(testCard1.Suit + " " + testCard1.Value);
            Card testCard2 = new Card(Card.SUIT.DIAMONDS, "10");
            Console.WriteLine(testCard2.Suit + " " + testCard2.Value);
            Card testCard3 = new Card(Card.SUIT.DIAMONDS, "X");
            Console.WriteLine(testCard3.Suit + " " + testCard3.Value);

        }
        catch (ArgumentException e)
        {
            Console.WriteLine(e.Message);
        }
        Console.ReadLine();

2 个答案:

答案 0 :(得分:6)

您正在通过构造函数将不正确的值分配给支持域。这不是一件坏事,但它会绕过你的属性。

public Card(SUIT suit, String value)
{

    _suit = suit;
    _value = value; // this assignes the value directly to the field, bypassing your property-logic.
}

像这样改变,这将是最简单的解决方案

public Card(SUIT suit, String value)
{

    _suit = suit;
    Value = value; // use the property here.
}

答案 1 :(得分:1)

您在Value中编写了set的检查逻辑,但是在您的代码中,您在构造函数中传递X,这将分配给私有成员变量(从而完全避免你写的漂亮的过滤器逻辑。)

您应该在构造函数中分配属性,如下所示:

public Card(SUIT suit, String value)
{
    Suit = suit;
    Value = value;
}