我只是想知道为什么编译器会给我这个错误。每次调用函数时都会执行try块,这意味着将分配变量。但它仍然不让我编译。
using System;
namespace Checking
{
class Program
{
static void Main(string[] args)
{
int intNum;
intNum = readValue("Please enter a number: ");
}
static int readValue(string strPrompt)
{
int intRes;
Console.WriteLine(strPrompt);
try
{
intRes = Convert.ToInt32(Console.ReadLine()); // Gets assigned here! But still doesnt allow me to compile!
}
catch (Exception ex)
{
Console.WriteLine("Please enter a numeric value.\n");
readValue(strPrompt);
}
return intRes;
}
}
}
将try int块中的返回intRes放入允许我摆脱该错误,但随后出现错误,说不是所有代码路径都返回一个值。我理解错误,但我仍然不明白为什么它不允许我编译,每次都会执行try块吗?
我也知道为intRes分配0将消除该错误。
此致
答案 0 :(得分:3)
因为如果尝试失败,则intRes没有值
在你的捕获中使用
intRes = readValue(strPrompt);
用
初始化它int intRes = 0;
而不是
int intRes;
您可能还想查看int.TryParse
语法
答案 1 :(得分:3)
如果Convert.ToInt32
失败,intRes
永远不会被分配到。
在创建变量时设置默认值,或在catch
块中指定。
答案 2 :(得分:3)
编译器是对的。并不总是分配变量。
如果转换失败,则分配永远不会发生,并且在catch块内继续执行,再次调用该函数,但是您忘记将该调用的返回值赋给变量:
catch (Exception ex)
{
Console.WriteLine("Please enter a numeric value.\n");
intRes = readValue(strPrompt);
}
以下是使用while
和TryParse
:
static int readValue(string strPrompt) {
int intRes = 0;
bool done = false;
while (!done) {
Console.WriteLine(strPrompt);
if (Int32.TryParse(Console.ReadLine(), out intRes) {
done = true;
} else {
Console.WriteLine("Please enter a numeric value.\n");
}
}
return intRes;
}
答案 3 :(得分:2)
如果intRes
引发异常,您将获得未初始化的Console.ReadLine()
。这就是你的编译器抱怨的原因。
答案 4 :(得分:1)
编译器无法知道try块中的代码是否会抛出异常 因此,如果您的代码抛出异常,则永远不会分配intRes变量。
因此编译器会发出错误消息。
另外,就目前而言,您的代码存在问题。您尝试在catch块内递归调用readValue以获取正确的值,但是当您的用户最终输入正确的值时,main将永远不会收到输入的值,因为您使用局部变量作为结果值。