简体   繁体   English

DOM元素作为参数传递给构造函数时,抛出NullPointer异常

[英]DOM Element throws NullPointer Exception when Passed into Constructor as Argument

I'm using two classes to parse an XML Document using the DOM parser. 我正在使用两个类使用DOM解析器来解析XML文档。 A sample element "Object" looks like this: 示例元素“对象”如下所示:

<Object type="0x632" id="Fire Golem">
    <Group>Golems</Group>
    <Enemy/>
    <Class>Character</Class>
    <AnimatedTexture><File>chars8x8rMid</File><Index>0x0e</Index></AnimatedTexture>
    <HitSound>monster/golems_hit</HitSound>
    <DeathSound>monster/golems_death</DeathSound>
    <Size>140</Size>
    <MaxHitPoints>220</MaxHitPoints>
    <Defense>3</Defense>
    <Terrain>MidSand</Terrain>
    <XpMult>0.7</XpMult>
    <SpawnProb>1.0</SpawnProb>

    <Projectile id="0">
        <ObjectId>Red Fire</ObjectId>
        <Damage>35</Damage>
        <Speed>45</Speed>
        <LifetimeMS>4500</LifetimeMS>
        <Size>100</Size>
    </Projectile>
    <Projectile id="1">
        <ObjectId>Red Fire</ObjectId>
        <Damage>45</Damage>
        <Speed>60</Speed>
        <LifetimeMS>2500</LifetimeMS>
        <Size>220</Size>
    </Projectile>


</Object>

I'm using 2 Classes to parse the XML, one to get Elements like this, and another to parse these elements. 我正在使用2个类来解析XML,一个类来获取这样的Elements,另一个来解析这些元素。

eList = root.getElementsByTagName("Object");
        for(int i = 0, len = eList.getLength();i<len;i++){
            Element elem = (Element)eList.item(i);
            Element sub=(Element)elem.getElementsByTagName("Class").item(0);

            //Doesn't Contain Element 'Class'? No Entry!
            if(sub.equals(null))
                continue;

            //Get Object Attributes
            String Class = sub.getTextContent();
            short type = (short)Util.getInt(elem.getAttribute("type"));
            String id = elem.getAttribute("id");
            System.out.println(Class+" "+type+" "+id);
            //Categorizing
            //Sellable
            if(Class.equalsIgnoreCase("Equipment")||Class.equalsIgnoreCase("Dye")||Class.equalsIgnoreCase("Pet")){
                ItemDescs.put(type, Desc.new Item(elem));
                //Set Up Shop Locations and Prices
                if((sub = (Element)elem.getElementsByTagName("Shop").item(0))!=null){
                    ItemShops.put((int)type, sub.getElementsByTagName("Name").item(0).getTextContent());
                    ItemPrices.put(type, Util.getInt(sub.getElementsByTagName("Price").item(0).getTextContent()));
                }
            }

            //Game Pieces
            if(Class.equalsIgnoreCase("Character")||Class.equalsIgnoreCase("GameObject")||Class.equalsIgnoreCase("Wall")||
                    Class.equalsIgnoreCase("ConnectedWall")||Class.equalsIgnoreCase("CaveWall")||Class.equalsIgnoreCase("Portal")){
                Descriptors.ObjectDesc Piece = Desc.new ObjectDesc(elem); //NullPointerException Thrown Here
                ObjectDescs.put(type, Piece);
            }


            //Portals
            if(Class.equalsIgnoreCase("Portal")){
                PortalDescs.put(type, Desc.new PortalDesc(elem));
            }

            //Keys
            if((sub = (Element)elem.getElementsByTagName("Key").item(0))!=null){
                Keys.add(type);
                KeyPrices.put(type, Util.getInt(sub.getTextContent()));
            }
        }

And another class inside the class Descriptor is used for parsing the above Object: 类描述符中的另一个类用于解析上述对象:

    class Descriptors{
      public class ObjectDesc{
    public short ObjectType;
    public String ObjectId;
    public String DisplayId;
    public String Group;
    public String Class;
    public boolean Player;
    public boolean Enemy;
    public boolean OccupySquare;
    public boolean FullOccupy;
    public boolean EnemyOccupySquare ;
    public boolean Static;
    public boolean NoMiniMap ;
    public boolean ProtectFromGroundDamage;
    public boolean ProtectFromSink;
    public boolean Flying;
    public boolean ShowName;
    public boolean DontFaceAttacks;
    public int MinSize;
    public int MaxSize;
    public int SizeStep;
    public ProjectileDesc[] Projectiles;

    public int MaxHP;
    public int Defense;
    public String Terrain;
    public float SpawnProbability;
    public SpawnCount Spawn;
    public boolean Cube;
    public boolean God;
    public boolean Quest ;
    public int Level;
    public boolean StasisImmune;
    public boolean Oryx ;
    public boolean Hero ;
    public Integer PerRealmMax ;
    public Float ExpMultiplier ;    //Exp gained = level total / 10 * multi

    public ObjectDesc(Element elem){
        Element sub;
        ObjectType = (short)Util.getInt(elem.getAttribute("type"));
        ObjectId = elem.getAttribute("id");
        Class = elem.getElementsByTagName("Class").item(0).getTextContent();
        if((sub =(Element)elem.getElementsByTagName("Group").item(0))!=null)
            Group = sub.getTextContent();
        else
            Group = null;
        if((sub = (Element)elem.getElementsByTagName("DisplayId").item(0))!=null)
            DisplayId = sub.getTextContent();
        else
            DisplayId = null;

        Player = elem.getElementsByTagName("Player").getLength()!=0;
        Enemy = elem.getElementsByTagName("Enemy").getLength()!=0;
        OccupySquare = elem.getElementsByTagName("OccupySquare").getLength()!=0;
        FullOccupy = elem.getElementsByTagName("FullOccupy").getLength()!=0;
        EnemyOccupySquare = elem.getElementsByTagName("EnemyOccupySquare").getLength()!=0;
        Static = elem.getElementsByTagName("Static").getLength()!=0;
        NoMiniMap = elem.getElementsByTagName("NoMiniMap").getLength()!=0;
        ProtectFromGroundDamage = elem.getElementsByTagName("ProtectFromGroundDamage").getLength()!=0;
        ProtectFromSink = elem.getElementsByTagName("ProtectFromSink").getLength()!=0;
        Flying = elem.getElementsByTagName("Flying").getLength()!=0;
        ShowName = elem.getElementsByTagName("ShowName").getLength()!=0;
        DontFaceAttacks = elem.getElementsByTagName("DontFaceAttacks").getLength()!=0;

        if ((sub = (Element)elem.getElementsByTagName("Size").item(0)) != null)
        {
            MinSize = MaxSize = Util.getInt(sub.getTextContent());
            SizeStep = 0;
        }
        else
        {
            if ((sub = (Element)elem.getElementsByTagName("MinSize").item(0)) != null)
                MinSize = Util.getInt(sub.getTextContent());
            else
                MinSize = 100;
            if ((sub = (Element)elem.getElementsByTagName("MaxSize").item(0)) != null)
                MaxSize = Util.getInt(sub.getTextContent());
            else
                MaxSize = 100;
            if ((sub = (Element)elem.getElementsByTagName("SizeStep").item(0)) != null)
                SizeStep = Util.getInt(sub.getTextContent());
            else
                SizeStep = 0;
        }

        List<ProjectileDesc> prj = new ArrayList<ProjectileDesc>();
        NodeList nSub;
        nSub=elem.getElementsByTagName("Projectile");
        for(int i=0;i<nSub.getLength();i++){
            prj.add(new ProjectileDesc((Element)nSub.item(i)));
        }
        Projectiles = (ProjectileDesc[])prj.toArray();

    if((sub = (Element)elem.getElementsByTagName("MaxHitPoints").item(0)) != null)
        MaxHP = Util.getInt(sub.getTextContent());
    if ((sub = (Element)elem.getElementsByTagName("Defense").item(0)) != null)
        Defense = Util.getInt(sub.getTextContent());
    if ((sub = (Element)elem.getElementsByTagName("Terrain").item(0)) != null)
        Terrain = sub.getTextContent();
    if ((sub = (Element)elem.getElementsByTagName("SpawnProbability").item(0)) != null)
        SpawnProbability = Float.parseFloat(sub.getTextContent());
    if ((sub = (Element)elem.getElementsByTagName("Spawn").item(0)) != null)
        Spawn = new SpawnCount(sub);

    StasisImmune = elem.getElementsByTagName("StasisImmune").getLength() !=0;
    Oryx = elem.getElementsByTagName("Oryx").getLength() !=0;
    Hero = elem.getElementsByTagName("Hero").getLength() !=0;

    if ((sub = (Element)elem.getElementsByTagName("PerRealmMax").item(0)) != null)
        PerRealmMax = Util.getInt(sub.getTextContent());
    else
        PerRealmMax = null;

    if ((sub = (Element)elem.getElementsByTagName("XpMult").item(0)) != null)
        ExpMultiplier = Float.parseFloat(sub.getTextContent());
    else
        ExpMultiplier = null;

    }       
}
  }

The above code throws a NullPointer Exception, when the 'Object' Element is sent as an argument to the constructor of ObjectDesc, although, I can get the Attributes and Fields in the First Class. 尽管将“对象”元素作为参数发送给ObjectDesc的构造函数,但上面的代码引发NullPointer异常,但是,我可以在第一类中获取属性和字段。 JAXB seemed to be the right choice for parsing these documents, but I discovered them after I spent 2 days coding this Horror. JAXB似乎是解析这些文档的正确选择,但是在花了两天时间编写此Horror之后,我才发现它们。 Stack Trace: 堆栈跟踪:

java.lang.NullPointerException
at com.azuro.ultraserve.db.data.XMLData.ProcessXml(XMLData.java:150)
at com.azuro.ultraserve.db.data.XMLData.ReadXMLs(XMLData.java:69)
at com.azuro.ultraserve.db.data.XMLData.<clinit>(XMLData.java:59)
       if(sub.equals(null))
            continue;

Is not the way to check for a null. 不是检查null的方法。 This code will throw a NullPointerException if sub is null. 如果sub为null,则此代码将引发NullPointerException。

What you want here is 你想要的是

       if(sub == null)
            continue;

Now that I see which line your NullPointerException is occurring at though, this is likely not the cause of the issue you're seeing. 现在,我看到您的NullPointerException发生在哪一行,这很可能不是您所看到的问题的原因。 The line causing the NullPointerException is: 导致NullPointerException的行是:

           Descriptors.ObjectDesc Piece = Desc.new ObjectDesc(elem); 

This most likely means that your Desc variable is null rather than an actual Descriptors object. 这很可能意味着您的Desc变量为null,而不是实际的Descriptors对象。 As ObjectDesc is a non-static inner class of Descriptors , you need such an object in order to call the inner constructor. 由于ObjectDesc是Descriptors的非静态内部类,因此需要这样的对象才能调用内部构造函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM