2009-04-14 8 views
2

J'utilise une bibliothèque - HtmlUnit - et je viens de passer de la version 2.4 à la version 2.5. Quand je compile mon code contre 2.5, je reçois un message d'erreur d'objet étrange "ne peut pas être déréférencé" que je ne connais pas. De plus, je ne comprends pas pourquoi cela fonctionne quand j'écris le code en deux lignes, mais échoue quand je le fais en tant que doublure.Java Object "ne peut pas être déréférencé"

Voici le code:

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

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

Ceci est le message d'erreur que je reçois quand je compile en utilisant ANT et 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 ne peut pas être déréférencé? J'ai vu des problèmes de derefernce avec Autoboxing, mais pas avec des objets. Qu'est-ce que cela signifie dans ce contexte? Et pourquoi le code fonctionne-t-il dans un sens et pas dans l'autre?

Répondre

3

La fonction est déclarée form.getInputByName finale comme indiqué dans le javadoc here

Le HtmlInput objet est abstrait ainsi le temps d'exécution, il est toujours mis en œuvre par un objet qui étend HtmlInput. En raison de la nature des méthodes finales (il n'est jamais écrasé, donc il n'y a pas de callstack) l'erreur vient du fait que le compilateur le considère comme juste htmlinput et non comme un htmlinput implémenté. (ref) (il pense qu'il n'y aura pas de callstack l'affecter à un nouvel objet htmlinput appelle correctement la callstack et rend ainsi le code viable à nouveau.

thats ce que je pense qu'il se passe ici

si je DonT en quelque sorte réussi à trouver la version 2.5 mais pouvez-vous me relier s'il vous plaît où vous l'avez?

+0

La version 2.5 que j'utilise est la construction de snapshots - la dernière version stable est encore 2.4. J'ai eu l'instantané 2.5 à http://build.canoo.com/htmlunit/artifacts/ - J'en avais besoin pour résoudre un problème 2.4 avec jQuery. Il a résolu ce problème, mais en a apparemment apporté de nouveaux ... –

+1

Qu'est-ce que "voit comme juste HtmlInput et pas un HtmlInput implémenté"? Veuillez préciser ce que cela signifie et/ou fournir des références à ce sujet. –

+0

mauvaise habitude de la mienne ... essayant d'expliquer en termes simples et perdant sens dans le processus ... refference a été frappé pour la première fois google "méthode finale java" désolé je n'ai pas fourni. ajouté à la réponse. – youri

5

En fait, c'est un autre problème.

L'API est public final <I extends HtmlInput> I getInputByName(String name) throws ElementNotFoundException. Cela signifie que la méthode renvoie une instance de I (I extends HtmlInput).

Lorsque vous écrivez:

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

-> La classe I est implicitement un HtmlInput.

Mais quand vous écrivez:

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

-> La classe I ne peut pas être trouvé explicitement.

Si vous voulez que cela fonctionne, vous devez écrire:

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

-> cette force je être un HtmlInput.

Cordialement, Jérôme.

+0

Est-ce que quelqu'un sait pourquoi java 5 a besoin de ça, mais pourquoi java 6 n'en a pas besoin? Docs/liens très appréciés! – Marco

Questions connexes