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

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

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

Re[4]: オブジェクトインスタンスに設定されていません のエラーが出る


(過去ログ 75 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■44199 / inTopicNo.1)  オブジェクトインスタンスに設定されていません のエラーが出る
  
□投稿者/ tune (1回)-(2009/12/01(Tue) 14:44:37)

分類:[.NET 全般] 

VisualStudio.Net2005 + SQLserver2005SP1 です。

「オブジェクト参照がオブジェクト インスタンスに設定されていません」のエラーが
発生したのですが、その原因(またはその調査方法)をアドバイス下さい。

あちこち検索かけてみたところ、良くあるエラーのようで、
「参照しようとしたオブジェクトがNull値だった場合に発生する」ことが判りました。
そしてそれらは(私が見た範囲では)必ず発生する(再現性のある)もののようでした。

今回発生したものは必ず発生するものではなく、入力データは毎回変わりますが、
これまで半年ほど毎日7〜80回起動して、未発生でした。
また、エラーとなった今回も、そのまま単純リランしたところ、
エラーとならずに処理が完了しております。
 プログラムに含めている「ステップ出力ログ」と
 プログラムソース(Try−catch)の位置と出力内容
より起因となる範囲は絞り込んでいますが、
  DBコネクションの Commit/Close/Rollback
ぐらいしか見当たりません。

再現性が無い(殆ど発生しない)ため、
調査方法すら確立できません。
すみませんが、知恵を貸していただけ無いでしょうか?
引用返信 編集キー/
■44200 / inTopicNo.2)  Re[1]: オブジェクトインスタンスに設定されていません のエラーが出る
□投稿者/ よねKEN (426回)-(2009/12/01(Tue) 15:31:04)
2009/12/01(Tue) 15:32:28 編集(投稿者)

> 「オブジェクト参照がオブジェクト インスタンスに設定されていません」のエラーが
> 発生したのですが、その原因(またはその調査方法)をアドバイス下さい。

(1) ある変数がnullになりうるにも関わらず、その変数がnullになった場合の制御が漏れている
(2) ある変数はnullにならない想定だが、別の箇所の処理(不具合かもしれないし、仕様かもしれない)の結果としてnullになっている

の2パターンが考えられますが、経験的には(2)のケースが多いですね。

> 今回発生したものは必ず発生するものではなく、入力データは毎回変わりますが、
> これまで半年ほど毎日7〜80回起動して、未発生でした。

入力データの内容によって発生しているということのようですから、
再現するデータ(画面から入力するデータ、DB上のデータ、その他のデータ(日付、時刻など))のパターンの特定が大事ですね。

> また、エラーとなった今回も、そのまま単純リランしたところ、
> エラーとならずに処理が完了しております。

本番環境での動作状況ですか?
画面などからは同じ入力での実行でしたか?

本番環境なら複数の人が同じDBにアクセスするでしょうから、
リランだけでもDBの状態と日付や時刻は変わりますね。画面などからの入力データは変えていないなら、
それ以外のデータで何か違いがあるのだと思います。

>  プログラムに含めている「ステップ出力ログ」と

エラー発生位置とそこまでに至るステップで投げているSQL、及び、
それによって影響の受けるデータを確認してみてはいかがでしょうか。

> 再現性が無い(殆ど発生しない)ため、
> 調査方法すら確立できません。

例外発生位置が特定できているなら、ソースコードのフローを遡っていき、
どういう状況になれば、その変数がnullになりうるのか、
先入観をなるべく捨てて机上デバッグされるとよいような気がします。

引用返信 編集キー/
■44201 / inTopicNo.3)  Re[2]: オブジェクトインスタンスに設定されていません のエラーが出る
□投稿者/ tune (2回)-(2009/12/01(Tue) 16:16:12)
No44200 (よねKEN さん) に返信

ご回答ありがとうございます。

> (1) ある変数がnullになりうるにも関わらず、その変数がnullになった場合の制御が漏れている
> (2) ある変数はnullにならない想定だが、別の箇所の処理(不具合かもしれないし、仕様かもしれない)の結果としてnullになっている
>
> の2パターンが考えられますが、経験的には(2)のケースが多いですね。

メッセージからして、「オブジェクト変数」がNullの場合と判断しており、
オブジェクトのみを調査対象として見ております。
一般(?)変数がNullのために発生した場合でも、このメッセージになるでしょうか?


>>今回発生したものは必ず発生するものではなく、入力データは毎回変わりますが、
>>これまで半年ほど毎日7〜80回起動して、未発生でした。
>
> 入力データの内容によって発生しているということのようですから、
> 再現するデータ(画面から入力するデータ、DB上のデータ、その他のデータ(日付、時刻など))のパターンの特定が大事ですね。
>
>>また、エラーとなった今回も、そのまま単純リランしたところ、
>>エラーとならずに処理が完了しております。
>
> 本番環境での動作状況ですか?
> 画面などからは同じ入力での実行でしたか?

すみません、この部分うまく説明できていなかったようです。
バッチ処理としておりますとおり、VB.netで構築していますが、
SQLserverに格納しているテキストデータ(固定長レイアウトの発注データです)を入力とし、
処理をおこなっています。
よって、リラン(テストではなく、本番環境で処理自体の再実行となります)の場合も、
DBに格納されている全く同一のデータを使っての再処理となりますので、
違いがあるとすれば、
 ・処理を行なった時間
 ・他の発注データの処理状況
ぐらいとなります。
※ 画面インタフェースからマスタメンテ等可能ですが、該当時間帯には行なわれていません。


> 本番環境なら複数の人が同じDBにアクセスするでしょうから、
> リランだけでもDBの状態と日付や時刻は変わりますね。画面などからの入力データは変えていないなら、
> それ以外のデータで何か違いがあるのだと思います。

このあたりも注意して見ていますが、
複数の発注データを同時(複数の相手先から受信完了後、順次実行します)に処理しますが、
データ処理時のキー(相手先区分・時間)により、他の発注データとの重複もありません。


>> プログラムに含めている「ステップ出力ログ」と
>
> エラー発生位置とそこまでに至るステップで投げているSQL、及び、
> それによって影響の受けるデータを確認してみてはいかがでしょうか。

現時点で、エラー発生位置が特定しきれておらず、
エラー発生するであろう範囲(最後のログの出力位置と、次のログ出力位置(未出力)の間)で、
調べると、先の
 DBコネクションの Commit/Close/Rollback
ぐらいしか見当たらなくなっております。


>>再現性が無い(殆ど発生しない)ため、
>>調査方法すら確立できません。
>
> 例外発生位置が特定できているなら、ソースコードのフローを遡っていき、
> どういう状況になれば、その変数がnullになりうるのか、
> 先入観をなるべく捨てて机上デバッグされるとよいような気がします。

ありがとうございます。
続けて見ていきます。

引用返信 編集キー/
■44203 / inTopicNo.4)  Re[3]: オブジェクトインスタンスに設定されていません のエラーが出る
□投稿者/ みきぬ (677回)-(2009/12/01(Tue) 17:11:42)
No44201 (tune さん) に返信
> 現時点で、エラー発生位置が特定しきれておらず、

例外発生時に、スタックトレースを出力してないのかしら?

# 例えば、ex.Message だけ出力しちゃってるぜー、みたいな

引用返信 編集キー/
■44204 / inTopicNo.5)  Re[3]: オブジェクトインスタンスに設定されていません のエラーが出る
□投稿者/ よねKEN (427回)-(2009/12/01(Tue) 17:11:53)
> メッセージからして、「オブジェクト変数」がNullの場合と判断しており、
> オブジェクトのみを調査対象として見ております。
> 一般(?)変数がNullのために発生した場合でも、このメッセージになるでしょうか?

おっしゃりたいのは、たぶん参照型の変数と値型の変数のことですよね。
(.NETでは「オブジェクト変数」という用語はたぶん使われないと思います。 )

・値型→Byte、Boolean、Char、Int16(Short)、Int32(Integer)、Int64(Long)、Single、Double、DateTime(Date)、Decimal、その他に独自に定義した構造体
・参照型→Object、String、上記の値型以外の他のクラス、独自に定義したクラス

参照型の変数、または、Nullable(Of T)型の変数に対して、
メソッド、プロパティの呼び出しを行った場合にNullReferenceExceptionの例外が発生します。

> バッチ処理としておりますとおり、VB.netで構築していますが、

バッチ処理なんですか。そういう情報は先に書いておいた方がよいですね。

> SQLserverに格納しているテキストデータ(固定長レイアウトの発注データです)を入力とし、
> 処理をおこなっています。

そのテキストデータはどうやって決定するのでしょう?
以下は想像ですが、バッチ処理に対する処理対象を指定するためのパラメータ
(コマンドライン引数だったり、設定ファイルだったり、DB上の設定情報用テーブルだったり)
を渡してSELECT文で抽出する、といったような感じで処理されるのではないかと思いますが、
その指定によって、期待するテキストデータが正しく取れているのかどうか、という辺りは確認が必要だと思います。
(既に確認実施されているかもしれませんが・・・)

> >> プログラムに含めている「ステップ出力ログ」と
:略
> 現時点で、エラー発生位置が特定しきれておらず、

その「ステップ出力ログ」(または他にもログ出力しているならそれらのログ)に
例外のスタックトレースの内容は出力していないのでしょうか?

スタックトレースがあれば、ソースコード上のどの場所で例外が発生しているかは一目瞭然です。
逆に例外発生時のスタックトレースがなければ、発生した障害に対して迅速かつ確実な対応はできません。
(それっぽい状況を再現できて修正したとしても、修正内容が今回の問題への対応になったのかどうか
(別のバグへの対応でないか)を証明できない)

引用返信 編集キー/
■44225 / inTopicNo.6)  Re[4]: オブジェクトインスタンスに設定されていません のエラーが出る
□投稿者/ tune (3回)-(2009/12/02(Wed) 09:19:28)
No44203 (みきぬ さん) に返信

ご回答ありがとうございます。

> 例外発生時に、スタックトレースを出力してないのかしら?
>
> # 例えば、ex.Message だけ出力しちゃってるぜー、みたいな
>

恥ずかしながらそうなのです。
その辺りは、全体的に(今更ながら)見直す必要があると、切実に思っております。
運用にリリースしているため、安易にプログラムの改修ができないのが、悩みです。
※ 利用者からは、
  不具合の改修は即座に対応すること。
  不具合の無い部分は触らないこと。
 とされ、「ログ出力」や「調査」のための改修は、なかなか許可がおりません。
引用返信 編集キー/
■44230 / inTopicNo.7)  Re[4]: オブジェクトインスタンスに設定されていません のエラーが出る
□投稿者/ tune (4回)-(2009/12/02(Wed) 10:07:44)
No44204 (よねKEN さん) に返信

引き続きのご回答ありがとうございます。

@ITで 2003-08-26 に 上がってた質問と似ています。 (同じ? よねKENさんもご回答されてました)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5921&forum=7&start=8
相手先DBが、Oracle(当方はSQLserver)と違うだけで、同様かなと..
残念ながら、最終どうなったか判りませんでした。


>>メッセージからして、「オブジェクト変数」がNullの場合と判断しており、
>>オブジェクトのみを調査対象として見ております。
>>一般(?)変数がNullのために発生した場合でも、このメッセージになるでしょうか?
>
> おっしゃりたいのは、たぶん参照型の変数と値型の変数のことですよね。
> (.NETでは「オブジェクト変数」という用語はたぶん使われないと思います。 )
>
> ・値型→Byte、Boolean、Char、Int16(Short)、Int32(Integer)、Int64(Long)、Single、Double、DateTime(Date)、Decimal、その他に独自に定義した構造体
> ・参照型→Object、String、上記の値型以外の他のクラス、独自に定義したクラス
>
> 参照型の変数、または、Nullable(Of T)型の変数に対して、
> メソッド、プロパティの呼び出しを行った場合にNullReferenceExceptionの例外が発生します。

すみません、どういう呼称が良いか探したのですが、
うまく当てはまっておりませんでした。

仰るとおりです。このエラーの原因について、
「値型の変数がNullの場合」というのは調査対象から外しても良いですよね?
の確認でした。


>>バッチ処理としておりますとおり、VB.netで構築していますが、
>
> バッチ処理なんですか。そういう情報は先に書いておいた方がよいですね。

重ね重ねすみません。
「バッチ処理」と書いてたつもりだったのですが、
文章校正中に削除してしまったと思われます。

>>SQLserverに格納しているテキストデータ(固定長レイアウトの発注データです)を入力とし、
>>処理をおこなっています。
>
> そのテキストデータはどうやって決定するのでしょう?
> 以下は想像ですが、バッチ処理に対する処理対象を指定するためのパラメータ
> (コマンドライン引数だったり、設定ファイルだったり、DB上の設定情報用テーブルだったり)
> を渡してSELECT文で抽出する、といったような感じで処理されるのではないかと思いますが、
> その指定によって、期待するテキストデータが正しく取れているのかどうか、という辺りは確認が必要だと思います。
> (既に確認実施されているかもしれませんが・・・)

可能な限り実施しております。
データの残存状況、ログで出力したいる対象のキー、キーに紐づくデータ
等より、対象のデータ と それを特定するためのパラメタ が、
正しく取れる状態であったことは確認いたしております。

>>>> プログラムに含めている「ステップ出力ログ」と
> :略
>>現時点で、エラー発生位置が特定しきれておらず、
>
> その「ステップ出力ログ」(または他にもログ出力しているならそれらのログ)に
> 例外のスタックトレースの内容は出力していないのでしょうか?
>
> スタックトレースがあれば、ソースコード上のどの場所で例外が発生しているかは一目瞭然です。
> 逆に例外発生時のスタックトレースがなければ、発生した障害に対して迅速かつ確実な対応はできません。
> (それっぽい状況を再現できて修正したとしても、修正内容が今回の問題への対応になったのかどうか
> (別のバグへの対応でないか)を証明できない)

お恥ずかしいところですが、スタックトレースを出力する機能を実装しておりませんでした。
今後の課題とし、早急に実装したいと思います。
( みきぬ さんへの返信にも記載しましたが、今更だと改修が承認されにくいのが難点です。)

現在のところ、プログラムにて出力している ログ と ソースコード より、
DBの commit / Rollback / close あたりではないか?
と見ているのですが、先のご指摘のとおり先入観を捨てて見直しています。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -