PDA

View Full Version : [JAVA] String index out of range


StErMiNeiToR
08-12-2004, 19:00
import java.io.*;

public class frase_corretta {

public static void main(String[] args) throws IOException {
BufferedReader tas = new BufferedReader(new InputStreamReader(System.in));
String car ;
String car2 = "";
char j,k;
int i;
System.out.print("Inserisci una frase da correggere: ");
car = tas.readLine();
for( i = 0; i < car.length(); i++ ) {
j = car.charAt(i);

if ( ( j == car.charAt(i+1) ) && ( j == car.charAt(i+2)) ) {}
else car2 += j;
if ( ( j == 'z' ) && ( car.charAt(i+1) == j ) && ( car.charAt(i+2) == 'i' ) && (( car.charAt(i+3) == 'a' ) || ( car.charAt(i+3) == 'o' ) )) {}
else car2 += j;

}


System.out.println(car2);


}
}

Ecco l'errore:
Inserisci una frase da correggere: cazzzarola
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 10
at java.lang.String.charAt(Unknown Source)
at frase_corretta.main(frase_corretta.java:16)

Dove ho sbagliato? se metto sotto commento il primo if e else tutto funziona perfetto.

bettola
08-12-2004, 19:14
se gli dai un for da i a stringa.length quando sei all'ultima iterazione e fai il charat di i+1 e i+2 di andrebbe fuori dalla stringa perché la "i" equivale all'ultimo carattere della stringa e i+1 e i+2 sono fuori! e infatti ti dà l'out of bounds...devi fare il ciclo for da 0 a length-2

StErMiNeiToR
08-12-2004, 19:20
Originariamente inviato da bettola
se gli dai un for da i a stringa.length quando sei all'ultima iterazione e fai il charat di i+1 e i+2 di andrebbe fuori dalla stringa perché la "i" equivale all'ultimo carattere della stringa e i+1 e i+2 sono fuori! e infatti ti dà l'out of bounds...devi fare il ciclo for da 0 a length-2

come gia detto nella mio primo post, come mai allora se metto il primo if sotto commento il secondo if che usa (i+3) non mi da alcun errore di out of range?

edivad82
08-12-2004, 19:29
Originariamente inviato da StErMiNeiToR
come gia detto nella mio primo post, come mai allora se metto il primo if sotto commento il secondo if che usa (i+3) non mi da alcun errore di out of range?
perchè in teoria usa lo short evaluation e quindi in un and se la prima condizione è falsa, tutta la frase è falsa e non controlla le altre condizioni

bettola
08-12-2004, 19:44
e cmq se si vede già che va in out of range meglio non porsi nemmeno la domanda e cambiare il programma! ;)

edivad82
08-12-2004, 19:55
Originariamente inviato da bettola
e cmq se si vede già che va in out of range meglio non porsi nemmeno la domanda e cambiare il programma! ;)
ovvio :D

StErMiNeiToR
08-12-2004, 20:00
maledetti i professori che non ti danno mai le fotttute basi per fare i programmi e quando gli chiedi spiegazioni non sanno mai nulla


ma allora cazzo spiegano a fare? sanguisughe della societa -.-'

StErMiNeiToR
08-12-2004, 20:10
import java.io.*;

public class frase_corretta {

public static void main(String[] args) throws IOException {
BufferedReader tas = new BufferedReader(new InputStreamReader(System.in));
String car ;
String car2 = "";
char j,k;
int i;
System.out.print("Inserisci una frase da correggere: ");
car = tas.readLine();
//if( car.charAt(0) == car.charAt(1) ) System.out.print("La frase non puo iniziare con lettere uguali! ");
for( i = 2; i < car.length() ; i++ ) {
j = car.charAt(i-2);

if ( ( j == car.charAt(i-1) ) && ( j == car.charAt(i)) ) {}
else car2 += j;
if ( ( j == 'z' ) && ( car.charAt(i-1) == j ) && ( car.charAt(i) == 'i' ) && (( car.charAt(i+1) == 'a' ) || ( car.charAt(i+3) == 'o' ) )) {}
else car2 += j;
}
System.out.println(car2);


}
}

esempio:

Inserisci una frase da correggere: cazzzarola
ccaazzzzzaarroo <---- questa è la stringa "corrette" -.-'

StErMiNeiToR
08-12-2004, 22:57
ok adesso va tutto perfetto solo che, ovviamente se entra nell if o nell else if fuori dal ciclo while nn mi scrive le ultime due lettere. Come posso fare?


import java.io.*;

public class frase_corretta {

public static void main(String[] args) throws IOException {
BufferedReader tas = new BufferedReader(new InputStreamReader(System.in));
String car ;
String car2 = "";
char j,k=0;
int i=2;
System.out.print("Inserisci una frase da correggere: ");
car = tas.readLine();
if( car.charAt(0) == car.charAt(1) ) {
System.out.print("La frase non puo iniziare con lettere uguali! ");
k = 1;
}
while( k == 0 && i < car.length() ) {
j = car.charAt(i-2);

if ( ( j == car.charAt(i-1) ) && ( j == car.charAt(i)) ) {}
else if ( ( j == 'z' ) && ( car.charAt(i-1) == j ) && ( car.charAt(i) == 'i' ) && (( car.charAt(i+1) == 'a' ) || ( car.charAt(i+1) == 'o' ) )) {}
else car2 += j;
i++;
}
if ( ( car.charAt(car.length()-3) == car.charAt(car.length()-2) ) && ( car.charAt(car.length()-3) == car.charAt(car.length()-1)) ) {}
else if ( ( car.charAt(car.length()-4) == 'z' ) && ( car.charAt(car.length()-3) == 'z' ) && ( car.charAt(car.length()-2) == 'i' ) && (( car.charAt(car.length()-1) == 'a' ) || ( car.charAt(car.length()-1) == 'o' ) )) {}
else {
car2 += car.charAt(car.length()-2);
car2 += car.charAt(car.length()-1);

}
if( k == 0 ) System.out.print(car2);
}
}

StErMiNeiToR
08-12-2004, 23:51
mentre ero li che stavo cercando di dormire mi è venuto un lampo di genio! ecco come ho risolto il programma senza tanti cazzi e lazzi vari :D


import java.io.*;

public class frase_corretta {

public static void main(String[] args) throws IOException {
BufferedReader tas = new BufferedReader(new InputStreamReader(System.in));
String car ;
String car2 = "";
char j,k=0;
int i=2;
System.out.print("Inserisci una frase da correggere: ");
car = tas.readLine();
// aggiungo due spazzi finali in modo tale che non vada out of range
car += " ";
if( car.charAt(0) == car.charAt(1) ) {
System.out.print("La frase non puo iniziare con lettere uguali! ");
k = 1;
}
while( k == 0 && i < car.length() ) {
j = car.charAt(i-2);

if ( ( j == car.charAt(i-1) ) && ( j == car.charAt(i)) ) {}
else if ( ( j == 'z' ) && ( car.charAt(i-1) == j ) && ( car.charAt(i) == 'i' ) && (( car.charAt(i+1) == 'a' ) || ( car.charAt(i+1) == 'o' ) )) {}
else car2 += j;
i++;
}
if( k == 0 ) System.out.print(car2);
}
}