首页 > 解决方案 > 获取未处理的异常:System.FormatException:当字符不包含在数组中时,字符串必须恰好是一个字符长

问题描述

我正在开发一个在控制台中运行的刽子手游戏,并尝试检查猜​​测的字母是否是存储在 char 数组中的单词的一部分。当我尝试运行它并输入一个正确的字母时,不会引发异常;但是,当我输入一个不属于该单词的字母时,我会收到一个 FormatException 说该字符串必须只有一个字符长。请记住,当我收到此异常时,我输入了一个字符。这是代码:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        Game game = new Game();
        if(game.CheckAnswer())
        {
            Console.WriteLine("true");
        }
        else if(!game.CheckAnswer())
        {
            Console.WriteLine("false");
        }
    }   
}

class Word
{
    public static string GetWord()
    {
        string[] words = new string[5]{"alpha", "bravo", "charlie", "delta", "echo"};
        Random random = new Random();
        return words[random.Next(5)];
    }
    public char[] correctAnswer = GetWord().ToCharArray();
}

class Game
{
    static char guessLetter;
    static List<char> correctGuesses = new List<char>();
    static List<char> incorrectGuesses = new List<char>();
    Word word = new Word();

    public bool CheckAnswer()
    {
        guessLetter = Convert.ToChar(Console.ReadLine());
        if (word.correctAnswer.Contains(guessLetter))
        {
            return true;
        }
        else if (!word.correctAnswer.Contains(guessLetter))
        {
            return false;
        }
        else
        {
            return false;
        }
    }

}

是的,我检查了其他答案,不,他们没有解决我的问题。

标签: c#console-application

解决方案


我的坏没有彻底检查你的代码。当您在 if else 情况下调用该方法时,它将运行它们。所以你检查了两次结果。

如果您输入的字母是错误的,它将在 if 和 else 两种情况下进行检查,这两种情况都会调用它两次。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        Game game = new Game();
        //dont call the method in if else save the result in a var first maybe
        Console.WriteLine(game.CheckAnswer());
    }   
}

class Word
{
    public static string GetWord()
    {
        string[] words = new string[5]{"alpha", "bravo", "charlie", "delta", "echo"};
        Random random = new Random();
        return words[random.Next(5)];
    }
    public char[] correctAnswer = GetWord().ToCharArray();
}

class Game
{
    static char guessLetter;
    static List<char> correctGuesses = new List<char>();
    static List<char> incorrectGuesses = new List<char>();
    Word word = new Word();

    public bool CheckAnswer()
    {
        guessLetter = Convert.ToChar(Console.ReadLine());

        //you can return the result directly
        return word.correctAnswer.Contains(guessLetter);
    }
}

推荐阅读