- PR -

VB.net「オブジェクト参照がオブジェクトインスタンスに設定されていません。」エラーについて

投稿者投稿内容
ぺけ
会議室デビュー日: 2005/01/24
投稿数: 4
投稿日時: 2005-01-25 10:28
初めて投稿します。宜しくお願いします。
【アプリケーション内容】
伝票入力システム
PC端末にて、VB.netアプリケーションプログラムを実行し、
伝票入力し、AS400のDBに登録される。DBとの接続はClientAccessを使用。
印刷指示画面より印刷実行すると、指示された伝票番号のデータを
ActiveReportで印刷処理をし、データに印刷済みフラグを更新する。
画面はメニュー画面、入力画面、印刷指示画面、印刷実行中画面 があります。

DB:AS400(DB400) V4.3
ClientAccess V5.2 SI09809

【開発環境】
VB.net2003
OS Win2000SP4
ActiveReport.net3.2.1.1979

【実行環境】
.net FrameWork V1.1SP
Win2000SP?

お客先でのみ発生するエラーなのですが、印刷処理を実行中(後?)、
件名に記述したエラーが不定期に出ます。
端末20台が同時稼動している状態で、予測ですが処理の増える月末に
エラーが発生する傾向にあります。

エラーの原因にはどのようなことが考えられるでしょうか?
どなたかご存知でしたら教えていただけませんでしょうか。

開発環境やテスト環境では一度も出たことがなく、また実行環境
でも、出るときと出ないときがあり、コーディングミスで出ている
とは考えにくいのですが、何かアドバイスしていただけることは
ありませんでしょうか。

.netでの経験も過去になく、知識も薄いので、何でも参考になります。
ぜひ宜しくお願い致します。

フォームで指定した伝票番号の伝票をActiveReportを使用して印刷し、
印刷後、DBに印刷済みフラグを立てる、といった仕様です。
1日に1台につき多いときで100伝票ほどあるのですが、(明細行はまちまち)
DBには一時的に保管され、1日で削除されます。

処理としては、印刷物も正常に出力され、更新フラグも立ちますので、
正常に動いているように見えるのですが、印刷が終わる頃、画面にエラーが
出ている、とのことです。

どなたかお知恵をお借りしたいのですが、経験のあるかた、いらっしゃらないでしょうか。

宜しくお願い致します。










xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-01-25 13:33
「ぺけ」さんの予測はDBがらみと推測されているように感じますが・・。

ご質問の内容からして、
これだけだとなんとも回答しずらいので、
単純なアドバイスしかできません。

他の部分にコードに問題が見当たらないで、
アプリケーションの機能や処理が問題ないのであれば、
処理のタイミング(印刷の前後)で怪しい部分にエラーのトラップでも仕掛けて、
Err.Number=91(Err.Description=オブジェクト参照がオブジェクトインスタンスに接続されていません。)
が起こったら、「エラーを無視してログを書き出した後処理を続行」とかのコードを追加して、
起こったときにログを回収して見たらどうでしょうか?

まず、コードのどこで起こっているのかわからないと、
問題が.NETなのか、DBなのか、ActiveReportなのか、OSのSPなのか、コードのバグなのか・・あたりがつけられないと思います。

何の”インスタンス”が空なのか?分類・特定することから初めてはどうでしょうか?


補足で、VB6以前のユーザーだったと仮定してですが、
気分を害さずに下記も参照ください。。

VB6以前と.NETの違いで、やってしまいそうな単純エラーなので、
既に確認されていると思いますが・・・

.NET系では単純型もVB6以前よりも拡張されており、
変数の初期化をきちんとしないで、
そのメンバメソッドをコールしたりプロパティを参照すると
同様のエラーが起こります。

例)--------------------
Dim strTemp as String
MsgBox(strTemp.ToUpper())
←オブジェクト参照がオブジェクトインスタンスに接続されていません。

MsgBox(strTemp.Length)
←オブジェクト参照がオブジェクトインスタンスに接続されていません。
-------------------------------------------------------------------------------
など・・


またこれも単純なこのなのですが、
別スレッド処理しているスレッドが
他スレッドから破棄されたり、
複数スレッドが参照しているオブジェクトが
別のスレッドによって意図せぬタイミングで破棄されるなどは、
コードに問題があるとごく普通に起こります。

いろいろ取り上げると
きりが無くなってしまいますが、
もう少し情報があれば良いかと思います。
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2005-01-25 15:54
ExceptionのMessage(& InnerException)をログとして収集し、解析してみては如何でしょう。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-01-25 17:01
引用:

えんぞ@見習さんの書き込み (2005-01-25 15:54) より:
ExceptionのMessage(& InnerException)をログとして収集し、解析してみては如何でしょう。



あとは、StackTraceもセットで・・・
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
ぺけ
会議室デビュー日: 2005/01/24
投稿数: 4
投稿日時: 2005-01-25 19:36
xxななおxxさん、えんぞ@見習さん、NAL-6295さん、
本当にありがとうございます。
ご覧のとおり、判別するには情報が足りなかと思いますが、それにもかかわらず
アドバイス頂き、心より感謝します。

xxななおxxさんのおっしゃるとおり、VB6以前のユーザーです。
それどころか、VB6についても私個人としてはそれほど知識がありません。
実際開発した方は、VB6での経験は豊富なのですが、.netの開発は初めてでした。

実は、ここに投稿させて頂く以前に、お客様にお願いし、実行時にログを出すよう
コーディングを追加したモジュールを導入させて頂きました。
そのときは、アドバイス頂いたようなErr.Number=91といった記述はしておらず、
怪しい箇所のコードに細かくデバッグ用のログ(通ったか通らなかったか分かるように)
を書き出すように細工しました。

もとのプログラムでも、FunctionやSubの中ではtry&catchをしており、catchした
ときは、メッセージボックスを表示するようにしていました。
ですが、このエラーはcatchされていませんでした。(意図的なメッセージボックスは出ない)

そのため、ログを書くモジュールの導入により、エラーが発生した時点のログを見れば、
どこで落ちているかが分かるかと思ったのです。

ところがエラーは発生しましたが、そのときのログがまったく書かれていませんでした。
ということは、最初のログより前でエラーが発生している、と考えられるのですが、
不思議なことに、印刷処理は出来ているのです。(帳票は出る。)
ログの出力は、印刷処理の途中にもあります。印刷処理は出来ていながらログ出力だけは
実行されていない、とは考えにくいのですが、そんなことがまさかありえるのでしょうか?

あるいは、
エラー画面が出るタイミングと、プログラムの実行のタイミングがずれているのでしょうか?

せっかく頂いたアドバイスなのですが、追加のモジュール入替をお客様に申し入れたところ、
お断りされてしまいました。モジュールを入れ替えるにしても、手当たり次第、というやり方では
受けられない、と言われました。

環境面も含め、デバッグモジュール導入以外の方法を考えるように言われました。
すみません、もしも調べたほうが良いことなどあれば、教えていただけないでしょうか。


長くなりましたが、xxななおxxさんにお教え願いたいのですが、

>.NET系では単純型もVB6以前よりも拡張されており、
>変数の初期化をきちんとしないで、
>そのメンバメソッドをコールしたりプロパティを参照すると
>同様のエラーが起こります。

こうしたエラーの場合、発生する場合と、発生しない場合がありますでしょうか。
それとも、常にエラーになるのでしょうか。

また、私の「スレッド」の理解が合っているのか分からないのですが、

>別スレッド処理しているスレッドが
>他スレッドから破棄されたり、
>複数スレッドが参照しているオブジェクトが
>別のスレッドによって意図せぬタイミングで破棄されるなどは、
>コードに問題があるとごく普通に起こります。

今回のシステムは、プログラムは各端末に導入し、DBは一箇所(サーバー)ですが、
スレッド処理(?)が発生することはありますでしょうか。
それは、コーディングの仕方によるものなのでしょうか。

知識が無くて、自力の調査も少ないままに投稿し、大変申し訳ございません。
宜しくお願い致します。



Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-25 21:56
 この例外がどういうときに投げられるか、それは理解していますか?
MSDN
 この通り、何らかの参照を行う際に、それもしくはその途中がnullだから発生します。これは実行時にソースを追いかけるなどで、発生している場所を特定しないことには修正できません。コードレビューを行えば、ある程度発見できますが、それも限界があります。したがって、あなたが、問題が発生しているところで、実際にデバッガで追いかけるなどしないと、「ここが悪いよ」とは、誰もいえないのです。

 それ以外で考えられるのは、データにnullデータがないか、というところです。例えば、数値が入る列にnullデータがあったとします。これは変数に値が入らずにレポートまで渡ると思います。レポートは数値を数値として表示するのではなく、文字列に変換します。例えば、TextBoxなどに代入するときのようにです。このとき、データはnullなので、(null).ToString()などとしようとして、例外が発生する可能性があります。


 それと、テストするとき、ユーザの入力を疑いましたか?ユーザは故意、あるいは操作ミスで、とんでもない入力を行います。例えば、私は昔、キーボードの上に手を広げて置かれたことがあります。「そんな入力しないでしょ」というと、「ユーザがキーボードの上で本を見ていて、その本を落としたらどうなるの?」といわれました(-o-; システムが想定していないデータを入力したときに、システムがどう動くか、テストしましたか?そういうテストの、データ抜けかと思います。

 お客さんのところから、データをもらってくることは可能でしょうか?あるいは、「このデータでエラーがでる」というようなデータのみ。そうすれば、自社で検証もできるのですけど。。。

# 昼間に書いたもの
_________________
ぺけ
会議室デビュー日: 2005/01/24
投稿数: 4
投稿日時: 2005-01-26 18:22
Jittaさん、アドバイスありがとうございます。
感謝しております。

>この例外がどういうときに投げられるか、それは理解していますか?

.net初心者ですが、教えていただいたサイトにて詳細を確認しました。
Javaでいうところの、NullPointerExceptionのようなものだと理解しています。

>あなたが、問題が発生しているところで、実際にデバッガで追いかけるなどしないと、「ここ
>が悪いよ」とは、誰もいえないのです。

本当にそのとおりだと思います。オブジェクトのメソッドをコールしているところなら、どの場所でも当てはまるということですよね。

> それ以外で考えられるのは、データにnullデータがないか、というところです。例えば、数>値が入る列にnullデータがあったとします。これは変数に値が入らずにレポートまで渡ると思>います。レポートは数値を数値として表示するのではなく、文字列に変換します。例えば、>TextBoxなどに代入するときのようにです。このとき、データはnullなので、
>(null).ToString()などとしようとして、例外が発生する可能性があります。

データによるエラーは疑ったのですが、同じデータを再度入力したり、
最印刷をかけたりしても、エラーが発生しませんでした。
それで、データの問題ではないのかと思っていました。
もちろん、確実ではないのかもしれないです。

>ユーザーの入力

確かに、お書き頂いた状況では、たとえ二度同じデータを入力したと言っても、「同じ」では
ないということになりますね。その可能性を考えると、データが原因というのもありえます。

> お客さんのところから、データをもらってくることは可能でしょうか?

大変難しいお客様で、データはセキュリティポリシー上、お借りすることができないのです。
開発元にも同じことをお願いされたのですが、残念ながら借りられないのです。

とはいえ、テスト不足やコーディングミスなど、まだ見直すべき点があるということが
分かりました。ありがとうございます。できる限りのことをしてみようと思います。
Moo
大ベテラン
会議室デビュー日: 2004/04/12
投稿数: 118
お住まい・勤務地: 地球・港
投稿日時: 2005-01-26 18:30
1点だけ。
引用:

ぺけさんの書き込み (2005-01-26 18:22) より:
.net初心者ですが、教えていただいたサイトにて詳細を確認しました。
Javaでいうところの、NullPointerExceptionのようなものだと理解しています。


VB6時代でいう所の「NULLの使い方が不正です」エラーですね。
_________________
ASP/ASP.NETだいすき。 ASP++ by Moo http://moo-asp.net/
日記は ほぼ毎日更新中 http://d.hatena.ne.jp/aspx/

スキルアップ/キャリアアップ(JOB@IT)