2009-06-24 3 views
7
私はいくつかのコード(デルファイ7)を見ている特定のオブジェクトのすべてのメソッドの呼び出しの先頭にある: これは、nullでメソッドを呼び出すことから私を防ぐだろうと思うオブジェクトポインタ。しかし、私はそのような場合にメンバーデータにアクセスしようとするとすぐに例外が発生するでしょう。 これはこれまでに一度も見たことのない標準ですか?問題のオブジェクトはTPersistentから派生しています。

答えて

8

意図的にやりたいことではありませんが、ヌルポインタでインスタンスメソッドを呼び出すことはできます。それが起こると、実行はインスタンスデータにアクセスする必要があり、すべてが強くなるまで非常に楽しく進行します。

この場合、nilをチェックすると手順の先頭に警告が表示され、スタックトレースを記録するなどのさまざまな処理を行うことができます。または、レイズラインにブレークポイントを置くことで、何が起きているのかを知ることができます。

つまり、特定のバグがあった場合は、何もないことがあります。これは、ゼロ参照が使用されていた場所を特定しようとしていました。

定期的にコードの匂いとして私を襲う。

4

自己がnilであるメモリでコードが実行される可能性のあるアクセス違反のシナリオがあります。一部のプログラマは、実際の問題を解決する代わりに、そのようなアサーションを使用してバイパスしようとすると、種類の破損を防止します。例外が実行時に発生するかどうかを確認します。もしそうなら、あなたの手のひらの下にバグのあるコードがあります。

件名に関する次の記事を読むことができます:When Self in Nil... You Know You are in Trouble

イベントに関連する可能性があります。このようなテストの例が豊富で、ここで詳細を読むことができます。対応する説明はMulticast Events - Part 2です。

+2

私は、このサンプルコードが実際の問題をまったくバイパスしているとは言いません。それどころか、問題を明示的に強調しています。 –

10

nilポインターについて不平を言っている明確なエラーは、それがどう起こったかを示さないアクセス違反よりも優れています。

+1

*可能な*アクセス違反ではなく、無限のポインタをキャッチするための+1。 –

+0

このようにすべてのオブジェクトをコーディングすると言っていますか? –

+0

nilポインタの逆参照がブームにならないようにするのは非常に難しいです。あなたはそこに記憶を持っていません。 –

1

そして、常にnil Selfで実行したときにコードがクラッシュしない可能性があります。例 - オーナーオブジェクトのフィールドにアクセスしていない場合その場合、このテストは、さもなければ検出されない問題を捕らえるでしょう。

それでも、これは防衛的なプログラミングを極限まで引き締めています。私は決して(OK、ほとんど決してない - 私がウサギを狩っている時だけ...間違っている...バグを潰す)そうする。

+0

私はそれをやったにもかかわらず、クラスメソッドであるかのように非クラスメソッドを使用するのは悪いフォームです。 –

1

このメソッドの元の意図は、抽象メソッドになるということです。

3

これは間違いなくクラッシュ(「0x00000000からの読み取り」などのOS例外)につながる機会です。言語例外を投げることは単純に冗長です(EAbstractErrorを誤って使用するとそれが改善されません)。

有効な入力パラメータを確認することは、決して確実ではないため、安全でない言語では実行可能な作業ではないため、無効なパラメータの処理が決して一貫しません。 (なぜ、nilポインタが渡されたときに例外をスローしますか?0x00000001では無効なのはなぜですか?)この質問の技術的な議論については、why not to check for valid pointersのLarry Ostermanのブログを読んでください。

例外として、Delphiではメソッドがnilポインタで呼び出される可能性がありますが、もちろんそのようなチェックが必要です。

関連する問題