【问题标题】:Need help with NullReferenceException在 NullReferenceException 方面需要帮助
【发布时间】:2010-09-29 17:05:29
【问题描述】:
DateTime mydt = new DateTime();
mydt = Convert.ToDateTime(com.Decrypt(Request.QueryString["Time"].ToString(), com.KeyCode.ToString()));

我做错了什么?它给出了 NullReferenceException。

【问题讨论】:

标签: c#


【解决方案1】:

嗯,很难准确地说出发生了什么,因为您在一个语句中就有很多内容。

作为调试的一个简单帮助,将该语句分成几个单独的语句 - 这样可以更轻松地找出问题所在。 (另请注意,您的初始值 mydt 无论如何都会在下一条语句中被覆盖,因此没有任何意义。)

以下是我将如何重写您的代码:

// This already returns a string... you don't need to call ToString() on it
string encryptedTime = Request.QueryString["Time"];
// We don't know what "com" is here...
string key = com.KeyCode.ToString();
string decryptedTime = com.Decrypt(encryptedTime, key);
DateTime mydt = Convert.ToDateTime(decryptedTime);

(我通常也会使用DateTime.TryParseExact,但那是另一回事。)

【讨论】:

  • 很好的例子说明为什么某种匈牙利符号是一件好事。如果变量 com 以一些应该包含的内容为前缀,那么它是可以理解的。 (我无法抗拒!)
  • @CesarGon:如果它只是用含糊的语义命名,那将是可以理解的。它真的不需要直接指明类型。这不像在论坛上发布 sn-ps 是代码的主要阅读环境。
  • 我并不是说应该使用前缀来指示变量本身的语言级别类型(int、string、DateTime...),而是指示变量应该包含什么的前缀.我同意你的观点,我们不需要直接指明类型。关于在论坛上阅读 sn-ps,我发现自己和我的同事比我想象的更频繁!
【解决方案2】:

当您尝试访问空引用的成员时会发生 NullReferenceException。

当您有一系列成员访问(使用“.”运算符)并且任何引用为空时,就会发生这种情况。

其中任何一个都可以为空:

com
Request.QueryString["Time"]
com.KeyCode

您可以通过在此行上设置断点来进行调试(单击该行,按 F9),然后将鼠标悬停在上述列表中的每个项目上。其中之一必然为空。

您可以通过以下方式重做代码,以便更轻松地阅读和调试此类问题:

DateTime mydt; // You don't need to initialize this with a new DateTime

if (com == null)
{
    // Do something else, since nothing below this will work
}

var keyCode = com.KeyCode;
var time = Request.QueryString["Time"];

if (keyCode == null || time == null)
{
    // Do something else, since nothing below this will work
}

mydt = Convert.ToDateTime(com.Decrypt(time.ToString(), keyCode.ToString()));

【讨论】:

    【解决方案3】:

    这里有很多可能的空引用,但最有可能的是时间查询字符串变量。确保它存在。

    另外,你的 com 变量设置了吗? com.KeyCode 呢?

    【讨论】:

      【解决方案4】:

      一些东西可以为空..

      com, Request.QueryString["Time"], com.KeyCode
      

      设置断点并找出;)

      【讨论】:

        【解决方案5】:

        您的一个对象为 null,当您尝试访问为 null 的对象的属性时,您会收到 NullReferenceException。 将代码分成多行并测试comRequest.QueryString["Time"]com.KeyCode 是否为空。

        【讨论】:

          【解决方案6】:

          NullReferenceException 发生在对具有空值或无效值的对象进行操作时。在对它们进行操作之前,您需要检查该对象是否具有有效值。

          如果你从任何检查它是否有效的东西中解析它,如果值无效,那么他在 .net 中将对象设置为 null

          【讨论】:

            【解决方案7】:

            正如它的名字所表明的,NullReferenceException 被抛出是因为你调用了 null 的方法或属性。

            因此,您需要在您正在测试的页面中调试该表达式以查看运行时哪个对象为空。

            我们没有足够的信息来直接回答您的问题。但是……

            1. 查询字符串中可能没有“时间”参数?

            2. 您的变量 com 可能为空?是否正确实例化?

            由于我们看不到您调用的是哪个页面,因此我们无法确定。

            所以启动 Visual Studio 并调试其中的表达式。它们中的任何一个都可能出于多种原因为空。

            NullReference 本质上意味着当该对象为空时,您正在使用对该对象的引用。

            【讨论】:

              猜你喜欢
              • 2011-01-27
              • 2014-02-06
              • 2017-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多