Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当用户输入null或空字符串时引发错误_C#_.net_String_Exception Handling - Fatal编程技术网

C# 当用户输入null或空字符串时引发错误

C# 当用户输入null或空字符串时引发错误,c#,.net,string,exception-handling,C#,.net,String,Exception Handling,我正在尝试解决以下问题: 您需要创建一个名为Product的类来表示产品。 该类有一个名为Name的属性。产品类的用户 应该能够获取并设置Name属性的值。然而, 将Name的值设置为空字符串或null的任何尝试 值应引发异常。此外,产品类的用户 不能访问产品的任何其他数据成员 班级。您将如何创建这样一个类 我创建了以下代码,但由于某些原因,当字符串无效时,它不会引发异常: class Program { static void Main(string[] args) {

我正在尝试解决以下问题:

您需要创建一个名为
Product
的类来表示产品。 该类有一个名为
Name
的属性。
产品
类的用户 应该能够获取并设置
Name
属性的值。然而, 将
Name
的值设置为空字符串或null的任何尝试 值应引发异常。此外,
产品
类的用户 不能访问
产品的任何其他数据成员
班级。您将如何创建这样一个类

我创建了以下代码,但由于某些原因,当字符串无效时,它不会引发异常:

class Program
{
    static void Main(string[] args)
    {
        Product newProduct = new Product();
        Console.WriteLine("Enter Product name:");
        newProduct.Name = null; //Console.ReadLine();
        Console.WriteLine("Product name is : {0}", newProduct.Name);
        Console.ReadLine();
    }
}

class Product
{
    private string name;
    public string Name
    {
        get
        {
            return this.name;
        }
        set
        {
            if (Name != String.Empty || Name != null)
            {
                name = value;
            }
            else
            {
                throw new ArgumentException("Name cannot be null or empty string", "Name");
            }
        }
    }
}
是否因为我没有
try-catch
语句而没有引发异常?
我还想知道有没有可能只有catch语句而没有try语句?

如果
状态错误,那么您的
。让我们做一个真值表:

if (value != String.Empty || value != null)

你的if语句总是正确的

我要这样写:

if (value == String.Empty || value == null)
{
     throw new ArgumentException("Name cannot be null or empty string", "Name");  
}
else
{
     name = value;
}

您可以将Or改为and,但我认为上面的内容更好(下面有一个不必要的双负):


正如Dmitry Bychenko所说,我没有注意到您没有测试
值。不是您的属性的名称


异常中的第二个参数(Dmitry Bychenko再次指出)应该是:

导致当前异常的参数的名称

在您的例子中,哪个是字符串
“value”

使用。更改您的
设置
,如下所示:

set
{
      if (!string.IsNullOrEmpty(value))
      {
            name = value;
      }
      else
      {
            throw new ArgumentException("Name cannot be null or empty string", "value");
      }
}
您还可以使用它来指示指定的字符串是否为null、空或仅由空白字符组成。

如果您希望对null和空字符串执行不同的异常(通常null表示完全错误,而空字符串只是格式错误):

如果您不想区分它们:


请注意,在这两种情况下,必须测试的都是
,而不是属性
名称
。在原始代码中,
名称
(以及
名称
)的初始值是
null
,无论您尝试设置什么,都会得到异常。

您正在检查以前的值(有效)。使用
if
中的
value
而不是
Name
来验证新值。或者只需在
Main
内设置
Name
两次;)不试就抓不到。否则,它怎么知道应该从哪个代码捕获呢?即使没有try/catch,也会抛出异常。你只是没有达到代码。学习使用IDE的调试工具在代码执行时逐行遍历代码。我想这样你会很快发现问题。你在if语句中使用了
。如果
Name==null
,则
Name!=String.Empty
则该部分通过。使用
&&
。可能重复Yes,但从语法上看,切换语句会更好。如果字符串为空或null,则它是错误的。呃,您应该始终与
!=首先为空。这只是一种“良好实践”,所以如果(x.Prop1==“test”&&x!=null)
这是一种值类型,您永远不会执行类似于
的操作,但这与此处无关。这只适用于引用类型。@Liam:我很抱歉我的不礼貌,但不正确的比较实际上毁掉了所有的工作;现在没问题了,所以我给+1(旁注:请更新,
ArgumentException
以及文本中的“value”和作为参数名的“value”)@Liam:它应该是
“value”
而不是
value
的值,而是一个字符串“value”。“set”提供的参数“value”会导致异常。这只是一个简单的练习,我相信我可以在同一个异常中检查null或空字符串,但这是您提出的一个有效点,我会记住这一点。谢谢
if (value != String.Empty && value != null)
{
   name = value;
}
else
{
    throw new ArgumentException("Name cannot be null or empty string", "value");
}
throw new ArgumentException("Name cannot be null or empty string", "value");
set
{
      if (!string.IsNullOrEmpty(value))
      {
            name = value;
      }
      else
      {
            throw new ArgumentException("Name cannot be null or empty string", "value");
      }
}
public string Name {
  get {
    return name;
  }
  set {
    if (null == value)
      throw new AgrumentNullException("value");
    else if (String.Equals(value, ""))
      throw new AgrumentException("Empty values are not allowed.", "value");

    name = value; 
  }
}
public string Name {
  get {
    return name;
  }
  set {
    if (String.IsNullOrEmpty(value))
      throw new AgrumentException("Null or empty values are not allowed.", "value");

    name = value; 
  }
}