visual studio 2010 vb.netでの質問です。OpenTextFileWriter での書き込み処理時、エラーが発生した場合、Try,Catch ,FinallyのFinallyの部分でファイルをクローズしたいと思い以下のコードを書きましたが警告 「変数 'tw' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。」が発生してしまいます。ファイルを必ずクローズしたい(エラーが発生しても、しなくても)と思うのですが、どのようにコードを書けばうまくいくのでしょうか。お教えいただけるとありがたいです。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim wfileNamePath As String
Dim data As String
Dim tw As System.IO.TextWriter
wfileNamePath = "C:\test\test.txt"
Try
data = "abcd"
tw = My.Computer.FileSystem.OpenTextFileWriter(wfileNamePath, True, System.Text.Encoding.Default)
tw.WriteLine(data)
Catch ex As Exception
MsgBox("エラー発生")
Finally
tw.Close()
End Try
End Sub
End Class
> Dim tw As System.IO.TextWriter
Dim tw As System.IO.TextWriter = Nothing
> tw.Close()
If tw IsNot Nothing Then tw.Close()
とすればよい。
それよりUsing文で書くと簡単です。
Try
data = "abcd"
Using tw As TextWriter = My.Computer.FileSystem.OpenTextFileWriter(wfileNamePath, True, System.Text.Encoding.Default)
tw.WriteLine(data)
End Using
Catch ex As Exception
MsgBox("エラー発生")
End Try
※ End Usingで確実にDisposeが呼ばれるので、明示的にCloseする必要がない。
Usingステートメントで簡単、確実にファイルをクローズ
http://www.atmarkit.co.jp/fdotnet/vb2005/vb2005_05/vb2005_05_01.html
通常はTry-Finallyの代わりにUsingを使えば事足ります。
Using tw As TextWriter = My.Computer.FileSystem.OpenTextFileWriter(wfileNamePath, True, System.Text.Encoding.Default)
tw.WriteLine(data)
End Using
ただし,Catch節に相当するコードは書けないので,今回の場合は,Finally節を
Finally
If tw IsNot Nothing Then tw.Close()
End Try
とするのがよいでしょう。
# Try-CatchのTry節にUsingを入れてもよいですが。
お礼
なるほど、警告のでる原因はそれだったのですね。先程試したら、警告とれました。ありがとうございました。