2009-04-14 11 views
2

ライブラリを使用しています(HtmlUnit)。バージョン2.4からバージョン2.5に更新しました。私のコードを2.5とコンパイルすると、馴染めていない奇妙なオブジェクト "dereferencedできません"というエラーメッセージが出ます。さらに、私は2行でコードを書くときになぜそれが動作するのか分かりませんが、1行で行うと失敗します。ここでJavaオブジェクトを「参照解除できません」

はコードです:com.gargoylesoftware.htmlunit.html.HtmlInputをすることはできません

[javac] E:\workspaces\europa\PortalTestSuite\src\com\carefirst\portal\test\controller\EAITest.java:32: com.gargoylesoftware.htmlunit.html.HtmlInput cannot be dereferenced 
[javac]   form.getInputByName("password").setValueAttribute(passWord); 
[javac]         ^

//this compiles fine 
HtmlInput usernameInput = form.getInputByName("username"); 
usernameInput.setValueAttribute(userName); 

//this fails to compile 
form.getInputByName("password").setValueAttribute(passWord); 

これは私がANTとJava 1.6を使用してコンパイル時に私が取得エラーメッセージです間接参照? Autoboxingではderefernceの問題を見てきましたが、オブジェクトではそうではありませんでした。この文脈ではどういう意味ですか?そして、なぜコードは一方の方法で動作し、他方の動作ではないのですか?

答えて

3

のJavadocに示すように関数form.getInputByNameは、オブジェクトHtmlInputはそれが常にHtmlInputを拡張されたオブジェクトによって実装され、ランタイム時にこのように抽象的であるhere

最終宣言されます。

最終的なメソッドの性質上(コールスタックがないようにオーバーライドされることはないため)、コンパイラはhtmlinputと見なされますが、実装されたhtmlinputではありません。(彼はコールスタックはないと考えています。 ) これを新しいhtmlinputオブジェクトに割り当てると、callstackが正しく呼び出され、コードが再び実行可能になります。私が何を考えて

thatsのは、あなたがそれを得たところ、私をしてください、私は何とかバージョン2.5を見つけるために管理していけない、まだあなたがリンクすることができますが、ここで

が起こっているの?

+0

私が使用している2.5バージョンはスナップショットビルドです - 最新の安定版リリースはまだ2.4です。私はhttp://build.canoo.com/htmlunit/artifacts/で2.5スナップショットを取得しました - 2.4が持つ問題をjQueryで解決するために必要でした。それはその問題を解決しましたが、明らかに新しいものをもたらしました... –

+1

「HtmlInputと見なされ、実装されたHtmlInputではない」とはどういう意味ですか?それが意味することを明確にしてください、そして/またはこれを参考にしてください。 –

+0

私の悪い習慣...素人の言葉で説明しようとしている過程で意味を失う... refferenceが最初にヒットしたgoogle "java final method" 申し訳ありません、私はそれを提供しませんでした。答えに加えられました。 – youri

5

実際、別の問題です。

APIはpublic final <I extends HtmlInput> I getInputByName(String name) throws ElementNotFoundExceptionです。

つまり、メソッドはII extends HtmlInput)のインスタンスを返します。

あなたが書いた:

HtmlInput usernameInput = form.getInputByName("username"); 

- 私は暗黙のうちにHtmlInputある>クラス。

しかし、あなたが書く:

form.getInputByName("password").setValueAttribute(passWord); 

- 私は明示的に見つけることができません>クラス。あなたはそれが仕事をしたい場合は、あなたが書く必要が

form.<HtmlInput>getInputByName("password").setValueAttribute(passWord); 

- >この力私はHtmlInputことにします。

コード通りに、 ジェローム。

+0

誰もがなぜjava 5がこれを必要としているのか知っていますか?ドキュメント/リンクはとても感謝しています! – Marco

関連する問題