【问题标题】:Why I'm getting this exception?为什么我得到这个异常?
【发布时间】:2012-11-13 07:30:50
【问题描述】:

我正在尝试通过 Windows 窗体反转字符串,但由于任何原因,for 循环在我执行代码时出现异常。

System.NullReferenceException:对象引用未设置为对象的实例

Button_Click 事件

string input=textBox1.Text;
input=Convert.ToString(Console.ReadLine());
string output="";

if(textBox1.Text=="")
{
    MessageBox.Show("Sorry! You have not given any input for perform action");
}
else
{
    try{

        for(int i=input.Length-1; i>=0; i--)
        {
            output= output+input[i];
        }

            textBox2.Text=output;
            }

        catch(Exception ex)
        {
            MessageBox.Show(""+ex);
        }
    }
 }

虽然相同的逻辑与控制台应用程序完美配合。我知道我缺少非常基本的东西,但目前我没有想法。

【问题讨论】:

  • 你为什么同时使用 textbox.text 和 console.readline 的输入?
  • @MarcGravell 由于某些原因,我已经离开了我的编码实践,但现在我又回来了。你能用你的答案对我的代码给出更好的程序解释吗?
  • 您正在从 Windows 窗体应用程序的控制台中请求一个值。它只是在该类型的项目中不可用,因此您无法访问控制台对象并出现错误。
  • @avirk 我不明白你在评论中要问什么,超出了我已经写的内容......

标签: c# winforms exception


【解决方案1】:

在 winform 中,Console.ReadLine() 返回null(因为没有控制台)。同样,Convert.ToString((string)null) 返回null。而且您不能在null 上调用.Length(在for 中)。关键代码:

input=Convert.ToString(Console.ReadLine());
...
for(int i=input.Length-1; i>=0; i--)

另外,作为一个小问题:通过连接构建一个字符串是非常低效的。

【讨论】:

  • 该死,我真的很自鸣得意。然后我看到了你的回答。现在要哭了。
  • 是的,现在我知道我犯了什么错误。在 Windows 窗体中使用控制台非常愚蠢:P
【解决方案2】:

Marc 正确指出了您的错误。但我也将您的代码重构为(据我所知,您希望将反向输入放入 textBox2):

string input = textBox1.Text;

if(String.IsNullOrWhiteSpace(input))
{
    MessageBox.Show("Sorry! You have not given any input for perform action");
    return;
}

textBox2.Text = new String(input.Reverse().ToArray());

【讨论】:

  • 请注意,正确地反转字符串是很棘手的,并且不能简单地通过反转字符来完成,除非我们知道它没有使用组合标记/变音符号或代理对。但我承认,你所拥有的与问题相同。
  • @MarcGravell 同意,但这给了 OP 所需的输出:)
【解决方案3】:

我认为应该是:

output += input[i];

一个简单的方法就是这个方法

public static string ReverseString(string s)
{
    char[] arr = s.ToCharArray();
    Array.Reverse(arr);
    return new string(arr);
}

【讨论】:

  • 发布我的答案时只是输入错误,但在实际代码中与您建议的相同
  • @avirk 这就是复制/粘贴有用的原因;p
  • @MarcGravell 下次我会这样做:P
  • 请注意,正确反转字符串是很棘手的,并且不能通过反转字符简单地完成,除非我们知道它没有使用组合标记/变音符号或代理对。但我承认,你所拥有的与问题相同。
【解决方案4】:

input 可能没有值,或者可能只有一个元素,但您试图通过 input[1] 访问它,这意味着它的第二个元素会给您 NullPointer 异常。

output= output+input[1]; //I guess you did this by mistake

应该是这样的。

for(int i=input.Length-1; i>=0; i--)
    {
        output= output+input[i]; //Change '1' with 'i'
    }

希望这能解决问题。

【讨论】:

    【解决方案5】:

    你为什么在 WinForms 中使用Console 函数? 您的问题出在这一行,这会导致其他即将发生的错误。

    input=Convert.ToString(Console.ReadLine());

    这样改:

    string input=textBox1.Text;
    input=Convert.ToString(input); //However i don't think you even require this line
    

    【讨论】:

    • 15 分钟后,在我自己回答问题之前,我会先看一下投票率最高的答案。
    • textBox.Text 总是包含非空字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多