由于TypeInitializationException,程序无法运行,不确定如何修复

时间:2012-02-21 17:29:45

标签: c#

我一直在尝试让这个程序运行,但是当我尝试运行它时,没有任何反应。我试图调试,它告诉我我有一个TypeInitializationException,所以我在网上寻找修复,但我找不到任何可以帮助我的东西。这是我的代码;程序是一个GUI,计算机随机选择三个字母(A,B或C)中的一个,并且用户试图猜测选择了哪个字母。高分裂被保存到文件中,并从该文件中读取并显示。

非常感谢任何帮助。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace HighScore
{

    public partial class Form1 : Form
{

    const string FILENAME = @"C:\\Guess\\Data.txt";
    static FileStream outFile = new FileStream(FILENAME, FileMode.Create, FileAccess.Write);
    StreamWriter writer = new StreamWriter(outFile);
    static FileStream file = new FileStream(FILENAME, FileMode.Open, FileAccess.Read);
    StreamReader reader = new StreamReader(file);

    string answer;
    string input;
    int writenum;
    string num;





    public Form1()
    {
        InitializeComponent();
    }

    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void label2_Click(object sender, EventArgs e)
    {

    }

    private void label3_Click(object sender, EventArgs e)
    {

    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {

        Random ranNumberGenerator = new Random();
        int randomNumber;
        int x;

        num = reader.ReadLine();
        writenum = Convert.ToInt32(num);
        label1.Text = "Score: " + writenum;
        label1.Visible = true;




        randomNumber = ranNumberGenerator.Next(1, 3);
        if (randomNumber == 1)
        {
            answer = "a";
        }
        if (randomNumber == 2)
        {
            answer = "b";
        }
        if (randomNumber == 3)
        {
            answer = "c";
        }
        if (textBox1.Text == "a")
        {
            input = "a";
        }
        if (textBox1.Text == "b")
        {
            input = "b";
        }
        if (textBox1.Text == "c")
        {
            input = "c";
        }

        if (answer == input)
        {
            label2.Text = "Correct! Computer guessed " + answer + " and you guessed " + input;
            label2.Visible = true;

            num = reader.ReadLine();
            writenum = Convert.ToInt32(num);
            writenum = writenum + 1;
            num = writenum.ToString();


        }


        for (x = 0; x < 10; ++x)
        {
            button1.Enabled = false;
        }
    }
}

}

2 个答案:

答案 0 :(得分:2)

鉴于你得到一个TypeInitializationException,它意味着错误发生在静态构造函数(这个类没有)中,或者在静态字段的初始化期间(它发生)。

在上面的代码中,两个静态字段都是FileStream,因此必须在初始化期间发生异常;在你的任何其他代码运行之前。

我不禁注意到您正在创建一个用于阅读的流和一个用于写入的流,两者都指向相同的文件 - 这是故意的吗?

异常的原因是您打开一个文件进行写入 - 默认情况下,它不会与另一个文件流共享。然后在同一个文件上打开第二个文件流进行读取 - 这会引发异常。如果您真的打算从同一个文件读取/写入,那么您需要使用其他构造函数重载来指定共享语义:

FileStream outFile = new FileStream(FILENAME, FileMode.Create, FileAccess.Write, FileShare.Read);
FileStream file = new FileStream(FILENAME, FileMode.Open, FileAccess.Read, FileShare.Write);

一般来说 - 我会避免将这些作为静态字段。使它们成为实例属性,在构造函数中初始化它们。做一些屏障检查会更容易,并在出错时进行调试。

作为注释:TypeInitializationException是“特殊的”;一旦你有一次这个例外并且CLR未能初始化类型,你每次尝试访问类型时总是获取它 - 它是“一次失败,总是失败”的情况

答案 1 :(得分:0)

这是由静态构造函数引起的。看一下静态字段初始化。

您发布的代码并未指明任何此类构造。看看你项目的其他地方。