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.