2013-06-05 11 views
6

Java 1.7.0_17およびJboss 4.2.3GAで実行されているクラスで、Windowsの下に少しコードがあります。コードは、このない:Javaメソッド呼び出しの動作が不可能

Date newNextDate = inBetween(currentDate, nextDate, start); 
print("newNextDate=" + newNextDate); 

挟んはかなり単純比較ない:終わりにjava.util.Dateで結果が割り当てられるので

private Date inBetween(Date start, Date end, Date test) { 
    ... 
    Date contains = t.contains(test) ? test : end; 
    print("returning contains=" + contains); 
    return contains; 
} 

正確な実装が含まれているが、関連私見ありませんcontains変数に追加します。標準出力に出力されます:

16:44:56,153 INFO returning contains=Tue Apr 30 23:59:59 CEST 2013 
16:44:56,153 INFO newNextDate=null 

そして謎が始まるところ、この: 1.直前に変数が含まれているreturn文には、値を持っている 2.収集変数を返すことがnullの後

これは世界でどのように可能ですか?

  • はい、このinbetweenメソッドが呼び出されたかどうかを確認しました。そうでない場合、出力が出力されませんでした。
  • いいえ、同じ名前のインスタンス変数はありません。しかし、間に何も起こっていなくても。
  • いいえ、プロセスをデバッグすることはできません。これは、プロダクションサーバーでのみ発生し、開発時には再現できないためです。

最も奇妙なことは、ここでは、1.000.000行のコードのどこにも存在しないことです。

+0

'print'がどこにあるコードにスタックトレースを出力しますか? '例外e = new NullPointerException(); System.printstacktrace(e); '(warning:pseudo-java)を実行し、' inBetween() 'メソッドの周りにある種のプロキシを注入していないことを確認してください。 (あいまいですが可能です) –

+0

実際にjvmに接続して、プロダクションサーバをリモートでデバッグすることができます。 http://java.dzone.com/articles/how-debug-remote-java-applicat –

+0

デバッグを使用し、ステップごとに繰り返します。必要に応じてブレークポイントを追加し、値を確認します。あなたは間違いなくどこかでエラーがあります。 – Quillion

答えて

2

たぶん、あなたはあなたの中間にオーバーロードしているし、それが呼び出されます:

private Date inBetween(long start, Date end, Date test) { 
    Date result = null; 
    inBetween(new Date(start), end, test); 
    return result; 
} 

または同様に、典型的な何か。 A catch ... return null

唯一の他の技術的な方法は、間違ったキャッシング(memoization?)程度をするAOPインターセプタを持つことです。ありそうもない。

+0

このメソッドはプライベートであり、同じクラス内にあるため、オーバーロードすることはできません。しかし、私たちはチェックして、1つしかありません。デバッグでは、このメソッドへの呼び出しをトレースすることができます(しかしそれはうまくいきます)。 – tbeernot

+0

不可能なコード、実際には最後のブロックがないとき、他の 'print("は "=" + ...を含んでいます。 '...'の中で 'nullを返す'。 _(** override ** =継承を介して同じ名前とパラメータ型を持つメソッドを持つ; ** overload ** =同じ名前で異なるパラメータ型を持つメソッドを持つ)_ _ –

関連する問題