C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

String”” から型 'Integer' への変換は無効 /たかし (20/02/14(Fri) 23:59) #93869
Re[1]: String”” から型 'Integer' への変換は無効 /魔界の仮面弁士 (20/02/15(Sat) 01:26) #93870
  └ Re[2]: String”” から型 'Integer' への変換は無効 /たかし (20/02/16(Sun) 11:14) #93873
    └ Re[3]: String”” から型 'Integer' への変換は無効 /魔界の仮面弁士 (20/02/16(Sun) 12:03) #93874
      └ Re[4]: String”” から型 'Integer' への変換は無効 /たかし (20/02/17(Mon) 14:41) #93894
        └ Re[5]: String”” から型 'Integer' への変換は無効 /shu (20/02/18(Tue) 14:51) #93910
          └ Re[6]: String”” から型 'Integer' への変換は無効 /たかし (20/02/23(Sun) 14:44) #93937
            └ Re[7]: String”” から型 'Integer' への変換は無効 /魔界の仮面弁士 (20/02/23(Sun) 15:30) #93939


親記事 / ▼[ 93870 ]
■93869 / 親階層)  String”” から型 'Integer' への変換は無効
□投稿者/ たかし (42回)-(2020/02/14(Fri) 23:59:14)

分類:[.NET 全般] 

たかしです、VB.NETの質問です。

フォームのShowメソッドとCloseのメソッドで次のような原因不明のエラーダイアログが出ます。
「String”” から型 'Integer' への変換は無効です。」
エラーダイアログのOKボタンを押すと何事もなく次へ進みます。
何が原因なのか、それが全く分かりません。
エラーコードも何も表示されないメッセージで、トラップしようにもやり方が分かりません。
というのも、このエラーが出る原因と思しき処理すなわち「空文字を数値に変換する処理」など行なってもいないのですから。
面倒くさいので、そもそも「このエラーを出さないようにする」ような便利なコードはないものでしょうか?

どなたかお願いします。たかし


[ □ Tree ] 返信 編集キー/

▲[ 93869 ] / ▼[ 93873 ]
■93870 / 1階層)  Re[1]: String”” から型 'Integer' への変換は無効
□投稿者/ 魔界の仮面弁士 (2556回)-(2020/02/15(Sat) 01:26:04)
No93869 (たかし さん) に返信
> 「String”” から型 'Integer' への変換は無効です。」

実行時エラーのメッセージ通り、いわゆる型変換エラーですね。(InvalidCastException)

単純なところで言えば、
 Dim count As Integer = ComboBox1.Text
のようなコードでも発生する可能性がありますが、
イベント連鎖や依存モジュールなど、わかりにくい所で発生している
可能性もあるので、現時点では何とも言えません。


> というのも、このエラーが出る原因と思しき処理すなわち「空文字を数値に変換する処理」など行なってもいないのですから。

行っていなければエラーになるわけがないので、どこかで行われているのは間違いないでしょう。

エラー箇所が特定できないのであれば、My Project のプロパティから [コンパイル] タブを開いて、
コンパイル オプションの Option Strict を On にしてみてください。

その状態でコンパイルエラーが発生する箇所が幾つかあると思いますが、
データ型の指定ミスを直していけば、コンパイルエラーが消えますので、
InvalidCastException の実行時例外になる可能性を減らせるでしょう。


> トラップしようにもやり方が分かりません。

My Project のプロパティから [アプリケーション] タブを開いて、
[アプリケーション イベントの表示] から、MyApplication の
UnhandledException イベントを登録してみてください。

そのイベント引数 e から e.Exception.StackTrace を調べれば、
発生個所を見つける手掛かりになるかも。
[ 親 93869 / □ Tree ] 返信 編集キー/

▲[ 93870 ] / ▼[ 93874 ]
■93873 / 2階層)  Re[2]: String”” から型 'Integer' への変換は無効
□投稿者/ たかし (43回)-(2020/02/16(Sun) 11:14:39)
No93870 (魔界の仮面弁士 さん) に返信


魔界の仮面弁士さま、いつもありがとうございます。

コンパイル オプションの Option Strict を On にしてみたところ、思ったよりも多くのエラーが生じていましたが、
エラーの箇所にカーソルを持っていくと修正の候補が表示されますので、意外と簡単にそれらの修正が出来ました。
そのようにして、全てのフォームのコードをしらみつぶしに直していきました。
しかし「遅延バインディングを使用できません。」エラーについては修正の方法が分からず、
仕方ないのでとりあえずOption Strict を Offにすることにしました。

そして多分これで何とかなるだろうとデバッグしてみました。
ところが相変わらず「String”” から型 'Integer' への変換は無効です。」が出るのです。
一体何がいけないのでしょうか?

またご指摘の中で、

>My Project のプロパティから [アプリケーション] タブを開いて、
>[アプリケーション イベントの表示] から、MyApplication の
>UnhandledException イベントを登録してみてください。
>
>そのイベント引数 e から e.Exception.StackTrace を調べれば、
>発生個所を見つける手掛かりになるかも。

このところがいまいち理解できません。
分かり易く説明していただけないでしょうか?
よろしくお願いいたします。

[ 親 93869 / □ Tree ] 返信 編集キー/

▲[ 93873 ] / ▼[ 93894 ]
■93874 / 3階層)  Re[3]: String”” から型 'Integer' への変換は無効
□投稿者/ 魔界の仮面弁士 (2557回)-(2020/02/16(Sun) 12:03:58)
No93873 (たかし さん) に返信
> しかし「遅延バインディングを使用できません。」エラーについては修正の方法が分からず、

エラーになっている部分は、どういうコードになっていますか?
それを伝えてもらわないことには、修正案を提示することもできません…。


基本的には、Object 型に対してプロパティやメソッドを呼び出すのではなく、
明示的なデータ型に変換してからプロパティやメソッドを呼ぶようにします。

どうしても Object 型から呼び出す必要がある場合には、CallByName を使うことで対処できます。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/early-late-binding/calling-a-property-or-method-using-a-string-name

また、今回はエラーの発生源を辿るために、プロジェクト全体に対して Option Strict を指定しましたが、
各 .vb ファイルの先頭に Option Strict On / Option Strict Off を記述するようにすれば、
「どうしても遅延バインディングが必要」なファイルのみ、この強い型制限を解除することができます。


> ところが相変わらず「String”” から型 'Integer' への変換は無効です。」が出るのです。
> 一体何がいけないのでしょうか?

まぁ、それを調べられるのは、実際のコードを試せるたかしさん自身しかいないわけで…。

で、今はその「何がいけないのか」を突き止めるために、発生源を探ろうとしているわけですよね。
原因がわからなければ、対処のしようもないわけですから。


例外時にメッセージが表示されるものの、一時停止することなく続くようであれば、
DataGridView が出す既定のエラーダイアログのように、使用している何らかのコントロールが
内部的にエラーを表示しているのかもしれません。

あるいは非同期処理を実装しているなど、UI スレッドとは別のワーカースレッドを用いていたために、
UI スレッド側で Try〜Catch するだけでは、例外をとらえきれていないという状況なのかもしれません。


ただ原因は不明とはいえ、ひとまず Show や Close で起きてしまうという、「再現性」があるのなら、
おそらく、問題となっていそうなフォームが何であるかは把握できているのだと推察します。
となれば、よくある対処法としてこういった手腕が思い当たります。

・コンストラクタ、Load、Shown、FormClosing、FormClosed などに追加の処理が書かれていたら、
 それらのコードを一時的にコメントアウトしてみて、エラーの発生が変化するかを確認してみます。

・いずれかのコントロールが原因である可能性を考慮し、該当フォーム上のコントロールを一旦削除してみます。
 もちろん、そのコントロールを読み書きしていた箇所も削る必要がありますが、コントロールを削除したことで
 エラーが止まるなら、どのコントロールが原因であったものと推定できるので、削除範囲を狭めていくことで
 問題個所を絞り込んでいけるでしょう。

・思い当たる個所をすべて除去してみて、それでもエラーが続くようならば、今度は、
 新規プロジェクトで実験用のフォームを用意し、そこに、既存コードで行っていた処理内容を
 単純化した最低限の実装を用意し、エラーの再現性を調べるようにします。


あるいは、データバインドが原因であるケースもあるかもしれません。

設定情報を App.config に設定情報を用意して、 My.Settings.何某 を通じて読み書きすることがありますが、
https://dobon.net/vb/dotnet/programing/mysettings.html
この設定情報をデザイン時にバインド設定すれば、コードを書かずとも、自動的に読み書きできます。
http://hanatyan.sakura.ne.jp/vb2005/vb2013application06.htm

で、Integer な項目に対して、から文字列なデータがバインドされようとしてエラーになっている、とか…。



>> UnhandledException イベントを登録してみてください。
>> そのイベント引数 e から e.Exception.StackTrace を調べれば、
>> 発生個所を見つける手掛かりになるかも。
> このところがいまいち理解できません。

Try〜Catch されなかった例外は、
 Application.ThreadExceptionイベント
 AppDomain.UnhandledExceptionイベント
 My.Application.UnhandledExceptionイベント
としてとらえられるようになっていますので、そこに通知されないかを確認してみてください。
https://dobon.net/vb/dotnet/programing/unhandledexception.html

ここで通知されていないようなら、発生した例外がメッセージとして表示された後、
再スローされることなく、どこかで握りつぶされている可能性が高いです。

一方、発生した例外をとらえることができた場合には、その例外がどこで起きたのかを追跡するために、
StackTrace を確認することができます。InnerException がセットされている場合は、そちらも手掛かりになるでしょう。
[ 親 93869 / □ Tree ] 返信 編集キー/

▲[ 93874 ] / ▼[ 93910 ]
■93894 / 4階層)  Re[4]: String”” から型 'Integer' への変換は無効
□投稿者/ たかし (44回)-(2020/02/17(Mon) 14:41:01)
No93874 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さま、レスをありがとうございます。

魔界の仮面弁士さまのご提示されたバグ潰しの手順は、出来れば避けて通りたいものとして、
私の頭の中にも漠然とあったものですが、それをまさに具体的に示されたものと感じています。
やっぱりこれしか方法はないのかなあ、というのが率直なところです。
「String”” から型 'Integer' への変換は無効です。」というエラーは、
メッセージ自体の「ウザったさ」以外これと言って「実害」の無いエラーだと思います。
しかしその反面「On Error Resume Next」でやり過ごすことも出来ないような、たちのわるいエラーだと思います。
いずれにしてもしばらく時間のかかる作業となりそうです。
結果が出ましたらご報告を申し上げます。では

[ 親 93869 / □ Tree ] 返信 編集キー/

▲[ 93894 ] / ▼[ 93937 ]
■93910 / 5階層)  Re[5]: String”” から型 'Integer' への変換は無効
□投稿者/ shu (1219回)-(2020/02/18(Tue) 14:51:55)
No93894 (たかし さん) に返信
> しかしその反面「On Error Resume Next」でやり過ごすことも出来ないような、たちのわるいエラーだと思います。
> いずれにしてもしばらく時間のかかる作業となりそうです。
On Error Resume Nextではなくて
try
実際の処理
catch ex as exception
end try
の形にしてみれば、ex as exceptionの箇所でブレークしexをウォッチすれば発生個所が大分みえてくると思います。
[ 親 93869 / □ Tree ] 返信 編集キー/

▲[ 93910 ] / ▼[ 93939 ]
■93937 / 6階層)  Re[6]: String”” から型 'Integer' への変換は無効
□投稿者/ たかし (45回)-(2020/02/23(Sun) 14:44:07)
No93910 (shu さん) に返信

まず魔界の仮面弁士さま、経過の報告をいたします。

>・コンストラクタ、Load、Shown、FormClosing、FormClosed などに追加の処理が書かれていたら、
> それらのコードを一時的にコメントアウトしてみて、エラーの発生が変化するかを確認してみます。

そのようにしてみました。

>・いずれかのコントロールが原因である可能性を考慮し、該当フォーム上のコントロールを一旦削除してみます。
> もちろん、そのコントロールを読み書きしていた箇所も削る必要がありますが、コントロールを削除したことで
> エラーが止まるなら、どのコントロールが原因であったものと推定できるので、削除範囲を狭めていくことで
> 問題個所を絞り込んでいけるでしょう。

これもやってみましたが特定されません。

>・思い当たる個所をすべて除去してみて、それでもエラーが続くようならば、今度は、
> 新規プロジェクトで実験用のフォームを用意し、そこに、既存コードで行っていた処理内容を
> 単純化した最低限の実装を用意し、エラーの再現性を調べるようにします。

私は一日の最後にかならずバックアップを取っていますが、
試しに「2020年2月11日」のバックアップのソリューションを開いてみると、エラーは一つも起きていません。
その翌日のファイルからエラーが出始め、こちらの掲示板に質問を投稿した時点で多数のフォームにエラーが起きております。
そこで、まだエラーの出ていないファイルと最初にエラーの出たフォームの、コントロール・コードをじっくりと比べて見てみました。
しかし、これと言って原因らしきものは発見できませんでした。
またバインドデータについても問題はあるようには思えません。
というわけでいまのところ解決はしておりません。


shu様、ありがとうございます。

Private Sub 戻るButton_Click(sender As Object, e As EventArgs) Handles 戻るButton.Click

Try
Me.Close()
Catch ex As System.Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
End Try

End Sub

このようにしてみましたが、残念ながら同じエラーメッセージが出るだけです。
メッセージを「OK」で閉じると、何ごともなく次へ進みます。
ただとにかく、いちいちエラーメッセージが出るのがウザいだけなのです。
普通のエラーのように、コードが停止してエラーコードがきちんと表示されるようなものではありません。
そのようなエラーであればGoTo ErrhabdlerやResume Nextで処理できると思うのですが、
これではトラップのしようがありません。
String”” から型 'Integer' への変換は無効です を出さないようにするには - Google 検索
String”” から型 'Integer' への変換は無効です エラートラップ - Google 検索
VB.NET エラーメッセージを出さない - Google 検索
・・・などなど何でググってみても、これはという答えに行き当たりません。

私の他に、どなたか同じ経験をした方はいらっしゃらないのでしょうか?


[ 親 93869 / □ Tree ] 返信 編集キー/

▲[ 93937 ] / 返信無し
■93939 / 7階層)  Re[7]: String”” から型 'Integer' への変換は無効
□投稿者/ 魔界の仮面弁士 (2568回)-(2020/02/23(Sun) 15:30:00)
No93937 (たかし さん) に返信
> 私は一日の最後にかならずバックアップを取っていますが、
それはファイルコピーでのバックアップですか?
それともソース管理システム (Git とか Subversion)を利用している?

> その翌日のファイルからエラーが出始め、こちらの掲示板に質問を投稿した時点で多数のフォームにエラーが起きております。
掲示板を見ている我々は、その両者を比較することができませんので、
たかしさんご自身の手で、WinMerge 等を用いるなどして差分を追跡調査頂くしかないですね…。


> Try
>   Me.Close()
> Catch ex As System.Exception
>   System.Windows.Forms.MessageBox.Show(ex.Message)
> End Try
> このようにしてみましたが、残念ながら同じエラーメッセージが出るだけです。

そのエラーメッセージは、上記 MessageBox.Show の箇所で呼び出されているのでしょうか?
それともエラーメッセージは出るものの、Catch 句に遷移しない状況なのでしょうか?


前者だとしたら、ex.Message ではなく ex.ToString() を確認してみてください。
ex.StackTrace を含めた呼び出し履歴を含めたメッセージを表示することができます。


後者だとしたら、フォーム内のどこかのイベント等で、On Error あるいは Try によって、
「例外を正しく処理せず、単にメッセージだけ表示して握りつぶしている」箇所がありそう。


> ただとにかく、いちいちエラーメッセージが出るのがウザいだけなのです。
これなんですが、「空文字列を Integer にしようとしている」のが問題というよりも、
それよりも前の、「数字が来るべき箇所に、なぜか空文字列が入っていた」という事象が
原因なのだと思います。主要因は、エラー発生個所よりももっと前の部分にあるんじゃないですかね…。

> そのようなエラーであればGoTo ErrhabdlerやResume Nextで処理できると思うのですが、
On Error での処理だと、拾うべき例外を握りつぶしてしまう可能性が高いですし、
スタックトレースを追うのも手間になります。古い言語構文にこだわるのでは無く、
Try による構造化例外処理を用いる癖をつけましょう。
[ 親 93869 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -