尝试捕获不捕获输入异常

本文关键字:异常 输入 | 更新日期: 2023-09-27 18:33:20

我正在创建一个二十一点游戏,到目前为止我已经制作了一个纸牌类。卡类有效,但是当我去测试我的卡类时,当它执行 test3 时,异常应该捕获,因为"X"不在值数组中,但由于某种原因它没有捕获并显示 X 而不是错误消息"无效输入"。我想发生的是我的值集访问器应该搜索 String[]values 数组,然后确定 value 参数是否有效,如果无效,则抛出一个新的异常。我不确定如何解决这个问题。此外,我不能为我的值使用枚举,我需要使用值数组。

任何帮助将不胜感激

这是我的卡片类的内容

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();

尝试捕获不捕获输入异常

您通过构造函数将不正确的值分配给后备字段。这不是一件坏事,但它绕过了你的属性逻辑。

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.
}

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

您应该像这样分配给构造函数中的属性:

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