Java对象“无法解除引用”

时间:2009-04-14 21:15:26

标签: java htmlunit

我正在使用一个库 - HtmlUnit - 我刚刚从版本2.4更新到版本2.5。当我编译我的代码2.5时,我得到一个奇怪的对象“无法解除引用”错误消息,我不熟悉。此外,我不明白为什么它在我用两行编写代码时有效,但是当我把它作为一行代码时失败。

以下是代码:

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

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

这是我使用ANT和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无法解除引用?我已经看到了Autoboxing的derefernce问题,但没有看到对象。在这种情况下它意味着什么?为什么代码以一种方式而不是另一种方式工作?

2 个答案:

答案 0 :(得分:5)

事实上,这是另一个问题。

API为public final <I extends HtmlInput> I getInputByName(String name) throws ElementNotFoundException

这意味着该方法返回II extends HtmlInput)的实例。

当你写:

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

- &GT;类I隐含地是HtmlInput。

但是当你写:

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

- &GT;我无法明确找到第一类。

如果你想要它可以工作,你必须写:

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

- &GT;这迫使我成为HtmlInput。

亲切, 杰罗姆。

答案 1 :(得分:3)

函数form.getInputByName被声明为final,如javadoc here

所示

对象HtmlInput是抽象的,因此在运行时它总是由扩展HtmlInput的对象实现。

由于最终方法的性质(它永远不会被覆盖所以没有callstack)错误来自因为编译器将其视为htmlinput而不是实现的htmlinput。(ref)(他认为会有没有callstack) 将它分配给新的htmlinput对象会正确调用callstack,从而使代码再次可行。

这就是我认为正在发生的事情

虽然我不知道怎么找不到版本2.5但是你能把它链接到哪里吗?