2014-12-05 78 views
0

我正在创建一个二十一点游戏,到目前为止,我已经做了一个卡类。卡类的工作,但是当我去测试我的卡类,当它测试3异常应该赶上,因为“X”不在值数组,但由于某种原因,它不捕获和显示X而不是错误消息“输入无效”。我想要发生的是我的值集访问者应搜索字符串[]值数组,然后确定值参数是否有效,如果它不是然后抛出一个新的异常。我不知道如何解决这个问题。此外,我不能使用枚举值我需要使用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(); 
+0

[属性C#基础教程(http://www.tutorialspoint.com/csharp/csharp_properties.htm)本读了' andrew689' – MethodMan 2014-12-05 21:06:46

+1

问题出在你的构造函数中,你没有调用属性来设置值,而是直接将它设置为成员变量。 – Sorceri 2014-12-05 21:09:28

+0

我发誓我已经多次看过这个相同的问题;这是一个任务还是什么? – 2014-12-05 21:20:47

回答

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

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

你应该分配给特性在这样的构造:

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