2012-02-21 16 views
0

私はこのプログラムを動作させようとしていますが、実行しようとすると何も起こりません。私はデバッグしようとしましたが、TypeInitializationExceptionがあったので、修正プログラムをオンラインで探しましたが、何かを見つけることができませんでした。ここに私のコードです。プログラムはGUIであり、コンピュータは3つの文字(A、B、またはC)のうちの1つをランダムに10回選択し、どの文字が選択されたかを推測しようとします。ハイショアはファイルに保存され、そのファイルから読み込まれて表示されます。TypeInitializationExceptionのためプログラムを実行できません。修正方法がわかりません

助けを借りていただければ幸いです。あなたがTypeInitializationExceptionを取得している考える

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

、それはエラーが(このクラスではありません)、静的コンストラクタの内部、または静的フィールドの初期化中にいずれかの発生している意味(それそうです)。

上記のコードでは、2つの静的フィールドは両方ともFileStreamであるため、これらの初期化中に例外が発生している必要があります。あなたの他のコードが実行される前に

同じファイルを指している読書用ストリームと書込み用ストリームを作成しているのに気付かれることはありません。これは意図的なものですか?

例外の理由は、書き込み用にファイルを開くことです。デフォルトでは、これは別のファイルストリームと共有されません。次に、例外をスローしている同じファイルで、読み込みのために2番目のファイルストリームを開きます。それは本当に読んで、同じファイルに/から書き込むようにあなたの意図であるならば、あなたが共有セマンティクスを指定でき、他のコンストラクタのオーバーロードを使用する必要があります:

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

は、一般的にいえ話す - 私が持っ避けたいですこれらは静的フィールドとして扱われます。インスタンスプロパティを作成し、コンストラクタで初期化します。いくつかのバリアチェックを行い、間違ったときにデバッグする方がはるかに簡単です。

注:TypeInitializationExceptionは「特別」です。この例外が1回発生し、CLRが型の初期化に失敗した場合は、は常にになります。型にアクセスしようとするたびに取得します。

+0

これで修正できました。ありがとうございました! – Bya413

0

これは静的なコンストラクタによって発生します。静的フィールドの初期化も参照してください。

あなたが投稿したコードはそのような構成を示していません。あなたのプロジェクトのどこかを見てください。

関連する問題