プロが教える店舗&オフィスのセキュリティ対策術

VBを勉強中です。
段階としては書籍やサイトの見本プログラムを
いくつか真似て作っているところです。

VB6で作られたプログラムのバージョンアップを
行う作業で、VB6→VS2005アップグレード完了後、
ビルドは完了するものの以下の警告が発生します。


変数 'int_d_sh' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。


「int_d_shが宣言された後、If int_d_sh = "PSUP" Thenまでの間で
If int_d_shに値が入っていないのが原因なのでしょうか?」

「又、それが原因かどうかはわからないのですが
デバッグ中に下記の例外エラーメッセージが発生し
デバッグが完了しませんでした。」


[InvalidOperationExceptionはハンドルされませんでした。]
フォームの作成中にエラーが発生しました。詳細については、Exception.InnerException を参照してください。エラー: System.Security.Permissions.SecurityPermission


「詳細を表示したのですが、どこを参照すれば良いのか
わかりませんでした。
どうすれば解決するのでしょうか?
以下は例外エラーが示したコード部分です。
よろしくお願いします。」


<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>Partial Class frm○○(プロジェクト名)
#Region "Windows フォーム デザイナによって生成されたコード "
<System.Diagnostics.DebuggerNonUserCode()> Public Sub New()
MyBase.New()
'この呼び出しは、Windows フォーム デザイナで必要です。
InitializeComponent()
End Sub

A 回答 (4件)

「変数 'int_d_sh' は、値が割り当てられる前に使用されています。

Null 参照の例外が実行時に発生する可能性があります。」

VBしか使ったことが無ければ判らないかもしれませんが、C/C++ではおなじみの警告文です。
VB6までは変数を宣言すると自動的に初期化される仕様でした。(この仕様のために宣言時に初期値の設定ができなかった)
だから変数に値を代入せずにいきなり使用してもエラーにはなりませんでした。
しかし、VB.NETになってからは変数の宣言時に初期化しなくなりました。(その代わりに初期値を設定できる)
そのために、変数を宣言しただけでは変数にはゴミが入っています。
ゴミの状態によっては、その変数のデータ型では許可されないようなデータ(ビットパターン)になる可能性があります。
そんな状態でその変数を参照するとエラー(Null参照は一例)になったりします。(しかもエラーの原因が判らないことがある)

そういうエラー発生を防ぐために上記の警告文がでてきます。
対策としては、宣言時に初期値を入れたり、参照前に値の代入を行います。
    • good
    • 0
この回答へのお礼

C/C++ではよくある警告なのですね。
変数 'int_d_sh' についてはお蔭様で解決しました。
ありがとうございました。

お礼日時:2008/06/17 12:35

>「int_d_shが宣言された後、If int_d_sh = "PSUP" Thenまでの間で


>If int_d_shに値が入っていないのが原因なのでしょうか?」
そうです。
ソースコード上で見えないだけで、実際には使用される前に確実に値が入るのが
分かっている場合は、警告が出ても致命的な問題ではないです。
ですが、そのまま警告を残しておくのも あまり良くないので、既に出てきていますが
変数を特定の値で初期化してしまいましょう。
Dim xxx As xxx = xxxxx
みたいな書き方です。この書き方は、VB6ではConst(定数)の定義でしか
出来ませんでしたが、VB.NETでは変数の初期化にも使えます。Object参照も
変数定義の時点で出来ます。
.NETでは、なるべく変数は初期化するクセをつけた方がいいかもしれませんね。

>[InvalidOperationExceptionはハンドルされませんでした。]
こちらについては、はっきりとは分からないのですが、
Designer.vb内の情報でエラーになっていますので、恐らく.NETへのコンバートが
うまく出来ないコントロールを使っているとか、VB6にも.NETにも存在するコントロールだけど
コントロールのプロパティとかメソッドとかに違いがあって、うまくコンバートできなかった
のかなぁ、という気がします。
可能であれば、VB6で怪しいと思う(?)コントロールを削除してみてから、
2005にアップグレードしてみれば、エラーが無くなるかもしれません。
(InitializeComponentの中のような気がするけど、中のどこで止まったかが分かれば
 判断しやすいんですけどね…)
    • good
    • 0
この回答へのお礼

変数 'int_d_sh' についてはエラー解消されました。
ありがとうございます。

>[InvalidOperationExceptionはハンドルされませんでした。]
こちらについては勉強不足なのですね。。。
みなさんのアドバイスがよく理解できません。
VB6のソフトは手元にないので、コントロールの削除?
(コンポーネントトレイに貼りつくアレのことでしょうか)ができません。。。

お礼日時:2008/06/17 12:38

「変数 'int_d_sh' は、値が割り当てられる前に使用されています。

Null 参照の例外が実行時に発生する可能性があります。」

VB.NET 2005 では コンパイラオプションで 変数の割り当ては
明示的に使用する前に宣言しないとエラーになると思います。
IFなどで条件で宣言部分を行っていませんか?
もしくは勘違い ローカルとPUBLIC変数の混同など・・・
動的に意図的に使用する場合はこのオプションをはずせばよかったとおもいます。

それと、画面のデザインはVB.NET では コードで表示されれます。
オブジェクト定義やプロパティなど・・・
ですからエラー箇所のデザイン部分の定義をコメントアウトしてコンパイルが通るかどうかといった試行錯誤しながら判断してみてはいかがでしょうか? 原因がわかるかもしれません。

VB6でのコンバートは経験がないので参考意見ですがよろしくです。
    • good
    • 0
この回答へのお礼

使用する前に変数 'int_d_sh' を宣言し、エラーは消えました。
ありがとうございました。

お礼日時:2008/06/17 12:34

デバッグモードで実行してみたのでしょうか?



コンバートの際の警告と今回の例外とは直接関係無いかもしれません
Null参照の例外なら NullReferenceExceptionが発生するはずですから
    • good
    • 0
この回答へのお礼

返事が遅れてしまい申し訳ありません。

デバッグモードでの実行です。

直接的に関係ないのでしょうか・・・

お礼日時:2008/06/16 16:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!