2014-10-12 3 views
2

Так что я немного новичок в кодировании C#, и обработка исключений не является одной из моих сильных сторон. Я пытаюсь написать игру в стиле палача, но у меня проблема при попытке выполнить программу. Я получаю сообщение необработанного исключения с текстом «Инициализатор типа для (filename) Form1 выбрал исключение». Я не совсем уверен, как найти, откуда происходит ошибка, кроме того, что я получаю сообщение в файле Program.cs. Я рассматривал здесь подобные проблемы, но ответы очень специфичны для конкретной проблемы. В моем случае мой код выглядит следующим образом:Инициализатор типа для Form1 выбрал исключение

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 

     //set label to blank 
     answerLabel.Text = ""; 

     //loop through each element in the array 
     for (int i = 0; i < guessThis.Length; i++) 
     { 
      //get each element as a question mark 
      string unknown = "?"; 
      //add each element as a "?" to the label 
      answerLabel.Text += unknown; 

     } 
    } 
    /*----------------------------------------------------------------------------------------------------------------------------------------------*/ 
    //initialize array from currentAnswer string 
    public static char[] guessThis = currentAnswer.ToCharArray(); 
    //create array of strings for answers 
    public static string[] randomAnswers = new string[10]{"beach", "sword", "sushi", "rat", "joy", "summer", "animal", "baseball", "toyota", "red"}; 

    //set up random 
    public static Random rand1 = new Random(); 
    //pick a random word from the answers array 
    public static string currentAnswer = randomAnswers[rand1.Next(0, randomAnswers.Length)]; 

    /*----------------------------------------------------------------------------------------------------------------------------------------------*/ 
    //guess button 
    private void button1_Click(object sender, EventArgs e) 
    { 
     //set a bool for if the user input contains only letters 
     bool containsLetter = textBox1.Text.Any(x => char.IsLetter(x)); 

     //checks if textbox length is not 1 character 
     if (textBox1.Text.Length != 1) 
     { 
      //display error 
      MessageBox.Show("Please enter one letter", "Error"); 
     } 

     //if user input is not a letter 
     else if (containsLetter != true) 
     { 
      //display error 
      MessageBox.Show("Please enter only letters", "Error"); 
     } 

     //if all conditions satisfied 
     else 
     { 
      //check if char array contains the user input 
      if (guessThis.Contains(Convert.ToChar(textBox1.Text))) 
      { 
       //get index of any element that contains the userinput 
       var getIndex = Array.FindIndex(guessThis, row => row.Equals(textBox1.Text)); 
       //set up another array with the values from the label 
       char[] unknownAnswer = answerLabel.Text.ToCharArray(); 
       //insert user input into the proper index of the char array 
       unknownAnswer[getIndex] = Convert.ToChar(textBox1.Text); 
       //update the label 
       answerLabel.Text = unknownAnswer.ToString(); 

      } 

     } 
    } 

} 

Благодарим за предоставленную помощь.

+0

Было бы еще несколько деталей с Исключением, вы можете рассказать мне о них? –

ответ

1

С ссылкой на Static Field Initializations # говорит

статическое поле инициализаторы переменная одного класса соответствует последовательности заданий, которые выполняются в текстовом порядке в котором они появляются в объявлении класса. Если в классе существует статический конструктор (раздел 10.11), выполнение статического поля инициализаторы происходит непосредственно перед выполнением этого статического конструктора . В противном случае инициализаторы статического поля выполняются в времени, зависящего от реализации, до первого использования статического поля этого класса.

Так что в вашем коде у вас есть эта статика поле

public static char[] guessThis = currentAnswer.ToCharArray(); 
public static string[] randomAnswers = new string[10]{"beach", "sword", "sushi", "rat", "joy", "summer", "animal", "baseball", "toyota", "red"}; 
public static Random rand1 = new Random(); 
public static string currentAnswer = randomAnswers[rand1.Next(0, randomAnswers.Length)]; 

guessThis происходит инициализацию из currentAnswer, но в тот момент, currentAnswer до сих пор не действует, так как он инициализируется из randomAnswers еще не инициализированы

Таким образом, вы можете просто перевести порядок инициализации следующим образом:

public static Random rand1 = new Random(); 
public static string[] randomAnswers = new string[10]{"beach", "sword", "sushi", "rat", "joy", "summer", "animal", "baseball", "toyota", "red"}; 
public static string currentAnswer = randomAnswers[rand1.Next(0, randomAnswers.Length)]; 
public static char[] guessThis = currentAnswer.ToCharArray(); 

Но мне действительно интересно, зачем вам эти статические поля. Вам нужны они в глобальном масштабе для каждого другого экземпляра вашей формы? Если не учитывать, что этот тип шаблона действительно не ясен для каждого будущего читателя этого кода, вы и я включили

Из частичного контекста, приведенного выше, ваш код также может быть написан без использования какой-либо статической переменной, только стандартного глобального экземпляра переменные уровня.

private Random rand1 = new Random(); 
private string[] randomAnswers = new string[10]{"beach", "sword", "sushi", "rat", "joy", "summer", "animal", "baseball", "toyota", "red"}; 
private char[] guessThis; 
private string currentAnswer; 

public Form1() 
{ 

    InitializeComponent(); 

    currentAnswer = randomAnswers[rand1.Next(0, randomAnswers.Length)]; 
    guessThis = currentAnswer.ToCharArray(); 

    //set label to blank 
    answerLabel.Text = ""; 

    //loop through each element in the array 
    for (int i = 0; i < guessThis.Length; i++) 
    { 
     //get each element as a question mark 
     string unknown = "?"; 
     //add each element as a "?" to the label 
     answerLabel.Text += unknown; 

    } 
} 
+0

Благодарим вас за подробное объяснение! Я знал, что это должен быть простой ответ, но понятия не имел, где искать. Поскольку вы объяснили это, это похоже на ладонь для меня. Кроме того, вы правы в отношении модификаторов общедоступного доступа. Я изначально планировал использовать эти поля во второй форме, но затем понял лучший способ. Благодаря! –