C# 为什么我';我得到这个例外?

C# 为什么我';我得到这个例外?,c#,winforms,exception,C#,Winforms,Exception,我试图通过Windows窗体反转字符串,但由于任何原因,for循环在执行代码时出现异常 System.NullReferenceException:对象引用未设置为对象的实例 按钮点击事件 string input=textBox1.Text; input=Convert.ToString(Console.ReadLine()); string output=""; if(textBox1.Text=="") { MessageBox.Show("Sorry! You have not

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

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

按钮点击事件

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);
        }
    }
 }

而同样的逻辑在控制台应用程序中也能完美地工作。我知道我错过了最基本的东西,但现在我没有主意了。

在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--)
另外,还有一个小问题:通过串联构建字符串效率很低。

我认为应该是:

output += input[i];
一个简单的方法就是这种方法

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

input
可能没有值,也可能只有一个元素,但您正试图通过
input[1]
访问它,这意味着它的第二个元素将给您带来null指针异常

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'
    }

希望这能解决问题。

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


为什么在WinForms中使用
控制台
函数? 您的问题在这一行,这将导致其他即将发生的错误

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

更改为:

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

你为什么要对textbox.text和console.readline使用输入?@marcgravel由于某些原因,我一直在练习编码,但现在我又回来了。你能用你的答案对我的代码给出一个更好的程序解释吗?你是在从windows窗体应用程序的控制台请求一个值。它只是在那种类型的项目中不可用,因此您无法访问console对象,并且出现了一个错误。@avirk我不明白您在评论中提出了什么问题,除了我已经写过的内容之外……该死,我真的为弄明白这一点而沾沾自喜。然后我看到了你的答案。现在我要哭了。是的,现在我犯了什么错误。将控制台与Windows窗体一起使用是非常愚蠢的事情:在发布我的答案时,只是一个键入错误,但在实际代码中,它与您相同suggested@avirk这就是为什么复制/粘贴是有用的;p@MarcGravell下次我会这样做:请注意,正确地反转字符串是很棘手的,并且不能简单地通过反转字符来完成,除非我们知道它没有使用组合标记/变音符号或代理项对。但我同意,你的回答与问题相同。15分钟后,我会在自己回答问题之前浏览投票率最高的答案。textBox.Text始终包含非空字符串注意,正确反转字符串是很棘手的,而且不能简单地通过反转字符来完成,除非我们知道它没有使用组合标记/变音符号或代理对。但我同意你的观点,你的观点和这个问题是一样的。@MarcGravel同意,但这给出了OP想要的结果:)
string input=textBox1.Text;
input=Convert.ToString(input); //However i don't think you even require this line