Saxon XQuery调用Java ArrayList构造函数返回空序列的问题
Saxon XQuery调用Java ArrayList构造函数返回空序列的问题解决
问题说明
在XQuery程序中创建java.util.ArrayList并打印其大小时,Saxon引擎中al:new()返回空序列,触发XPTY0004错误(变量$obj不允许为空序列),但创建java.lang.String对象时无此问题。
错误代码片段
declare namespace jt = "http://saxon.sf.net/java-type"; declare namespace al = "java:java.util.ArrayList"; let $obj as jt:java.util.List := al:new() let $result := al:add($obj,"Hello") return al:size($obj)
报错信息
Error on line 18 of Test.xq:
XPTY0004: An empty sequence is not allowed as the value of variable $obj
Query processing failed: Run-time errors were reported
正常运行的String对比代码
declare namespace jt = "http://saxon.sf.net/java-type"; declare namespace str = "java:java.lang.String"; let $obj as xs:string := str:new("Tiger") return str:length($obj)
解决方案
核心原因
Saxon中调用无参Java构造函数时,必须使用带空括号的语法al:new(())。直接写al:new()会被引擎解析为调用无参静态方法而非构造函数,因此返回空序列。
修改后的正确代码
方式1:保留类型声明
declare namespace jt = "http://saxon.sf.net/java-type"; declare namespace al = "java:java.util.ArrayList"; let $obj as jt:java.util.List := al:new(()) let $result := al:add($obj,"Hello") return al:size($obj)
方式2:省略类型声明(自动推断)
declare namespace al = "java:java.util.ArrayList"; let $obj := al:new(()) let $result := al:add($obj,"Hello") return al:size($obj)
优化写法(无需保存add方法返回值)
由于al:add()返回boolean类型,若不需要该返回值,可直接调用:
declare namespace al = "java:java.util.ArrayList"; let $obj := al:new(()) return (al:add($obj,"Hello"), al:size($obj))
内容的提问来源于stack exchange,提问作者Debapriya Roy
相关产品推荐
相关产品推荐

