• ベストアンサー

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

VB初心者です。色々調べてみたのですが分からなくて、ヒントでも結構ですので教えていただけないでしょうか。 現在VB.Net2003 からVB2005に移行しているのですが下記の関数で現在開いているフォームを調べていますがVB.Net2003だとなんら問題なかったのにVB2005では「関数 'FormIsLord_Tag' は、すべてのコード パス上では値を返しません。結果が使用されるときに、null 参照の例外が実行時に発生する可能性があります。」という警告が出てしまいます Function FormIsLord_Tag(ByVal GetTag As String) As Form Dim LoopForm As Form Try For Each LoopForm In Forms If LoopForm.Tag = GetTag Then Return LoopForm End If Next Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Function If LoopForm.Tag = GetTag Then とかの前にLoopFormがNothingだったらとか色々やってみましたがわからなくて・・・ 警告なので動かないって訳ではないのですが・・・ よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

お世話になります。 ロジックの内容をアタマの中で フローチャート化してみると、 明示的に値を返していないパスがあるはずです。 「意識していないかもしれませんが、 このような可能性がありますよ」という警告だと思います。 Nothing を返すことを意識しているのであれば 明示的に書いてやると、この警告は消えます。 End Try の後に、 Return Nothing と書くと、 Forms が空っぽでも、 例外処理の Cacth ブロックに入ったときでも、 For Each ループ内で tag が該当しなくても Nothing が明示的に返されます。

wingtodo
質問者

お礼

回答ありがとうございます! 消えました! 勉強になりましたありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

if で条件が合致した時に return していますけど、 ループが終了した時までにreturn がされていない場合、 return で値が明示的に返されていませんよということです。

wingtodo
質問者

お礼

回答ありがとうございます! 勉強になりましたありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • vb2005,my.computer.pingがうまくいかない

    WindowsXPHome、VS2005beta2日本語版です。 開発スタイルにVBを選択し、プロジェクトの作成時にWindowsApplicationを選択し、 FormにButtonをひとつ貼り付け、そのClickイベントに以下のように書きました。 Public Class Form1  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Try    If My.Computer.Network.Ping("www.google.com", 1000) = True Then    MessageBox.Show("成功")   Else    MessageBox.Show("タイムアウト")   End If   Catch ex As Exception    MessageBox.Show(ex.Message)   End Try  End Sub End Class この結果が必ず「タイムアウト」となってしまいます。 ためしに「www.google.com」を「localhost」とすると「成功」となります。 ネットへの通信が新しいアプリケーションから発生すれば、PFWが感知して接続の許可を求める ウィンドウが出るはずですが、そもそも通信が発生していないのか、そういったウィンドウはでません。 ログにも、通信をブロックしたとも、許可したとも何も残っていません。 また、PFWを終了させても、結果は同じでした。ですから、原因はVB側にあると思っているのですが。 どこがまずいのでしょうか?

  • 0除算の例外処理ができない!!助けて!!

    0除算の例外処理ができない!!助けて!! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try If (Flag = "数値") Then Flag = "演算子" Work = Total + Calc + Input Total = js.Eval(Work) Input = "" TextBox1.Text = Total End If Catch ex As Exception MessageBox.Show("Exception Error : 0除算を行いました。") End Try ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Total + Calc + Inputは、すべて文字列です。 実行すると、ポップアップではなく、テキストエリアにこんな文字列が・・・ 0除算しても例外が発生しない・・・ 0 / 0 ・・・NaN (非数値) 1 / 0 ・・・+∞ そもそも、0除算ってなんですか??? 0で割っても例外が出ない!!

  • リストボックス 何も洗濯されてない場合はNullではなく""?

    VB2008です。 フォームにリストボックスを設置し、何も選択せずに コマンドボタンを押すと下記のコードのとおり動くようにしているのですが Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If IsNothing(ListBox1.Text) = True Then MessageBox.Show("選択してください(Null)") ElseIf (ListBox1.Text) = "" Then MessageBox.Show("選択してください(空白)") Else MessageBox.Show(ListBox1.Text) End If End Sub 「選択してください(空白)」が返ってきます。 ということは何も選択していないときはNULLではなく""なのでしょうか?

  • 文字の点滅

    すいません、VB.Net2003の初心者です。 いろいろ調べたのですが解らないので教えてください。 VB.Net2003 SQLServer2000という環境なんですが Form1に Private Sub Timer1_Tick(・・・ lblMessage.Visible = Not lblMessage.Visible End Sub Private Sub Form1_Load(・・・ Me.Timer1.Start() End Sub と書いて単独で開くとちゃんとメッセージは点滅するのですが、これに Private Sub From1_Activated(・・・ Dim Form2Form As New Form2 Application.DoEvents() Dim strSQL As String Dim intRemainder(4) As Integer Dim i As Integer For i = 1 To 3 strSQL = "SELECT COUNT(TelW) AS RemainderCount " strSQL &= "FROM dbo.ma_Customer " strSQL &= "WHERE (CallDayNo1 IS NULL) AND " strSQL &= "(CallNo" & i & " > 0)" Try cmd = New SqlCommand(strSQL, Cn) intRemainder(i - 1) = cmd.ExecuteScalar Catch ex As Exception Dim strMsg As String = Err.Number & ex.ToString MessageBox.Show(strMsg) End Try cmd = Nothing Next Me.Hide() With Form2Form .lblNo1.Text = intRemainder(0).ToString("#,##0") .lblNo2.Text = intRemainder(1).ToString("#,##0") .lblNo3.Text = intRemainder(2).ToString("#,##0") .ShowDialog() End With Me.Close() End Sub というコードを加えてループ処理を実行している間メッセージを点滅させたいのですが点滅しません。どう書いたら良いのでしょう?

  • セルの内容更新時に実行される処理ができない

    以下のように関数を設定し、実行してみたのですがCall CommonModule.testの部分で 実行時エラー '424': オブジェクトが必要です。 と表示され関数が実行されません。 初心者なので知識が浅く、初歩的なミスかもしれませんがご教示いただければ幸いです。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range) If target.Count = 1 Then Dim column As Integer Dim row As Integer column = target.column row = target.row If row >= 3 Then If ((column - 3) Mod 5) = 2 And column > 3 Then Call CommonModule.test 'エラー '424' オブジェクトが必要です。 End If End If End If End Sub Function test() MsgBox "test" End Function

  • VB.netでDLLを読み込んで実行する際に、スタックを不安定にしていますというエラーが出ます。

    いつもお世話になります。 掲題の通り、VB.net上からDLLの関数を呼び出したいのですが、 「PInvoke 関数 がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを確認してください。」 というエラーメッセージが出力されます。 ソースコードは以下の通りです。 Public Class Form1 Private Declare Sub PrintShmLog Lib "XXXX.dll" (ByVal iTaskId As Long, _ ByVal iLevel As Long, _ ByVal pMsg As String) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim iTskNo As Long = 1 Dim iLevel As Long = 0 Dim str As String = "★★★" Try Shell("XXXXXX.exe", vbHide) PrintShmLog(iTskNo, iLevel, str) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub End Class 原因を追いようが無くて困っています。 どなたかご存知の方がいらっしゃいましたらご教授ください。

  • FORM1の値を参照する場合について

    質問します。 FORM1を作成し、そこにTextbox1に値を何か入れた場合に、その値をチェック関数を新しいクラス(check.vb)にてチェックする場合にどのようにFORM1のTextbox1の値を参照すればよろしいのでしょうか? public function Check() AS Boolean Dim FORM AS NEW FORM1 Msgbox(FORM.Textbox1.text) end function 上記のようなチェック処理をしても空が表示されてしまいます。何方かご教授お願い致します。

  • Nullについて

    こんばんは!よろしくお願いします。 新規に作成したフォームにコンボボックスを設置して Sub test1() If Form_フォーム1.コンボ0.Value = Null Then Form_フォーム1.コンボ0.Value = "" End If MsgBox Form_フォーム1.コンボ0.Value End Sub Sub test2() If IsNull(Form_フォーム1.コンボ0.Value) = True Then Form_フォーム1.コンボ0.Value = "" End If MsgBox Form_フォーム1.コンボ0.Value End Sub 上記2つのサンプルを実行した時に、 test1のほうだけ 実行時エラー94 Nullの使い方が不正です。 となります。 ウォッチウインドウで見ていくと、 「オブジェクト変数、またはwithブロック変数が設定されていません。」 となりますが 「If Form_フォーム1.コンボ0.Value = Null Then」 を通過したら Nullになります。 何が起こっているのでしょうか?

  • Form1上にあるTextBox1を Module1.vbから参照したい

    初歩的なことで、すいません・・・ 以前、覚えていたのですが、ド忘れしてしまいました。 タイトルどおりで、Form1上に配置したTextBox1を、Module1.vb内に書いた関数内で用いるには、TextBox1のみの記述だと、ビルドエラーとなります。 他のモジュールから、Form1上に配置したTextBox1を見るには、どのように指定するのか、ご教授下さい。 よろしくお願いします。 ----------以下だと"TextBox1"のところでエラーとなる---------- <Module1.vb> Sub xxxxx()  If TextBox1.Text = "0" Then   ・・・・  End If End Sub

  • VB TEXT読み取りについて

    このコードでのデバックは成功したのですが、TEXTBOX1にファイルネーム C:\Users\???\Documents\???と入力しても’パスが拒否されました’と出てしまいます。 どう解決したらよいのでしょうか、宜しくお願いします。 Public Class Form1 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sr As System.IO.StreamReader = Nothing Try Dim file As String = TextBox1.Text sr = New System.IO.StreamReader(file, System.Text.Encoding.GetEncoding("shift_jis")) Dim doc As String = "" Do Until sr.EndOfStream doc &= sr.ReadLine & vdcrlf() Loop TextBox2.Text = doc Catch ex As Exception MessageBox.Show(ex.Message, "read") Finally If sr IsNot Nothing Then sr.Close() sr.Dispose() End If End Try End Sub Private Function vdcrlf() As String Throw New NotImplementedException End Function End Class