2009-04-14 9 views
2

Ich benutze eine Bibliothek - HtmlUnit - und ich habe gerade von Version 2.4 auf Version 2.5 aktualisiert. Wenn ich meinen Code gegen 2.5 kompiliere, bekomme ich ein seltsames Objekt, "das nicht dereferenziert werden kann", das mir nicht bekannt ist. Außerdem verstehe ich nicht, warum es funktioniert, wenn ich den Code in zwei Zeilen schreibe, aber scheitere, wenn ich es als Einzeiler mache. HierJava-Objekt "kann nicht dereferenziert werden"

ist der Code:

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

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

Dies ist die Fehlermeldung, die ich erhalte, wenn ich ANT kompilieren verwenden und Java 1.6:

[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]         ^

com.gargoylesoftware.htmlunit.html.HtmlInput kann nicht sein, dereferenziert? Ich habe beim Autoboxing Probleme mit der Entfernung gesehen, aber nicht mit Objekten. Was bedeutet es in diesem Zusammenhang? Und warum funktioniert der Code in einer Richtung und nicht in der anderen?

Antwort

3

Die Funktion form.getInputByName wird erklärt, wie gezeigt in der endgültigen Javadoc- here

Das Objekt HtmlInput abstract ist also zur Laufzeit Zeit immer durch ein Objekt implementiert wird, die HtmlInput erstreckt.

Aufgrund der Art der endgültigen Methoden (es nie außer Kraft gesetzt wird, so gibt es keine Aufrufliste ist) der Fehler kommt beceause der Compiler es sieht wie nur htmlinput und nicht ein implementiertes htmlinput. (ref) (er denkt, wird es keine Aufrufliste sein) das Zuweisen eines neuen htmlinput-Objekts ruft den Callstack korrekt auf und macht den Code somit wieder funktionsfähig.

das ist, was ich denke, geht hier

obwohl ich Version 2.5 nicht zu finden, verwalten irgendwie noch können Sie mir bitte Link, wo Sie es bekommen?

+0

Die Version 2.5, die ich verwende, ist Snapshot Build - die neueste stabile Version ist immer noch 2.4. Ich habe den 2.5 Snapshot unter http://build.canoo.com/htmlunit/artifacts/ - ich brauchte ihn, um ein Problem zu lösen, das 2.4 mit jQuery hat. Es hat dieses Problem gelöst, aber anscheinend neue gebracht ... –

+1

Was bedeutet "es nur als HtmlInput und nicht als implementiertes HtmlInput" zu verstehen? Bitte erläutern Sie, was das bedeutet und/oder geben Sie einen Hinweis dafür. –

+0

schlechte Angewohnheit von mir ... versucht, in Laien Begriff zu erklären und dabei zu verlieren Bedeutung ... Reference wurde zuerst google "Java final Methode" Entschuldigung ich habe es nicht zur Verfügung gestellt. der Antwort hinzugefügt. – youri

5

In der Tat ist es ein anderes Problem.

Die API ist public final <I extends HtmlInput> I getInputByName(String name) throws ElementNotFoundException.

Das bedeutet, dass die Methode eine Instanz I (I extends HtmlInput) zurückgibt.

Wenn Sie schreiben:

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

-> Die Klasse I ist implizit eine HtmlInput.

Aber wenn Sie schreiben:

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

-> Die Klasse I nicht explizit gefunden werden kann.

Wenn Sie es arbeiten wollen, müssen Sie schreiben:

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

-> Diese Kräfte ich ein HtmlInput sein.

Herzlich, Jérôme.

+0

Weiß jemand, warum Java 5 das braucht, aber warum Java 6 nicht? Docs/Links sehr geschätzt! – Marco

Verwandte Themen