Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    43

    Problema java

    Ho un problema con la esecuzione di questo pezzo di programma. In compilazione tutto ok, ma in esecuzione mi da StringIndexOutOfRange -1 ma come logica mi sembra tutto corretto.


    codice:
    		String obama="3 3|3 1$1 G.1 B.1 T$2 S.1 E$";
    		int n_row;
    		int n_col;
    		int cont=0;
    		int controllor=0;
    		int controlloc=0;
    		n_row = Integer.valueOf(obama.substring(0, obama.indexOf(" ")));		// Estrapolo numero di righe
    		n_col = Integer.valueOf(obama.substring(obama.indexOf(" ")+1, obama.indexOf("|"))); 	//Estrapolo numero di colonne
    		Piece[] board = new Piece[(n_row*n_col)];						// Creo l'array contenente le caselle
    		String temp = obama.substring(obama.indexOf("|")+1,obama.length());		// Estrapolo percorso
    		System.out.println("###"+temp+"###\n");			
    		////////////////////CONTROLLO\\\\\\\\\\\\\\\\\\\\\
    		String cut=temp;
    		int cont_c=0;
    		int cont_r=0;
    		while(cut!=null){
    			String cut2 = cut.substring(0,cut.indexOf("$"));
    			cut = cut.substring(cut.indexOf("$")+1,cut.length());
    			while(cut2!=null){
    				String cut3= cut2.substring(0,cut2.indexOf(" "));
    				cont_r+= Integer.valueOf(cut3);
    				cut2 = cut2.substring(0,cut2.indexOf("."));
    			}
    			if(cont_r!=n_row){
    				System.out.println("Configurazione errata");
    				return;
    			}
    			cont_c++;
    		}
    		if(cont_c!=n_col){
    				System.out.println("Configurazione errata");
    				return;
    		}
    Spiego:
    La prima parte (quella prima del |) è diciamo la grandezza della matrice, ogni $ indica riga a capo e (ad esempio il primo) 3 1 significa che ci saran 3 caselle da 1, cioè che dopo deve andare acapo, nella riga successiva.
    E così tutto, il primo è il numero di caselle che si creano con il secondo elemento.
    Questo serve per controllare che realmente son state date le dimensione esatte e che la tabella non sia sballato.
    Spero di essere stato chiaro.

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

    Re: Problema java

    Originariamente inviato da youngz
    Ho un problema con la esecuzione di questo pezzo di programma. In compilazione tutto ok, ma in esecuzione mi da StringIndexOutOfRange -1 ma come logica mi sembra tutto corretto.
    Non ho controllato tutto quanto (non ho tempo ora) ma ti posso assicurare subito che fare una cosa del tipo:

    String cut3= cut2.substring(0,cut2.indexOf(" "));

    non va bene. indexOf() può ritornare -1 (non trovato) ma substring() non accetta un negativo!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,325

    Moderazione

    E magari utilizzare un titolo un po' meno generico, un po' meno vago e, di conseguenza, un po' più conforme al regolamento... Se qui dentro non avessero tutti "Problemi Java" questo forum non avrebbe senso di esistere.


    Questo l'ho corretto io.


    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    43
    scusami hai ragione , la prossima volta metterò un titolo piu' specifico.

    Per il problema che dici tu, ho pensato anche io a questo problema, ma secondo logica non dovrebbe dare problemi, però non dovrebbe dare problemi visto che prima che non trova piu' spazi dovrebbe essere uscito dal while

    Edit: Per sicurezza ho pesso prima di ogni indexOf un controllo if(indexOf("simbolo")!=-1) e mi fa tutto, ma il problema permane.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,325
    codice:
    String cut2 = cut.substring(0,cut.indexOf("$"));
    cut = cut.substring(cut.indexOf("$")+1,cut.length());
    Cosa succede all'ultimo passaggio?
    Vediamo la situazione dell'ultimo passaggio:

    codice:
    cut = "2 S.1 E$"
    Quindi:
    codice:
    String cut2 = cut.substring(0,cut.indexOf("$"));
    // cut2 = "2 S.1 E"
    
    cut = cut.substring(cut.indexOf("$")+1,cut.length());
    // StringIndexOutOfRange!! Perchè
    // cut.indexOf("$") è l'ultimo carattere!! --> cut.indexOf("$")+1 va fuori limite!!
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    43
    ho modificato così:


    codice:
    cut = cut.substring(cut.indexOf("$"),cut.length());
    			if(cut.length()==1)
    				break;
    			else
    				cut = cut.substring(1,cut.length());

    Ma il problema persiste, a quanto ho capito il problema dovrebbe stare qua:
    codice:
    cut2 = cut2.substring(0,cut2.indexOf("."));

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,325
    Considerando che la JVM ti dice esattamente la riga del codice che è andata in errore, dovresti avere la certezza di quale sia la linea sul sorgente che lo provoca.
    Se è quella, significa solo una cosa: in una delle iterazioni quell'istruzione restituisce -1, quindi cut2 non contiene alcun punto decimale al suo interno.

    Il mio consiglio, come quello precedente in andbin, è sempre quello di evitare quel genere di annidamento quando si ha a che fare con le stringhe: prima ottieni tutti gli inidici con indexOf, poi li testi se sono positivi, e solo allora fai le operazioni.


    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

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.