试图创建一个简单的Hangman游戏,从而读取外部文本(称为words.txt)并将其中的字符串导入到称为WordsArray的字符串数组中。
程序可以正常编译,但是,它要求我两次输入文件名,然后才能显示填充数组的内容(请参见下面的foreach循环)
有人可以确定为什么在显示之前要求我两次输入文件名吗?
(而且,更普遍地说,我的重构是否适合此简单应用程序?)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static string [] LoadWords()
{
bool repeat = true;
while (repeat)
{
Console.WriteLine("Please enter the name of a file:");
string filename = Console.ReadLine();
try
{
string[] WordsArray = File.ReadAllLines(filename);
if (WordsArray.Length == 0)
return null;
else
return WordsArray;
}
catch (FileNotFoundException msg)
{
Console.WriteLine("\n Check the file exists!");
}
}
return null;
}
static void DisplayWordsArray(string [] WordsArray)
{
foreach (string word in WordsArray)
Console.WriteLine(word);
}
static void Main(string[] args)
{
string[] WordsArray= new string[10];
if (LoadWords() != null)
{
Console.WriteLine("File Loaded...\n\n");
WordsArray = LoadWords();
DisplayWordsArray(WordsArray);
}
Console.ReadLine();
}
}
}
答案 0 :(得分:7)
这是因为您两次调用LoadWords()。
您应该写:
string[] WordsArray= LoadWords();
if (WordsArray != null)
{
Console.WriteLine("File Loaded...\n\n");
DisplayWordsArray(WordsArray);
...
答案 1 :(得分:0)
正如一些评论和Jesper的回答所提到的,重复性是由于两次调用函数LoadWords()
。这是导致错误的常见原因,并且往往是由于需要编写尽可能少的代码行(直接使用函数来消除变量声明和初始化)。
此外,在可以以其他方式处理错误时故意触发异常并非明智之举。请参见docs中的以下代码段:
对于可能发生但可能触发异常的条件,请考虑以避免异常的方式进行处理。
由于存在方法File.Exists()
用于检查文件的存在,因此使用它而不是预期异常是适当的。
START_EDIT:,因为文件可以被外部进程删除,锁定或以其他方式更改,因此,如@RufusL所述,请谨慎使用try...catch
块(另请参阅Eric Lippert的帖子{{3 }})。 Mea culpa! END_EDIT
最后,您的重构很好:让方法处理一件事情并妥善处理几乎总是最好的。
答案 2 :(得分:0)
将逻辑更改为仅回答一次问题,并处理已知的丢失文件的可能性。如果发生异常,请退出:
static string[] LoadWords()
{
string[] WordsArray = null;
Console.WriteLine("Please enter the name of a file:");
do
{
try
{
string filename = Console.ReadLine();
if (File.Exists(filename))
WordsArray = File.ReadAllLines(filename);
else
Console.WriteLine($"{Environment.NewLine} File does not exist, try again: ");
}
catch (Exception ex)
{
Console.WriteLine($"{Environment.NewLine} Unknown exception, exiting. {ex.Message}");
return null;
}
}
while (WordsArray == null)
return WordsArray;
}