Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Lettura e scrittura NullPointer

    Vi prego di darmi una mano. Dovrei leggere un file xml e prendere dei nomi da questo. Vi pregherei di scaricare l' xml al primo link di questo sito:

    http://www.drugbank.ca/downloads


    Il senso del codice sarebbe, finchč non trovi questa stringa "<drug-interaction>" continua a leggere, poi avanza di due righe e salva il nome di una stringa. Se eseguite il codice vi verrą fuori una nullpointerException che non mi so spiegare....se cercate nell' xml il nome precedente all' eccezione, cercando "<name>Simvastatin</name>" si vede che non č finito il file, perchč ho un nullpointerexception nel ciclo
    codice:
    while((line.indexOf("<drug-interaction>"))==-1){
    ?

    Il codice č questo:

    codice:
    import java.io.*;
    
    
    public class Prova{
    	
    	public static void main(String [] args)
    	{
    		
    		try{
    			
    			String line="";
    			
                            BufferedReader reader = new BufferedReader(new FileReader("drugbank.xml"));
    
    			int tot=0;  //Conterrą il numero di righe del file
    			
    			while((line=reader.readLine())!=null){
    				tot=tot+line.length();
    			}
    			
    			reader = new BufferedReader(new FileReader("drugbank.xml"));
    			
    			line=reader.readLine();
    			
    			while(reader.ready()){
    				
    					String namegene="";
    					String namedrug="";
    					boolean founded=false; //boolean per ricerca partner id
    					boolean match=false;   //bool confrtonto nomi bio4j e drugbank.xml
    					int position=0;   //per riavvolgere il buffer
    					int start, end=0;
    					boolean hastarget=false;   //Non tutti i drug hanno dei target
    				
    					while((line.indexOf("<drug-interaction>"))==-1){   //scorro fino ad avere un drug
    		
    						if(tot-position==0)
    							System.exit(0);        //FINE FILE, DRUG CONTROLLATI
    						
    						line=reader.readLine();
    						
    						//position=position+line.length();
    					}
    					
    					//position=position+line.length();
    					line=reader.readLine();
    					//position=position+line.length();
    					line=reader.readLine();
    					//position=position+line.length();
    					
    					start=line.indexOf("<name>")+6;
    					end=line.indexOf("</name>");
    					
    					namedrug+=line.substring(start, end);
    					
    					System.out.println("namedrug is "+namedrug+'\n');
    			
    						}
    				
    				
    		    reader.close();
    		}
    				
    		   catch(IOException e){System.out.println("Errore IO");}
    		   
    	}
    }

  2. #2
    Fare il parsing di un file XML in questa maniera č un pochetto... barbaro diciamo Usa le apposite classi di Java per il parsing dell'XML (credo sia incluso sia un parser DOM che uno SAX).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ok grazie, peroverņ a sistemare. Aldilą di questo sapresti individuare il perchč di un possibile nullpointer? Non so se č correlato a parsing.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Beh... questo pezzo di codice č sicuramente sbagliato:
    codice:
    while((line.indexOf("<drug-interaction>"))==-1){   //scorro fino ad avere un drug
    
       if(tot-position==0)
          System.exit(0);        //FINE FILE, DRUG CONTROLLATI
    
       line=reader.readLine();
    						
       //position=position+line.length();
    }
    Supponendo di essere arrivati all'ultimo "<drug-interaction>", cosa succede DOPO? Succede che il file continua ad essere letto fino alla fine. Quindi verrą eseguita ancora la riga di codice della lettura ( line = reader.readLine() ), ma a questo punto, la stringa "line" non conterrą mai pił il tag "<drug-interaction>", quindi tu continuerai ad iterare su quel while. Quando anche l'ultima riga del file č stata letta, l'invocazione successiva di readLine() ritornerą "null" ecco il tuo NullPointerException: sei ancora dentro al while e, anche dopo l'ultima readLine() continui a verificare se line.indexOf("..."), ma "line" ora č nullo perchč il file č finito.

    Non č quello il modo di controllare le letture dal file: quando si legge un file in modo iterativo si deve sempre controllare, dopo ciascuna readLine() che la riga letta non sia nulla.


    Ciao.
    "Perchč spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Si ma č strano.....se io scrivo una cosa del genere:

    codice:
    		while(reader.ready()){
    				line=reader.readLine();
    				tot++;
    				System.out.println(tot);
    			}
    Mi dovrebbe stampare il numero di righe dell' xml........cioč 9000 e qualcosa. Il contatore supera i 20000....
    Facendo delle prove con 10-15 righe funziona, ma stranamente se le righe sono di pił il contatore non va pił....

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    A dire la veritą il file XML che hai linkato č mastodontico (94 MB), quindi sono sicuramente ben pił di 9.000 righe... precisamente sono 2.029.593 righe (l'ho aperto con Context e, per sicurezza, mi sono scritto un programma di calcolo delle righe: coincidono).

    Ma non capisco cosa c'entri il numero di righe del file con quello che stai facendo... stai cercando determinati tag... bene, ogni tag ha anche la sua controparte di chiusura (che potrebbe essere sulla stessa riga, ma questo riguarda solo determinati tag, altri sono aperti su una riga e chiusi su un'altra) e verso la fine del file ci sono solo tag di chiusura di elementi aperti precedentemente. Quindi, il numero di righe del file non c'entra assolutamente nulla con quello che stai facendo tu (infatti, mi domando perchč ne conti le righe all'inizio ).

    Ciao.
    "Perchč spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Si alla fine ho risolto sistemando meglio la lettura. Ora avrei un altro problema, legato all' uso dei metodi mark() e reset() della classe BufferedReader. Il primo prende un intero....ma ho un' eccezione di marcatura invalida. Sorvolando su quello che fa il codice la uso qui:
    In sostanza ho una variabile position che incremento con la lunghezza della stringa corrente per sapere a che punto sono arrivato nella lettura. Ammesso che sia giusto.

    codice:
    while(!(line.equals("      <drug-interaction>"))){	//Finchč non inizia un nuovo drug devo controllare tutti i target
    				
    		line=reader.readLine();
    	        position=position+line.length();
    			
    		if((line.equals("    <targets>")))
    		{
    		        line=reader.readLine();
    			position=position+line.length();
    			reader.mark(position);
    									
    		 start =line.indexOf("partner")+9;   //indici sottostringa che contiene id del target partner
    			 end=line.indexOf(">")-1;
    			String partner=line.substring(start,end);
    		    System.out.println("partner has number "+partner+'\n');
    					
    .
    .
    .
    .
    .

    Compilando ed eseguendo ho:

    codice:
    10890
    java.io.IOException: Mark invalid
    	at java.io.BufferedReader.reset(BufferedReader.java:505)
    	at Prova.main(Prova.java:181)
    >Exit code: 0
    Dove quel valore č position e l' eccezione č proprio alla chiamata reset.

    Come mai?

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.