gpt4 book ai didi

java - Pattern.compile 破坏了 XStream

转载 作者:行者123 更新时间:2023-12-01 14:11:47 26 4
gpt4 key购买 nike

在读取 XStream 库生成的文件并对结果使用 Patter.compile 时,我观察到了非常奇怪的行为运行时它给出空指针异常但是如果我在 Debug模式下逐步运行它它工作正常。
我将其范围缩小到 Pattern.complie 如果我只是将值读取到字符串变量,它就可以正常工作,如果我将 Pattern.complie(".*") 与 unmarshal 方法一起使用,它也可以正常工作
我使用 Java 7 和 XStream 1.4.4
我认为这是由于 reader.getAttribute("key") 返回 null 而不是在调试时返回知道为什么会发生这种情况吗?
这是我所拥有的:
我的类(class)

import java.util.regex.Pattern;
public class A {
private Pattern key;
ArrayList<A> subTree;
public A(HierarchicalStreamReader reader, UnmarshallingContext context){
this.key=Pattern.compile(reader.getAttribute("key"));
// String a = reader.getAttribute("key") - Works fine
// this.key=Pattern.compile(a) - Breaks
subTree=new ArrayList<A>();
reader.moveDown();
while(reader.hasMoreChildren()) {
subTree.add(new A(reader,context));
}
reader.moveUp();
}
}

XStream转换器类

public class AConverter implements Converter {
public boolean canConvert(Class clazz) {
return A.class.isAssignableFrom(clazz);
}

public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {

}

public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
reader.moveDown();
A n = new A(reader,context);
reader.moveUp();
return n;
}

}

测试用例

public void testA() throws FileNotFoundException, IOException, ClassNotFoundException{
XStream xstream = new XStream();
xstream.alias("MessageFieldMappings", A.class);
xstream.registerConverter(new AConverter());
ObjectInputStream in = xstream.createObjectInputStream(new FileInputStream("test1.xml"));
A rootNode = (A) in.readObject();
in.close();

}

测试文件(test1.xml)

<object-stream>
<MessageFieldMappings>
<RootMapping>
<FieldMap key=".*">
<FieldMap key="A.*">
<FieldMap key="AB.*"/>
<FieldMap key="AC.*"/>
</FieldMap>
<FieldMap key="D.*"/>
</FieldMap>
</RootMapping>
</MessageFieldMappings>
</object-stream>

我得到的错误

com.thoughtworks.xstream.converters.ConversionException: null : null
---- Debugging information ----
cause-exception : java.lang.NullPointerException
cause-message : null
class : nz.orion.monkPraser.praser.fieldConverter.A
required-type : nz.orion.monkPraser.praser.fieldConverter.A
converter-type : nz.orion.monkPraser.praser.fieldConverter.AConverter
path : /MessageFieldMappings/RootMapping
line number : 3
version : null
-------------------------------
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79)
...

最佳答案

线索就在

path                : /MessageFieldMappings/RootMapping
line number : 3

您已将 MessageFieldMappings 别名为 A 类,因此当它看到 MessageFieldMappings 时,它将调用转换器,该转换器将 moveDownRootMapping 元素并尝试从中提取 key 属性。它没有,因此有 NPE。

您需要在转换器中进行额外的下移/上移级别:

reader.moveDown(); // RootMapping
reader.moveDown(); // First FieldMap
A n = new A(reader,context);
reader.moveUp();
reader.moveUp();
return n;

关于java - Pattern.compile 破坏了 XStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18481402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com