/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Problemer med parsing af XML fil.
Fra : memborg


Dato : 24-07-04 09:24

Hejsa...

Jeg har prøvet på at lave en parser til min cykel.xml, men jeg får en
nullpointer exception når jeg type convertere en String til Int.
Hele koden er vedhæftet for nemheds skyld. :)

Kode:
....

public void characters(char[] ch, int start, int length) throws SAXException
   {
      if(TnavnTest == "Tnavn")
      {
         String s = new String(ch, start, length);
         Tnavn = s;
      }
      if(TaarTest == "Taar")
      {
         String s = new String(ch, start, length);
         Taar = s;
      }
      if(TdistanceTest == "Tdistance")
      {
         String s = new String(ch, start, length);
         Tdistance = s;
      }
      addTour(tourID,Tnavn,Taar,Tdistance); //Jeg er ret sikker pÃ¥ at det er
her fejlen opstår.
   }
   
   public void addTour(String id, String navn, String aar, String distance)
   {
      cm.addTour(Integer.parseInt(id),navn,aar,Integer.parseInt(distance));
   }
....

Som i kan se tror jeg fejlen sker efter addTour metoden er udført og den
skal til hente det næste element i XML filen.
Jeg kan ikke lige finde ud af hvordan jeg undgår denne fejl uden at
skulle skrive hele mit program om, så alt er gemt som Strings, men det
er mega besværligt når man skal regne med nogle af variablerne :(

Håber en kan løse dette ellers er der ikke nogen vej uden om.

MVH Memborg

PS. Hvis i vil have resten af koden, så sig lige til.




 
 
Flemming Mertz (24-07-2004)
Kommentar
Fra : Flemming Mertz


Dato : 24-07-04 09:52

Hej!

Hmm, mangler der ikke noget? Du skriver at hele koden er med, men der er en
reference til en CykelMain variabel i MyXMLReader, som jeg ikke kan finde?

Anyway, prøv at skrive tourID, Tnavn, Taar og Tdistance ud, lige inden du
kalder
addTour(tourID,Tnavn,Taar,Tdistance);
Enten med System.out.println() eller ved at kigge i variablene, hvis du har
et IDE med debugger.

Måden du konverterer en streng til et heltal ser fin nok ud, afhængigt af om
du vil have en Integer eller en int ud af det. Men det er jo heller ikke det
du får en fejl på. En null pointer excetion betyder jo at der er en variabel
der ikke indeholder noger, når du prøver at tilgå den. Hvis det ikke giver
dig svaret, når du udskriver indholdet af variablerne som beskrevet
overnfor, så prøv at poste den stacktrace der kommer når dit program fejler.

Med venlig hilsen,
Flemming Mertz



Konstantin Barkaia (24-07-2004)
Kommentar
Fra : Konstantin Barkaia


Dato : 24-07-04 19:31

Hejsa.

Jeg ved ikke om mit indlæg kommer til at løse dit problem, men fordi
String er et objekt og ikke en simpel/primitiv type er det en ret dårlig
ide at bruge == operatoren. Brug istedet for String.equals().
>
> public void characters(char[] ch, int start, int length) throws
> SAXException
> {
> if(TnavnTest == "Tnavn")
Alså:
    if(TnavnTest.equals("Tnavn"))

> {
> String s = new String(ch, start, length);
> Tnavn = s;
> }
> if(TaarTest == "Taar")
> {
> String s = new String(ch, start, length);
> Taar = s;
> }
> if(TdistanceTest == "Tdistance")
> {
> String s = new String(ch, start, length);
> Tdistance = s;
> }
> addTour(tourID,Tnavn,Taar,Tdistance); //Jeg er ret sikker på at
> det er
> her fejlen opstår.
> }
>
> public void addTour(String id, String navn, String aar, String
> distance)
> {
>
> cm.addTour(Integer.parseInt(id),navn,aar,Integer.parseInt(distance));
> }
> ...
>
> Som i kan se tror jeg fejlen sker efter addTour metoden er udført og den
> skal til hente det næste element i XML filen.
> Jeg kan ikke lige finde ud af hvordan jeg undgår denne fejl uden at
> skulle skrive hele mit program om, så alt er gemt som Strings, men det
> er mega besværligt når man skal regne med nogle af variablerne :(
>
> Håber en kan løse dette ellers er der ikke nogen vej uden om.
>
> MVH Memborg
>
> PS. Hvis i vil have resten af koden, så sig lige til.
>
>
> ------------------------------------------------------------------------
>
> import java.io.IOException;
> import java.util.HashMap;
> import java.util.Iterator;
> import org.xml.sax.Attributes;
> import org.xml.sax.ContentHandler;
> import org.xml.sax.ErrorHandler;
> import org.xml.sax.InputSource;
> import org.xml.sax.Locator;
> import org.xml.sax.Parser;
> import org.xml.sax.SAXException;
> import org.xml.sax.SAXParseException;
> import org.xml.sax.XMLReader;
> import org.xml.sax.helpers.XMLReaderFactory;
>
> public class MyXMLReader {
>
>    private String vendorParserClass = "org.apache.xerces.parsers.SAXParser";
>    
>    public MyXMLReader()
>    {}
>    
>    public void scanXML(String xmlURI) throws IOException, SAXException
>    {
>       XMLReader reader = XMLReaderFactory.createXMLReader(vendorParserClass);
>       
>       ContentHandler MyContentHandler = new MyContentHandler();
>       
>       //Register content handler
>       reader.setContentHandler(MyContentHandler);
>       //Register Error Handler
>       
>       //Parse
>       InputSource inputsource = new InputSource(xmlURI);
>       reader.parse(inputsource);
>    }
>    
> }
>
> class MyContentHandler implements ContentHandler
> {
>    private Locator locator;
>    private CykelMain cm;
>    
>    //Tour variabler
>    private String tourID;
>    private String Tnavn;
>    private String TnavnTest;
>    private String Taar;
>    private String TaarTest;
>    private String Tdistance;
>    private String TdistanceTest;
>    
>    //Rytter Variabler
>    private String Dantal;
>    private String DID;
>    private String Dnavn;
>    private String Dadresse;
>    private String Dpostnr;
>    private String Dby;
>    private String Dtlf;
>    private String Drytternr;
>    private String DsponsorID;
>    private String DSkrprkm;
>    private String DSfastkr;
>    
>    //Sponsor Variabler
>    private String Santal;
>    private String SID;
>    private String Snavn;
>    private String Sadrsse;
>    private String Spostnr;
>    private String Sby;
>    private String Stlf;
>    
>    
>    //private Map namespaceMappings;
>    
>    public MyContentHandler(){}
>    
>    //ContentHandler method implementations
>    public void setDocumentLocator(Locator locator)
>    {
>       this.locator = locator;
>    }
>    
>    public void startDocument() throws SAXException
>    {
>          
>    }
>    
>    public void endDocument() throws SAXException
>    {
>       
>    }
>    
>    public void startElement(String namespaceURI, String localeName, String qName, Attributes atts) throws SAXException
>    {
>       System.out.println(localeName);
>       
>       if(localeName == "tour")
>       {
>          //Henter attributter
>          for(int i=0; i<atts.getLength(); i++)
>          {
>             //System.out.println(atts.getLocalName(i));
>             System.out.println(atts.getValue(i));
>             
>             tourID = atts.getValue(i);
>          }
>       }
>       
>       if(localeName == "Tnavn")
>       {
>          TnavnTest = localeName;
>       }
>       if(localeName == "Taar")
>       {
>          TaarTest = localeName;
>       }
>       if(localeName == "Tdistance")
>       {
>          TdistanceTest = localeName;
>       }
>    }
>    
>    public void characters(char[] ch, int start, int length) throws SAXException
>    {
>       if(TnavnTest == "Tnavn")
>       {
>          String s = new String(ch, start, length);
>          Tnavn = s;
>       }
>       if(TaarTest == "Taar")
>       {
>          String s = new String(ch, start, length);
>          Taar = s;
>       }
>       if(TdistanceTest == "Tdistance")
>       {
>          String s = new String(ch, start, length);
>          Tdistance = s;
>       }
>       addTour(tourID,Tnavn,Taar,Tdistance);
>    }
>    
>    public void addTour(String id, String navn, String aar, String distance)
>    {
>       cm.addTour(Integer.parseInt(id),navn,aar,Integer.parseInt(distance));
>    }
>    
>    public void skippedEntity(String name) throws SAXException{}
>    
>    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException{}
>    
>    public void endElement(String namespaceURI, String localeName, String qName) throws SAXException{}
>    
>    public void startPrefixMapping(String prefix, String uri){}
>    
>    public void endPrefixMapping(String prefix){}
>    
>    public void processingInstruction(String target, String data) throws SAXException{}
> }
>
>
> ------------------------------------------------------------------------
>
> /*
> * Created on 21-07-2004
> *
> * TODO To change the template for this generated file go to
> * Window - Preferences - Java - Code Style - Code Templates
> */
>
> /**
> * @author rune
> *
> * TODO To change the template for this generated type comment go to
> * Window - Preferences - Java - Code Style - Code Templates
> */
> public class TestKlasse {
>
>    public static void main(String[] args)
>    {
>       try{
>          MyXMLReader reader = new MyXMLReader();
>          reader.scanXML(args[0]);
>       }
>       catch(Exception e)
>       {e.printStackTrace();}
>    }
> }
>
>
>
> ------------------------------------------------------------------------
>
> <?xml version="1.0" encoding="UTF-8"?>
> <cykel>
> <tour id="0">
> <Tnavn>TEST TOUR</Tnavn>
> <Taar>1999</Taar>
> <Tdistance>4500</Tdistance>
> <deltager antal="0">
>    <Dperson id="0">
>       <Dnavn></Dnavn>
>       <Dadresse></Dadresse>
>       <Dpostnr></Dpostnr>
>       <Dby></Dby>
>       <Dtlf></Dtlf>
>       <Dvoksen></Dvoksen>
>       <Drytternr></Drytternr>
>       <Dsponsorid id="0">
>          <DSkrprkm></DSkrprkm>
>          <DSfastkr></DSfastkr>
>       </Dsponsorid>   
>    </Dperson>
> </deltager>
> <sponsor antal="0">
>    <Soplysning id="0">
> <Sponsornavn></Sponsornavn>
> <Sadresse></Sadresse>
> <Spostnr></Spostnr>
> <Sby></Sby>
> <Stlf></Stlf>
> </Soplysning>
> </sponsor>
> </tour>
> </cykel>
>

Peter Kjellerup Rasm~ (24-07-2004)
Kommentar
Fra : Peter Kjellerup Rasm~


Dato : 24-07-04 21:17

Konstantin Barkaia wrote:
> Hejsa.
>
> Jeg ved ikke om mit indlæg kommer til at løse dit problem, men fordi
> String er et objekt og ikke en simpel/primitiv type er det en ret dårlig
> ide at bruge == operatoren. Brug istedet for String.equals().
Og lidt mere uddybende er det fordi == sammenligner de to objekter og
ikke indholdet. Objekterne er normalt forskellige selvom den tekst de
indeholder er forskellige.
Eksempel:
public static void main(String[] args) {
String test1 = new String("string");
String test2 = new String("string");

if (test1 == test2) {
System.err.println("Objekterne er ens!");
} else {
System.err.println("Objemterne er _ikke_ ens!");
}
if (test1.equals(test2)) {
System.err.println("Stringene er ens!");
} else {
System.err.println("Stringene er _ikke_ ens!");
}
}

>> Som i kan se tror jeg fejlen sker efter addTour metoden er udført og den
>> skal til hente det næste element i XML filen.
Det der tilsyneladende er problemet er, at parseInt forventer at den
string den får med som argument er valid. Hvis den ikke er det (det kan
være at den er null, eller hvis den indeholder andet end tal) så smider
den en exception.

Prøv at udskrive værdien af den string du vil konvertere lige inden du
konverterer. SÃ¥ vil du nok kunne se hvad der er galt.

Ellers så prøv med nogle flere udskrifter af hvad der kommer af outputs
fra dit program og post dem her.

mvh
Peter

Memborg (09-08-2004)
Kommentar
Fra : Memborg


Dato : 09-08-04 22:30


Undskyld jeg ikke svare før nu, men mit news program har drillet og ville
ikke poste indlæg. Har installeret et nyt.

Først vil jeg sige tak for jeres forslag. Det er nogle gode forslag :)
Jeg løst nogle af fejlene. Istedet for at gemme direkte i en variable har
jeg lagt hver enkelt element fra f.eks tour i en String tabel også sat
hver enkelt variable tom. Jeg kan godt se hvad du mener med "==" ikke
tester korrekt, men indtil videre virker det.

Ved lagt kode:

public void characters(char[] ch, int start, int length) throws SAXException
   {
      String s = new String(ch, start, length);
         if(TnavnTest == "Tnavn")
         {
            //String s = new String(ch, start, length);
            Tnavn = s;
            System.out.println("Tnavn: "+Tnavn);
            tourTabel[1]=Tnavn;
         }
         TnavnTest = null;
         if(TaarTest == "Taar")
         {
            //String s = new String(ch, start, length);
            Taar = s;
            System.out.println("Taar: "+Taar);
            tourTabel[2]=Taar;
         }
         TaarTest= null;
         if(TdistanceTest == "Tdistance")
         {
            //String s = new String(ch, start, length);
            Tdistance = s;
            System.out.println("Tdistance: "+ Tdistance);
            tourTabel[3]=Tdistance;
            
            for(int i = 0;i<=3;i++)
            {
               System.out.println("Tabelindhold: "+ tourTabel[i]);
            }
            
            addTour(tourTabel[0],tourTabel[1],tourTabel[2],tourTabel[3]);
         }
         TdistanceTest=null;   
   }
   
   public void addTour(String id, String navn, String aar, String distance)
   {
      int tmp1 = Integer.parseInt(id);
      int tmp2 = Integer.parseInt(distance);
      System.out.println(tmp2 +" "+ navn +" "+ aar +" "+ tmp2);
      //System.out.println("Størelse: "+cm.tourList.size());
      cm.addTour(tmp1,navn,aar,tmp2); // Fejl sker her....
      System.out.println("Størelse: "+cm.tourList.size());
   }
ARGH!! mens jeg skriver dette har jeg siddet kigget på min kode og jeg
har glemt at lave en instance af CykelMain

Jeg havde bare skrevet "CykelMain cm;" men jeg mangler jo "cm = new
CykelMain();"

Nu har jeg bare et spørgsmål... Hvordan undgår jeg at den bliver
overskrevet når jeg gør det samme i en anden klasse

public class CykelProgram_GUI extends javax.swing.JFrame
{
   private CykelMain cm;
   static boolean Voksen = false;
   static int rytterID;
   static int tourID;
   static int sponsorID;
   /** Creates new form CykelProgram_GUI */
   public CykelProgram_GUI()
   {
      cm = new CykelMain();
      initComponents();
   }

Eller sker det ikke... ? Er lidt usikker på hvordan det helt præcist
virker.

MVH Memborg

Thorbjoern Ravn Ande~ (29-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 29-08-04 16:50

Memborg <memborg@tdcadsl.dk> writes:

>          if(TnavnTest == "Tnavn")

Du skal nok lige læse på String.equals.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408920
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste