1

構造体から値を返そうとすると、「null参照例外」が発生します。

コードは次のとおりです。

AssetItem item = new AssetItem(); 

        item = initModified();

        bool found = false;
        int index = getIndex(barcode);
        string modifiedFile = filepath + "Modified\\" + dir + "\\" + index + ".asdt";

        if(File.Exists(modifiedFile))
        {   
            using(StreamReader reader = new StreamReader(modifiedFile))
            {
                string line = reader.ReadLine();
                while(line.Trim()!="")
                {
                    string[] split = line.Split(',');
                    if(split[1]==barcode)
                    {
                        found = true;
                        break;
                    }
                    line = reader.ReadLine();
                }
                reader.Close();
            }
        }

        if(found)
        {
            item.modified = true; 
        }
        else
        {
            item.modified = false;
        }


        return item;

そのitem.modified=falseを含むサブを呼び出すことによってアイテムを初期化します。ファイルが存在することを確認した後、ストリームリーダーを使用して、特定の行が検出されて停止するまで、ファイルの行を1つずつ読み取りました。問題は、ファイルが存在するかどうかをチェックし、特定の行が見つからない場合です。アイテムをfalseに初期化し、行が見つからない場合はfalseに設定するのが難しい場合でも、nullを返します。注:これはめったに発生せず、他のファイルにアクセスして読み取る場合や、同じファイル内でnullを返す場合でも正常に機能します。

注:私が遭遇した別の問題は、それが読み取る行をスキップすることです。

これの原因は何でしょうか?

4

3 に答える 3

7

そして、ファイルの終わりはReadLine()nullを返します-そして、チェックせずにそれを呼び出します.Trim()(アイテムがそこになく、ファイルを最後まで読んだシナリオでは)-したがって、nullチェックを追加する必要があります(また、私は移動したReadLineので、一貫して発生することに注意してください):

using(StreamReader reader = new StreamReader(modifiedFile))
{
    string line;
    while((line = reader.ReadLine()) != null && line.Trim() != "") {
        ...
    }
}

上記のコード(あなたのコードに基づく)は最初の空の行で終わることに注意してください。個人的には、おそらく空の行をスキップします。

using(StreamReader reader = new StreamReader(modifiedFile))
{
    string line;
    while((line = reader.ReadLine()) != null) {
        if(line.Trim() == "") continue;
        ...
    }
}
于 2010-11-08T09:25:31.173 に答える
1

私があなたのコードで見つけることができる1つの問題は、次の行が必要ないということです。

reader.Close();

using自動的にこれを行います。

EndOfStreamさらに、ラインをトリミングするのではなく、ループ状態をチェックする必要があります。

つまり、コードを次のように変更します。

using(StreamReader reader = new StreamReader(modifiedFile))
{

    while(!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        string[] split = line.Split(',');
        if(split[1]==barcode)
        {
            found = true;
            break;
        }
    }
}
于 2010-11-08T09:28:35.847 に答える
0

ちなみに、なぜ新しいインスタンスを作成し、それを目的に使用せずに再割り当てするのか。

AssetItem item = new AssetItem();  
item = initModified();

になる可能性があります

AssetItem item =  initModified();
于 2010-11-08T11:08:45.720 に答える