2009-04-14 853 views
2

我正在使用库 - HtmlUnit - 并且我刚刚从版本2.4更新到版本2.5。当我将我的代码编译为2.5时,出现一个我不熟悉的奇怪对象“无法取消引用”的错误消息。此外,我不明白为什么它在我用两行代码编写代码的时候起作用,但是当我将它作为单行代码执行时却失败了。Java对象“无法取消引用”

下面是代码:

//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问题,但与对象无关。这在这方面意味着什么?为什么代码是单向的而不是其他的?

回答

3

功能form.getInputByName被声明最终如图在Javadoc here

目的HtmlInput是抽象因而上运行时时间它总是通过被延伸HtmlInput的对象来实现。 (ref)(他认为不会有任何的调用堆栈),因为编译器认为它只是htmlinput而不是一个实现的htmlinput。(ref)(他认为不会有调用堆栈) 将它分配给一个新的htmlinput对象可以正确调用callstack,从而使代码再次可用。

这就是我想是怎么回事这里

但不知何故,我不设法找到2.5版还可以联系我请,你懂吗?

+0

我使用的2.5版本是快照构建 - 最新的稳定版本仍然是2.4。我在http://build.canoo.com/htmlunit/artifacts/获得了2.5快照 - 我需要它来解决2.4在jQuery中遇到的问题。它解决了这个问题,但显然带来了新的...... – 2009-04-15 00:47:06

+1

“看到它只是HtmlInput而不是实现的HtmlInput”是什么意思?请澄清这意味着什么和/或为此提供一些参考。 – 2009-10-21 07:58:38

5

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

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

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

当你写:

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

- > I类是隐含的HtmlInput。

但是,当你写:

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

- >我无法找到明确的类。

如果你想要的工作,你必须写:

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

- >这力量我是一个HtmlInput。

Cordially, Jérôme。