Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [java] Exception in thread "main" java.lang.NullPointerException

    codice:
    import java.awt.HeadlessException;
    import java.io.*;
    import javax.swing.JOptionPane;
    
    
    public class	xmlparsing{
    	public static void main(String args[]) throws HeadlessException, FileNotFoundException, IOException{
    		FileReader xmlStart = new FileReader(JOptionPane.showInputDialog(null, "Inserisci in nome del file da modificare seguito dall'estensione .xml"));		
    		BufferedReader in = new BufferedReader(xmlStart);
    FileWriter xmlMd = new FileWriter(JOptionPane.showInputDialog(null, "Inserisci in nome del file contenente i metadati seguito dall'estensione .xml"));	
    		BufferedWriter outMd = new BufferedWriter(xmlMd);
    																
    		FileWriter xmlData = new FileWriter(JOptionPane.showInputDialog(null, "Inserisci in nome del file contenente i dati seguito dall'estensione .xml"));
    		BufferedWriter outData = new BufferedWriter(xmlData);
    String inputline = in.readLine();
    		inputline.trim();
    char firstCh = inputline.charAt(1);
    		
    		switch (firstCh){
    			case '-':
    				outMd.close();
    				break;
    			case '<':
    				outData.write(inputline);
    				outData.newLine();
    				break;
    			default:
    				int index = inputline.indexOf(':');						
    				String stringTag  = inputline.substring(1, index);		
    				String stringValue = inputline.substring(index+2);		
    				outMd.write('<');									
    				outMd.write(stringTag);								
    				outMd.write(">");									
    				outMd.write(stringValue);
    				outMd.write("</");
    				outMd.write(stringTag);
    				outMd.write(">");
    				outMd.newLine();										
    				break;
    		}
    		outData.close();
    	}	
    }
    ho scritto questo codice che dovrebbe aprire un file .xml esistente, leggerne il contenuto e riscriverlo su altri due file .xml
    quando lo eseguo, mi compare questo messaggio in console :
    "Exception in thread "main" java.lang.NullPointerException
    at xmlparsing.main(xmlparsing.java:21)"

    non sono un esperto di java pertanto se qualcuno riesce a chiarirmi la cosa, gliene sarei davvero grato.

    l due nuovi file vengono creati, ma non viene scritto nulla all'interno...

    grazie a tutti...

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    L'errore indica un puntatore nullo. Chiudi uno stream che per qualche ragione non viene mai aperto (ovvero l'oggetto outMd).

    Prova ad inserire showInputDialog prima della creazione dell'oggetto..usa una stringa per memorizzare il valore inserito insomma.

    Tieni presente un dato importante comunque:

    codice:
    FileReader xmlStart = new FileReader(JOptionPane.showInputDialog(null, "Inserisci in nome del file da modificare seguito dall'estensione .xml"));		
    BufferedReader in = new BufferedReader(xmlStart);
    Questo stream leggerà il file che ha il nome passato in input..ma il file deve essere presente su disco!

    PS: Il primo carattere è in posizione 0, non 1.

  3. #3
    grazie per la pronta risposta.

    ho fatto così
    codice:
    String nameDat = JOptionPane.showInputDialog(null, "Inserisci in nome del file contenente i dati seguito dall'estensione .xml");
    		FileWriter xmlData = new FileWriter(nameDat);
    		BufferedWriter outData = new BufferedWriter(xmlData);
    		String nameMd = JOptionPane.showInputDialog(null, "Inserisci in nome del file contenente i metadati seguito dall'estensione .xml");
    		FileWriter xmlMd = new FileWriter(nameMd);	
    		BufferedWriter outMd = new BufferedWriter(xmlMd);
    ma nn è cambiato nulla. compare sempre lo stesso errore

    subito dopo questa porzione c'è un 2"line breakpoint - main (String[])

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ma sei certo che il file si trovi nel path da te indicato (dove risiede il programma in questo caso)?

  5. #5
    si...al 100%

    i nuovi files xmlMD ed xmlDat vengono creati ma non viene scritto nulla poiché il programma si arresta, dando l'errore specificato precedentemente, prima di entrare nello switch

    sinceramente nn riesco a capirne il perché

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ora mi trovo a casa... Puoi ripostare il codice? (con le modifiche attuali ovviamente)

  7. #7
    allora, ho apportato delle modifiche al codice e non mi da più errore. Pero non viene scritto nulla nei nuovi file che vengono comunque creati.
    codice:
    import java.awt.HeadlessException;
    import java.io.*;
    import javax.swing.JOptionPane;
    
    
    public class	xmlparsing{
    	public static void main(String[] args) throws HeadlessException, FileNotFoundException, IOException{
    		FileReader xmlStart = new FileReader(JOptionPane.showInputDialog(null, "Inserisci in nome del file da modificare seguito dall'estensione .xml"));		
    		BufferedReader inStart = new BufferedReader(xmlStart);
    
    		String nameDat = JOptionPane.showInputDialog(null, "Inserisci in nome del file contenente i dati seguito dall'estensione .xml");
    		FileWriter xmlData = new FileWriter(nameDat);
    		BufferedWriter outData = new BufferedWriter(xmlData);
    
    		String nameMd = JOptionPane.showInputDialog(null, "Inserisci in nome del file contenente i metadati seguito dall'estensione .xml");
    		FileWriter xmlMd = new FileWriter(nameMd);	
    		BufferedWriter outMd = new BufferedWriter(xmlMd);	
    		
    		String inputline = inStart.readLine();
    		if (inputline == null){
    			xmlStart.close();
    		}else{
    		inputline.trim();		
    		char firstCh = inputline.charAt(0);	
    		
    		switch (firstCh){
    			case '-':
    				outMd.close();
    				break;
    			case '<':
    				outData.write(inputline);
    				outData.newLine();
    				break;
    			default:
    				int index = inputline.indexOf(':');
    				String stringTag  = inputline.substring(1, index);
    				String stringValue = inputline.substring(index+2);
    				outMd.write('<');	
    				outMd.write(stringTag);	
    				outMd.write(">");									
    				outMd.write(stringValue);
    				outMd.write("</");
    				outMd.write(stringTag);
    				outMd.write(">");
    				outMd.newLine();										
    				break;
    		}
    		outData.close();
    		}
    	}	
    }
    vi è un breakpoint nella linea che precede
    codice:
    String inputline = inStart.readLine();
    quindi l'esecuzione si ferma lì, ma non capisco perché

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Non capisco che ti aspetti di trovare...
    Quello che voglio dire è che io la prima riga la vedo! Ovviamente quello dei metadati è vuoto.

    Appena inizia il programma legge la prima riga, il primo carattere corrisponde quasi sicuramente a '<' quindi stampa tutta la stringa nel file...e poi termina il programma. Dipende da che vuoi creare tu

  9. #9
    il file xmlStart è un xml un po' particolare. te ne posto uno di esempio
    codice:
     Concept: Contour Shape
     Instance: corpo_cm
     Descriptor: forma_di_D
     -------------------------------- 
    
    <?xml version='1.0' encoding='ISO-8859-1' ?>
    <Mpeg7 xmlns = "urn:mpeg:mpeg7:schema:2001" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "urn:mpeg:mpeg7:schema:2001 schema/Mpeg7-2001.xsd"><DescriptionUnit xsi:type = "DescriptorCollectionType"><Descriptor xsi:type = "ContourShapeType"><Region><RegionNumber>255</RegionNumber>
    <GlobalCurvature>7  4 </GlobalCurvature>
    <PrototypeCurvature>1  4 </PrototypeCurvature>
    <HighestPeakY>21</HighestPeakY>
    <Peak peakX = "10" peakY = "6"/>
    <Peak peakX = "14" peakY = "1"/>
    <Peak peakX = "61" peakY = "7"/>
    <Peak peakX = "1" peakY = "5"/>
    <Peak peakX = "13" peakY = "7"/>
    <Peak peakX = "5" peakY = "6"/>
    <Peak peakX = "3" peakY = "7"/>
    </Region>
    </Descriptor>
    </DescriptionUnit>
    </Mpeg7>
    quello che intendo fare è scrivere le prime 3 righe nel file metadati che dovrebbe venire così:
    codice:
    <Concept>Contour Shape</Concept>
    <Instance>corpo_cm</Instance>
    <Descriptor>forma_di_D</Descriptor>
    successivamente cancellare la riga coi trattini e quella bianca e copiare le stringhe seguenti nel file dati.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il tuo problema penso venga causato dal lancio di un eccezione che interrompe l'esecuzione del programma; in poche parole va sicuramente a leggere un carattere che non esiste (il file metadati infatti verra' scritto, ma l'altro no..in quanto c'è una favolosa riga vuota nel mezzo).

    L'ho riscritto così, non differisce molto dal tuo:
    codice:
    import java.io.*;
    
    class FileXML {
      private BufferedWriter metadati,contenuto;
      private BufferedReader lettura;
      
      FileXML(String xml, String metadatiName, String contenutoName) {
        
        try {
          lettura = new BufferedReader(new FileReader(xml));
          contenuto = new BufferedWriter(new FileWriter(contenutoName));
          metadati = new BufferedWriter(new FileWriter(metadatiName));
        } catch(IOException e) {e.printStackTrace();}
      
      }
      
      void analizza() {
        String riga = "";
        
        try {
          while((riga = lettura.readLine()) != null) {
            // Ripete la lettura (in pratica evita di proseguire il ciclo).
            // Questo accade solamente quando la riga che si sta leggendo e' vuota
            if(riga.equals("")) continue;
            riga = riga.trim();
            
            switch(riga.charAt(0)) {
              case '-':
              // Non eseguo alcuna istruzione
              break;
              case '<':
              contenuto.write(riga);
              contenuto.newLine();
              break;
              default:
              int punti = riga.indexOf(':');
            
              metadati.write("<"+riga.substring(0,punti)+">");
              metadati.write((riga.substring(punti+1).trim()));
              metadati.write("<"+riga.substring(0,punti)+"/>");
              metadati.newLine();
              break;
            }
          }
          
            lettura.close();
            contenuto.flush();
            contenuto.close();
            metadati.flush();
            metadati.close();
        } catch(IOException e) {e.printStackTrace();}
      }
    }
    
    class TestXML {
      public static void main(String[] args) {
        if(args.length != 3) {
          System.out.println("Usage: java <xmlfile> <metadatiFile> <contenutoFile>");
          System.exit(1);
        }
      
        FileXML fileXML = new FileXML(args[0],args[1],args[2]);
        fileXML.analizza();
      }
    }
    In questo modo legge tutto il file, e termina solamente alla fine.

    Inibire le eccezioni comunque non permette di trovare questi problemini

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.