You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:36:04