【问题标题】:Unexplained null pointer reference, I'm blaming ghosts不明原因的空指针引用,我在怪鬼
【发布时间】:2023-03-21 17:12:02
【问题描述】:

我有以下代码:

public void DrawInput(string ChatCurrent){

        int uCursorTop;
        int uCursorLeft;
        uCursorLeft = Console.CursorLeft;
        uCursorTop = Console.CursorTop;
        Console.SetCursorPosition(0, uCursorTop);
        Console.Write("> "+ChatCurrent+" ");
        Console.SetCursorPosition(ChatCurrent.Length, uCursorTop);
    }

除了最后一行,它的行为正常。最后一行抛出System.NullReferenceException: Object reference not set to an instance of an object。奇怪的事?具体来说,访问ChatCurrent.Length 是导致它失败的原因。之前的那一行,它与字符串的内容相呼应,工作得很好。

发生了什么事?

【问题讨论】:

  • 这个函数怎么调用的,ChatCurrent的来源是什么?
  • 它是从主线程通过引用传递的,而主线程又在一个单独的类中初始化它。我发现了问题,这很愚蠢,请在下面查看我的答案,以便您知道为什么要将燃烧的狗粪邮寄到我家门口。
  • 输出前的那一行是什么?字符串连接不会抛出 null 值。

标签: c# mono monomac


【解决方案1】:

字符串连接会将null 值视为空字符串

在字符串连接操作中,C# 编译器将 null 字符串与空字符串相同,但它不转换值 原始空字符串。

http://msdn.microsoft.com/en-us/library/ms228504.aspx

但即使你将null 直接传递给Console.Write,它也不会抛出异常,它只会不写任何东西。

http://msdn.microsoft.com/en-us/library/zcwe8sfx%28v=vs.80%29.aspx

如果 value 是空引用(在 Visual Basic 中为 Nothing),则没有任何内容 写入,没有抛出异常。

【讨论】:

  • 这太荒谬了。 Console.Write 在我调用它时实际上会写出文本,但会注释掉包含ChatCurrent.Length 的行。我要疯了。
  • @sudowned:当然它会写文本:“> ”。而ChatCurrent.Length 会抛出异常,因为您无法访问空引用的属性。
  • 是的,它正在写文本我输入的文本应该在缓冲区中。这是愚蠢的,这完全是我自己的愚蠢,但是这不是你想的那样。看看我留下的答案。
【解决方案2】:

这是发生了什么:

我收到了上述错误。当我注释掉长度测量时,我输入了一些内容以查看文本是否也会导致错误。如果不行,我就把它放回去尝试其他实验。

我在测试时一直没有输入任何内容,这反过来意味着变量已声明但未初始化。我已尝试解决此问题 两个小时。

也就是说,以防其他人遇到此问题:确保您的变量已初始化。这与在此上下文中声明它一样重要。

【讨论】:

  • 所以这个答案的本质是你应该初始化一个变量以避免NullReferenceException?
  • 答案的本质是应该初始化一个变量以避免NullReferenceException,并且仅仅因为你认为一个变量被初始化并不意味着它是。
  • 必须初始化局部变量,否则代码无法编译,字段会被隐式初始化。这意味着在 C# 中无法读取未初始化的变量。
  • 变量不是本地的。它是从设置的主线程通过引用传递的,然后从另一个类加载它。
  • 答案的本质是应该多睡。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
相关资源
最近更新 更多