Stavo provando a risolvere un esercizio:

"Si realizzi un programma Java che prende in input un file di testo e poi stampi in
un file di output la frequenza con cui i singoli caratteri dell'alfabeto appaino nel
documento. I simboli di punteggiatura non devono essere considerati. Inoltre non
dovrą essere fatta distinzione tra caratteri maiuscoli e caratteri minuscoli. I caratteri
dovranno essere visualizzati nel file di output in ordine alfabetico. Le frequenze dei
caratteri dovranno essere espresse in forma percentuale con al pił due cifre decimali
per ogni valore (arrotondate per difetto)."

Ho provato a risolverlo, suppongo troverete tante stranezze..

Ad ogni modo, il problema č che viene generata un' Exception in thread "main" java.util.NoSuchElementException.

Dovrebbe dipendere dal fatto che continua a lavorare dopo che l'input č finito, ma non riesco a capire perchč i miei controlli non funzionano allora.

codice:
import java.io.*;
import java.util.Scanner;

public class EsercizioVII
{
	public static void main(String []args) throws IOException
	{
		Scanner s=null;
		FileReader reader=null;
		BufferedReader in=null;
		PrintWriter out=null;
		
		try{
			s=new Scanner("input.txt");
			reader=new FileReader("input.txt");
			in=new BufferedReader(reader);
			out=new PrintWriter("OUTPUT.txt");
			
			
			int righe=0;
			char a=97;                     //il primo carattere che considererņ
			double percent=0.0;
			
			
			while(in.readLine()!=null)
			{
				righe++;
			}
			
			
			int [] ripetizioni=new int[26];
			
			for(int i=0; i<26; i++)                                           //Creo un array dove memorizzerņ per ogni lettera il numero di ripetizioni
			ripetizioni[i]=0;
			
		
			for(int i=0; i<26; i++)                                        //Il for mi serve per controllare le varie lettere e incrementare le ripetizioni
			{
				
				//reader=new FileReader("input.txt");
				//in=new BufferedReader(reader);
				
				s=new Scanner("input.txt");                            //inizializzo sempre da capo lo Scanner
				
				while(s.next()!=null)                                          //Finchč ci sono caratteri
				{
					if((Integer.parseInt(s.next()))==(int)a || (Integer.parseInt(s.next()))==(int)(a-32) || (Integer.parseInt(s.next()))==(int)(a+32)) //Se nel rigo trovo la stessa lettera maiuscola o minuscola
						ripetizioni[i]++;
				}
					a++;                                           //cambio la lettera.
					percent=(double)(ripetizioni[i])/(double)(righe);
				
				out.print(percent);
				
			}
			}
			
		finally{
			if(s!=null)s.close();
				if(reader!=null)reader.close();
			if(in!=null)in.close();
			if(out!=null)out.close();
			}
	}
	
	
}