【问题标题】:Pattern.complie breaks XStreamPattern.compile 中断 XStream
【发布时间】:2013-08-28 07:07:33
【问题描述】:

我在读取 XStream 库生成的文件并在结果上使用 Patter.compile 时观察到非常奇怪的行为 运行时会出现空指针异常但如果我在调试模式下逐步运行它,它工作正常
我已将其缩小到 Pattern.complie 如果我只是将值读取到一个字符串变量,它工作正常,如果我使用 Pattern.complie(".*") 和 unmarshal 方法,它也工作正常
我使用 Java 7 和 XStream 1.4.4
我认为这是由于 reader.getAttribute("key") 返回 null 但不是在调试时 知道为什么会这样吗?
这是我所拥有的:
我的课

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)
...

【问题讨论】:

    标签: java regex eclipse serialization xstream


    【解决方案1】:

    线索在

    path                : /MessageFieldMappings/RootMapping
    line number         : 3
    

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

    您需要在转换器中额外增加一个 moveDown/Up 级别:

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

    【讨论】:

    • 是的,这很明显,我不知道我是怎么错过的。非常感谢您的时间!我猜我的调试器可能忽略了 NullPointer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多