Risoluzione errori

di il
9 risposte

Risoluzione errori

Ciao a tutti!

Da un po' di tempo mi cimento con Java, negli ultimi giorni mi sono dedicato alle operazioni su file, in particolare sull'apertura ed analisi di file .xml.

Ho appena ultimato una classe per l'apertura, lettura e stampa di alcune informazioni da un file XML.
Durante la fase di test utilizzando un file di poche righe e poco complesso non ho riscontrato alcun problema, utilizzando però un file con più voci (670) e con più tag ho riscontrato questo errore durante l'esecuzione:

"java.lang.NullPointerException
at XMLreader1.main(XMLreader1.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Totale eventi: 670
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

|----------------------------------------------|
at java.lang.reflect.Method.invoke(Method.java:498)
Tipo di evento: info
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Sorgente: Microsoft-Windows-Kernel-General
Data di invio: 2017-06-20T00:28:09+02:00
Descrizione evento: Possibile rilevamento di CVE: 2017-06-19T22:28:09.500000000Z
Informazioni aggiuntive: 2017-06-19T19:32:30.747743200Z

Questo evento viene generato quando viene rilevato un tentativo di sfruttare una vulnerabilità nota (2017-06-19T22:28:09.500000000Z).
Questo evento viene generato da un processo in modalità utente.


|----------------------------------------------|
|----------------------------------------------|
Tipo di evento: warning
Sorgente: Microsoft-Windows-Time-Service
Data di invio: 2017-06-20T00:28:10+02:00
Descrizione evento: NtpClient: impossibile impostare un peer manuale da utilizzare come origine ora a causa di un errore di risoluzione DNS su 'time.windows.com,0x9'. Verrà eseguito un nuovo tentativo tra 15 minuti, quindi l'intervallo tra i nuovi tentativi verrà raddoppiato. Errore: Host sconosciuto. (0x80072AF9)

|----------------------------------------------|

Process finished with exit code 0"


Ho provato ad importare "java.lang.NullPointerException" ma non so come usarlo :/


Vi posto anche il codice:

"public class XMLreader1 {

public static void main(String[] args) {

try {

// creo un DocumentBuilder
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = documentFactory.newDocumentBuilder();

// ricrca del file .xml nel path specifico
Document document = builder.parse(new File("C:\\decomp\\Client Combined Log.xml"));

// conto il numero di eventi presenti nel file di log
NodeList eventi = document.getElementsByTagName("event");
System.out.println("Totale eventi: " + eventi.getLength());

// analisi dei nodi
for(int i=0; i<eventi.getLength(); i++) {

Node nodo = eventi.item(i);

if(nodo.getNodeType() == Node.ELEMENT_NODE) {

Element evento = (Element)nodo;

String tipo = evento.getElementsByTagName("type").item(0).getFirstChild().getNodeValue();
String sorgente = evento.getElementsByTagName("source").item(0).getFirstChild().getNodeValue();
String dateTempo = evento.getElementsByTagName("date-time").item(0).getFirstChild().getNodeValue();
String descrizione = evento.getElementsByTagName("description").item(0).getFirstChild().getNodeValue();

System.out.println(" |----------------------------------------------| ");
System.out.println("Tipo di evento: " + tipo );
System.out.println("Sorgente: " + sorgente );
System.out.println("Data di invio: " + dateTempo);
System.out.println("Descrizione evento: " + descrizione);
System.out.println(" |----------------------------------------------| ");
}
}

} catch (Exception e) {
e.printStackTrace();
}


}
}"

Qualcuno riesce ad aiutarmi? Grazie mille in anticipo!

9 Risposte

  • Re: Risoluzione errori

    Ragnar ha scritto:


                        String tipo = evento.getElementsByTagName("type").item(0).getFirstChild().getNodeValue();
                        String sorgente = evento.getElementsByTagName("source").item(0).getFirstChild().getNodeValue();
                        String dateTempo = evento.getElementsByTagName("date-time").item(0).getFirstChild().getNodeValue();
                        String descrizione = evento.getElementsByTagName("description").item(0).getFirstChild().getNodeValue();
    Sei sicuro che ci SIANO sempre dei dati secondo la struttura a cui cercano di arrivare queste istruzioni??

    Se per esempio sotto il <event> NON ci sono dei <source>, allora evento.getElementsByTagName("source") dà un NodeList "vuoto" e quindi item(0) è inappropriato perché restituisce null e quindi getFirstChild() su un null è ovviamente un errore.

    Se non sei sicuro che ci siano sempre quei dati, allora queste 4 righe sono inappropriate e la estrazione va fatta diversamente (in modo più attento e con test in più).

    In alternativa puoi usare la API per XPath.
  • Re: Risoluzione errori

    Ciao, effettivamente mi sono accorto che l'errore si presenta quando viene letto il tag "description", che in certi casi è "null", come faccio a gestire questo caso? Esiste un metodo? Conosci una pagina in cui posso trovare un po di documentazione a riguardo?
    Grazie mille in anticipo!
  • Re: Risoluzione errori

    Ragnar ha scritto:


    Ciao, effettivamente mi sono accorto che l'errore si presenta quando viene letto il tag "description", che in certi casi è "null", come faccio a gestire questo caso? Esiste un metodo?
    Devi semplicemente "spezzare" una riga come

    evento.getElementsByTagName("description").item(0).getFirstChild().getNodeValue();

    prendendo oggetto per oggetto e testare quello che ti aspetti di trovare.
    NodeList descriptionNodes = evento.getElementsByTagName("description");
    
    if (descriptionNodes.getLength() > 0) {      // oppure == 1 se te ne aspetti esattamente UNO
        Node firstDescription = descriptionNodes.item(0);
        
        // ecc..........
    }
    Tutto qui insomma, normalissima programmazione con un po' di "buon senso".

    Visto che questo approccio lo ripeti 4 volte, puoi anche fare un metodo apposito.
  • Re: Risoluzione errori

    Perdona la mia ignoranza...ma cosa intendi con il fatto che devo "spezzare" la riga? Non saprei come continuare la bozza di codice che mi hai accennato.
  • Re: Risoluzione errori

    Ragnar ha scritto:


    Non saprei come continuare la bozza di codice che mi hai accennato.
    Sei arrivato ad avere il item(0) ma in modo "controllato" facendo un test per vedere PRIMA se l'item 0 davvero è presente (è il codice che ho scritto io prima!).
    Il firstDescription che ho usato io è quindi sicuramente non-null. Ora devi fare il getFirstChild() e questo non è un problema (l'ho appena detto, il Node del item 0 è non-null).
    Il punto è che per fare l'ulteriore .getNodeValue() devi PRIMA verificare che getFirstChild() dia un Node non-null.
  • Re: Risoluzione errori

    NodeList descriptionNodes = evento.getElementsByTagName("description");

    if(descriptionNodes.getLength() > 0) {

    Node firstDescription = descriptionNodes.item(0);
    //firstDescription.getFirstChild();

    if (firstDescription.getFirstChild() != null) {
    descrizione = firstDescription.getNodeValue();
    }
    }

    Sono arrivato ad una conclusione del genere, non mi da più errori, però quanto stampo a video mi da "null" dove effettivamente non c'è nessun valore ma negli altri casi mi stampa una stringa vuota invece della descrizione che dovrebbe comparire.
  • Re: Risoluzione errori

    Risolto!

    if(descriptionNodes.getLength() > 0) {

    Node firstDescription = descriptionNodes.item(0);
    //firstDescription.getFirstChild();

    if (firstDescription.getFirstChild() != null) {
    descrizione = firstDescription.getFirstChild().getNodeValue();
    }
    }

    Con una variabile locale nel ciclo for "String descrizione = new String()";
  • Re: Risoluzione errori

    Ragnar ha scritto:


    Risolto!
    Visto che lo ripeti 4 volte, puoi fare un metodo apposito.

    Tipo:

    public static String getNodeValueOfFirstChildOfFirstTagByName(Element element, String tagName)


    Sì .. il nome è lungo ma almeno dà l'idea di cosa fa.
  • Re: Risoluzione errori

    Grazie per la pazienza e per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
9 risposte