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

    Programma funzionante ma...

    Ho fatto un esercizio, sembrerebbe giusto, poichč l'output mi risulta corretto:
    Mi genera una NullPointerException, vorrei capire perchč, anche se potrei risolvere gestendola, ma vorrei capire se č dovuta ad un errore nel mio programma.

    "Si realizzi un programma Java che preso in input un file contenente una sequenza
    di stringhe, una per riga, verifichi se tali stringhe siano palindrome o meno.
    Utilizzare una funzione ricorsiva per verificare che le stringhe siano palindrome.
    Input
    Il file di input contiene una sequenza di stringhe, una per riga, terminanti con il
    simbolo “ ;” (punto e virgola). Ciascuna stringa ha una lunghezza massima di 10
    caratteri ed č composta solo da caratteri minuscoli.
    Output
    Il file di output contiene, in corrispondenza delle righe contenenti stringhe
    palindrome, la parola “ palindroma” . In corrispondenza di tutte le altre righe
    contiene il simbolo “ -” ."

    Ecco il codice:

    codice:
    import java.io.*;
    
    public class Esercizio2
    {
    	public static void main(String [] args) throws Exception
    	{
    		
    		FileReader reader=null;
    		BufferedReader buff=null;
    		PrintWriter out=null;
    		
    		try{
    			reader=new FileReader("input.txt");
    			buff=new BufferedReader(reader);
    			out=new PrintWriter("OUTPUT.txt");
    			
    			String s="";
    			String inverse="";
    			String output="";
    			
    			while(buff!=null)
    			{
    				s=buff.readLine();
    				int i=s.length()-2;    //Siccome le stringhe sono del tipo "aab;" non mi interessa la virgola
    				inverse=inverti(s,output,i);
    				if(inverse.equals(s.substring(0,s.length()-1))) //Confronto l'inversa con la stringa di partenza privata del ; finale
    					out.print("palindroma");
    				else out.print('-');
    				out.print('\r');
    				out.print('\n');
    			}
    		
    		    
    		    }
    		    
    
    		    catch(IOException e)
    		    {
    		    }
    		    
    		      finally{
    			    if(reader!=null)
    				    reader.close();
    			    if(buff!=null)
    				    buff.close();
    			    if(out!=null)
    				    out.close();
    				}
    		    
    		    
    		  
    		    
    	}
    	
    	
    	public static String inverti(String s, String output, int i)
    	{
    		if(i<0)return output;
    		
    		else if(i>=0){
    			output+=s.charAt(i);
    		i--;}
    		return inverti(s,output,i);
    	}
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Programma funzionante ma...

    Originariamente inviato da Darčios89
    codice:
    			buff=new BufferedReader(reader);
    
    			
    			while(buff!=null)
    			{
    				s=buff.readLine();
    				int i=s.length()-2;    //Siccome le stringhe sono del tipo "aab;" non mi interessa la virgola
    Per il ciclo non devi testare che buff sia diverso da null ..... perché č sempre diverso da null visto che hai istanziato e assegnato il BufferedReader appena sopra!!
    Quindi stai facendo un ciclo teoricamente "infinito" perché la condizione č sempre vera. Quando non ci sono pił righe (fine del file) il readLine() restituisce null. Il fatto č che poi invochi s.length() e su un null ovviamente lancia NullPointerException (quindi dal ciclo si esce artificiosamente per questo motivo).

    Per la lettura "a righe" con un BufferedReader l'idioma tipico č:

    codice:
    String linea;
    
    while ((linea = buff.readLine()) != null) {
        ..... usa linea ......
    }
    Punto.


    Altra cosa, meno grave, ma da segnalarti. Quando hai classi di I/O "wrappate" in altre come:

    reader=new FileReader("input.txt");
    buff=new BufferedReader(reader);

    Quello che devi chiudere č sempre solo quello pił "esterno", ovvero se hai il BufferedReader allora questo, altrimenti se BufferedReader non fosse stato costruito (per causa di qualunque eccezione), allora il FileReader.

    Pertanto invece di fare:

    codice:
    if(reader!=null)
        reader.close();
    if(buff!=null)
        buff.close();
    Dovresti come minimo fare:

    codice:
    if (buff != null) {
        buff.close();
    } else if (reader != null) {
        reader.close();
    }
    Insomma, quello che hai di pił "esterno" in quel momento lo chiudi e basta. Non tutti quelli nella "catena" di I/O.
    Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet

  3. #3
    Ah ok ok, ti ringrazio.

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.