Metoda zwracająca tablicę stringów - StringIndexOutOfBoundsException

0

Witam,

Chciałbym sobie w metodzie poniżej zwrócić w tablicy substringi, a w kolejnej je wywołać natomiast otrzymuję wyjątek StringIndexOutOfBoundsException po odpaleniu poniższego kodu.

	public String[] tabSubstr(){

                ...

		String s1 = sb.substring(0, 32);
		String s1 = sb.substring(32, 48);
		String s2 = sb.substring(48, 64);
				
		return new String[] {s1, s2, s3};
	}
	public void wypisz(){
		String[] tabstr = new String[3];
		
		tabstr = tabSubstr();
		
		for(int i = 0; i < 3; i++){
			System.out.println(tabstr[i]);
		}		
	}
0

o_O widocznie twoje "sb" nie ma aż tyle znaków ile każesz wycinać przez substring. Wiem ze dokumentacja gryzie

IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.

źródło: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#substring(int, int)

0

sb.length() zwraca mi 64, tak więc chyba nie do końca nie ma odpowiedniej długości. Jest to hash generowany z hasła mający 64 znaki, który sobie próbuje później rozbić na substringi.

Jak zrobię inaczej. Czyli zwrócę sobie w tej pierwszej metodzie cały hash w postaci String, a następnie w wypisz() wykonam:

	public void wypisz(){

		String s1 = tabSubstr().substring(0, 32);
		String s2 = tabSubstr().substring(32, 48);
		String s3 = tabSubstr().substring(48, 64);

                System.out.println("length: " + tabSubstr().length());   //zwraca 64
		System.out.println("hash: " + tabSubstr());
		System.out.println("s1 " + s1 + " len: " + s1.length());   //len = 32
		System.out.println("s2 " + s2 + " len: " + s2.length());   //len = 16
		System.out.println("s3 " + s3 + " len: " + s3.length());   //len = 16
		
		
		
	}
}

Przy takim wykonaniu działa ok wszystko.

0

To gdzie leci ci ten wyjątek? Bo pokazujesz tutaj poszatkowany kod z którego niewiele wynika. Moja szklana kula się popsuła a aktualnie zaparzyłem sobie herbatę z torebki więc nie mam nawet fusów...

0

Konkretnie się czepia przy tej linijce
String s3 = sb.substring(48, 64);
z błędem: java.lang.StringIndexOutOfBoundsException: length=61; regionStart=48; regionLength=16
Tutaj jak zmienię drugi parametr substring na 61 to się wykona, ale czemu nie wykona się dla 64, mimo że hash ma na pewno 64 znaki, co zresztą zwraca metoda length użyta na sb?

No, a następnie przy linijce:
tabstr = tabSubstr();

0

Java nie kłamie, skoro mówi że length jest 61 to jest i tyle, cudów nie ma. Nie wierzysz? Uruchom to pod debuggerem i zobacz...

0

Bo jeżeli ciąg znaków ma 64 elementy to indeks ostatniego wynosi 63, a nie 64... Indeksy liczone są od 0.

1 użytkowników online, w tym zalogowanych: 0, gości: 1