7

この奇妙なエラーが発生します:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: size is not a function, it is null. (#1)

ヒープ ダンプを分析し、VisualVM で次の OQL クエリを実行すると、次のようになります。

select { map: x } 
from java.util.concurrent.ConcurrentHashMap x 
where x.size() < 10

問題は句にあります。明らかに size メソッドがありwhereますが、どういうわけか機能していません。Map

4

2 に答える 2

3

@ruakhの答えは、ちょっとしたことを除いてかなり良いです。セグメントが null になる場合があり、混乱を招きますsum(x.segments, 'it.count')。に置き換えます

sum(x.segments, 'it != null ? it.count : 0')

そしてそれはうまくいくでしょう。私の言葉でテストされました。

于 2013-04-09T20:54:00.667 に答える
2

VisualVM OQL documentationを見ると、Java メソッド呼び出しをサポートしているという印象はなく、Java フィールドのみをサポートしています。(いくつかの例には.toString()が含まれていますが、Java オブジェクトを JavaScript 文字列に変換するために使用しているため、明らかに Java.toString()ではなくStringJavaScript です。)したがって、たとえば、文字列の長さの例ではすべて、countパブリック メソッドではなくプライベートlength()フィールドを使用し、ベクトルの長さの例elementCountでは、パブリック メソッドではなくプライベート フィールドを使用していsize()ます。

ConcurrentHashMapという名前のフィールドがないため、エラーが発生しますsize

あなたのクエリにとって残念なことに、ConcurrentHashMapはそのサイズをフィールドに保存しません — ブロックを回避する能力が損なわれます — そのため、次のように書く必要があると思います:

select { map: x }
from java.util.concurrent.ConcurrentHashMap x
where sum(x.segments, 'it.count') < 10

すべてのセグメントサイズを自分で合計します。(免責事項: 100% 完全にテストされていません。)

于 2012-11-08T19:39:04.280 に答える