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

    Errore eccezione

    Salve dato il programma , che dovrebbe leggere 4 righe di stringhe da input dove ogni riga è del tipo :
    A B N M J I O P ... oppure minuscole

    viene suddivisa in token in base agli spazi, e le prime 4 lettere vengono immesse nella i-esima riga di una matrice 4x4(B1) e le altre 4 sempre nella i-esima riga in(B2) un altra matrice 4x4(le lettere in eccesso non vengono tenute in considerazione, nemmeno le righe in eccesso) fino a riempirle!... volendo evitare alcuni casi sbagliati di lettura da input ho inserito una classe fatta da me per gestire le eccezioni ,penso che il problema sia proprio questo, infatti commentando l'if segnalato nel metodo ricorsivo della classe che segue il programma fa quanto detto. Magari è una cavolata ma è da ieri che ci esco pazzo premetto non sono molto pratico a gestire le eccezioni... help me

    se non commento l'if:

    Exception in thread "main" java.util.NoSuchElementException
    at java.util.StringTokenizer.nextToken(Unknown Source)



    codice:
    public class LeggiPreparaM {
    	
       private final int D=4;
        private String riga;	
    	private char B1[][];
        private char B2[][];
        private StringTokenizer st;
        private  Scanner in_Str=new Scanner(System.in);
        private int R;
        private int indR;
        
    	public LeggiPreparaM() {
        riga="";    B1=new char[D][D];    B2=new char[D][D];   st=null;  R=0; indR=0;
    	}
    	public void setIndR(int indR) {
    		this.indR = indR;
    	}
    	
    	
    	
    	public void LeggiRigheM() throws ErroreRigaDiInput{
    		int R=0;
    	
       System.out.println("INSERISCI RIGHE************************************++");
    	    	
    		while(true){
    			
    			 riga=in_Str.nextLine();
    			if( riga.equals("#") )  break;
    			st= new StringTokenizer(riga," ");
    			AssegnaRiga(R,0,B1);
    	    	AssegnaRiga(R,0,B2);
    	        		
    			 System.out.println();
    			R++;
    		}	
                   
    	}
    	
    
    	public void AssegnaRiga(int R,int C1,char B[][]) throws ErroreRigaDiInput{
    		if(C1==D) { 
    			   return ;
    		  }
    		
         if(st.nextToken().length()>=2  )/////////<<<<<<<<<---
           throw new ErroreRigaDiInput();/////////<<<<<<<<<----
             
          if(R<4) 
          B[R][C1]=st.nextToken().toUpperCase().charAt(0);
    	            
          AssegnaRiga(R, C1+1,B);	
    	} 
    
    
    	public void StampaMatrici(){
           System.out.println("STAMPA DELLE MATRICI!!!");
           
    	 for(int r=0 ; r<4 ; r++){
            for(int c=0 ; c<4 ; c++)
            	System.out.println( B1[r][c]);
              System.out.println();	       
    	 }  
            	
            for(int r=0 ; r<4 ; r++)
            	for(int c=0 ; c<4 ; c++)
            		System.out.println( B2[r][c]);
    
    }
    
    ////////////////////////////////////////////////////////////////////////
    
    
    public class AVVIO_bG {
    	
    	public static void main(String args[]){
         			
          	  LeggiPreparaM L= new LeggiPreparaM();
    	  boolean cicla;
    	  
             do{
    		      try {
    				   L.LeggiRigheM();
    		           cicla=false;
    		           
    		      } catch (ErroreRigaDiInput E) 
    		         {
    		    	  cicla=true;
    		    	  E.GuidaImmissioneDati();
    		         }
        
             }while(cicla);
          
         L.StampaMatrici();
          
        System.out.println("STOP ");
    	
    }
    /////////////////////////////////////////////////////////////////////////////////////
    
    
    public class ErroreRigaDiInput extends Exception{
        
    	
    	
    	public ErroreRigaDiInput() {
    	}
    	
        public void ErroreLetterePriveDiSpazio(){
        	System.out.println("ERRORE DI INSERIMENTO ");
        }	
    	
    	public void GuidaImmissioneDati(){
    	  	System.out.println("IMMETTERE I DATI NEL SEGUENTE MODO !!");
    	}
    	
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    leggi bene l'errore: NoSuchElement, dovresti dire proprio la riga, anche se ho il sospetto che quando esegui questa riga
    codice:
     if(st.nextToken().length()>=2  )/////////<<<<<<<<<---
           throw new ErroreRigaDiInput();/////////<<<<<<<<<----
    non esista l'elemento successivo, dovresti vedere se ha il successivo e in quel caso prelevarlo
    RTFM Read That F*** Manual!!!

  3. #3
    l'errore è proprio su quella riga,ma sai qual'è la cosa strana che mi manda in tilt :commentando l'if la matrice viene riempita correttamente ecco perchè non capisco come sia possibile che un token non ci sia ...ottengo lo stesso effetto se metto questa stampa:

    System.out.println( "--->>> "+ st.nextToken().length());

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ci ho messo un po' a capire il giro che dovrebbe fare il tuo codice, beh se alla fine arrivi a concludere significa che non ti trovi mai in condizione di verifica dell'errore (cioè R > 4 sempre oppure quando R < 4 st correttamente valorizzata).
    RTFM Read That F*** Manual!!!

  5. #5
    il fatto è che vorrei un controllo nel caso un utente invece di inserire la riga nel seguente modo :
    A A B C D R S T
    la inserisce con le lettere attaccate
    AA B G H L M F U
    in questo caso st.nextToken().lenght vale 2 perchè vi è AA e quindi dovrebbe far partire l'eccezione
    ?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Non ci siamo ancora capiti e non hai capito l'errore né come si usa StringTokenizer·
    Il tuo errore viene fuori dal fatto che chiedi nextToken ad un tokenizer che non ha più elementi ed è l'unico modo che il sistema ha per segnalarti l'errore.
    Il fatto che commentando quella riga tu non abbia l'errore significa come ti ho detto (cercando di capire la contorsione di ricorsioni del tuo codice) che non ti trovi mai in una condizione del genere o perché ogni volta che fai nextToken il token è valido oppure perché non ti trovi mai con R < 0.

    Se tu vuoi lanciare una eccezione, devi agire in altro modo (è diversa la questione) e ti basta quanto segue
    Se tu hai una stringa fatta in questo modo:

    codice:
    String s = "A B C D E F";
    e fai
    codice:
    StringTokenizer token= new StringTokenizer(s," ");
    hai un oggetto in cui ci sono 6 elementi.
    L'oggetto lo scorri in genere in questo modo

    codice:
    String temp ; 
     while (token.hasMoreTokens()) {
             temp = token.nextToken(); 
             if (temp.trim().length() > 1){
                    throw new Exception(); 
              }
             System.out.println(temp);
     }
    su temp puoi chiederti quanto è grande (se 1 più).
    La tua eccezione va lanciata in questo modo.

    Prova a vedi, non è necessaria nemmeno la ricorsione.
    A riguardo ti consiglio di dare un'occhiata alle API di StringTokenizer e alle API di String
    RTFM Read That F*** Manual!!!

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.