ArrayIndexOutOfBoundsException

0

Witajcie. :)

Mam plik:
package zad51;

<java>import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JOptionPane;

public class Zad51 {

public static void main(String[] args) {

  String ciag = "";
  String podlancuch = "";
  String s = "";
  ArrayList<String> tablica = new ArrayList<String>();
  int i = 0;
    ciag = JOptionPane.showInputDialog("Podaj dowolony ciąg znaków");
    int dlugosc = ciag.length();
    	System.out.println("Liczba znaków: " + dlugosc);
    	System.out.println("Znak pierwszy: "+ciag.substring(0, 1) + " | Znak drugi: "+ciag.substring(dlugosc-1, dlugosc));
    	System.out.println("Łańcuch od 3 do ostatniego: "+ciag.substring(3, dlugosc));
    	System.out.println("Łańcuch od 3 do przedostatniego: "+ciag.substring(3, dlugosc-1));
    	podlancuch = JOptionPane.showInputDialog("Podaj podłańcuch");
    	 StringTokenizer st = new StringTokenizer(ciag, " ");
    	 while(st.hasMoreTokens()){
    		 if(podlancuch.equals(st.nextToken())){
    			 i++;
    		 }
    		 s = st.nextToken(); //tutaj błąd..
    	tablica.add(s);
    	
    	 }

    	 System.out.println("Podłańcuch "+podlancuch+" występuje "+i+" raz(y)");
    	 System.out.println("Wyprowadzanie elementów tablicy, rozpoczynanie od ostatniego:");

    	 

}
}
</java>

Wyskakuje mi błąd

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

Zakomentowałem tą linijkę :)

Dlaczego jest taki błąd?
Jak to naprawić..?

Pozdrawiam,
Kamil.

Tutaj poprawny kod w tagach, przepraszam za kłopot ;)

<code = java>
package zad51;

import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JOptionPane;

public class Zad51 {

public static void main(String[] args) {

  String ciag = "";
  String podlancuch = "";
  String s = "";
  ArrayList<String> tablica = new ArrayList<String>();
  int i = 0;
    ciag = JOptionPane.showInputDialog("Podaj dowolony ciąg znaków");
    int dlugosc = ciag.length();
    	System.out.println("Liczba znaków: " + dlugosc);
    	System.out.println("Znak pierwszy: "+ciag.substring(0, 1) + " | Znak drugi: "+ciag.substring(dlugosc-1, dlugosc));
    	System.out.println("Łańcuch od 3 do ostatniego: "+ciag.substring(3, dlugosc));
    	System.out.println("Łańcuch od 3 do przedostatniego: "+ciag.substring(3, dlugosc-1));
    	podlancuch = JOptionPane.showInputDialog("Podaj podłańcuch");
    	 StringTokenizer st = new StringTokenizer(ciag, " ");
    	 while(st.hasMoreTokens()){
    		 if(podlancuch.equals(st.nextToken())){
    			 i++;
    		 }
    		 s = st.nextToken();
    	tablica.add(s);
    	
    	 }

    	 System.out.println("Podłańcuch "+podlancuch+" występuje "+i+" raz(y)");
    	 System.out.println("Wyprowadzanie elementów tablicy, rozpoczynanie od ostatniego:");

    	 

}
}

0
                     while(st.hasMoreTokens()){
                             if(podlancuch.equals(st.nextToken())){   //1
                                     i++;
                             }
                             s = st.nextToken(); //tutaj błąd.. //2

Co się dzieje gdy dotrzesz do ostatniego tokena? hasMoreTokens() zwróci true, wiersz 1 odczyta ostatni token, a wiersz 2 wywali błąd

0

Co się dzieje gdy dotrzesz do ostatniego tokena? hasMoreTokens() zwróci true, wiersz 1 odczyta ostatni token, a wiersz 2 wywali błąd

Ale co wiersz 1 ma do wiersza 2?

Gdy zapisuję to tak:

while(st.hasMoreTokens()){
	    		 if(podlancuch.equals(st.nextToken())){
	    			 i++;
	    		 }
	    		 
	    	tablica.add(st.nextToken());
	    	
	    	 }
</java>

to nadal jest ten błąd..
Warunek sprawdza tylko czy String podlancuch (podany przez użytkownika) jest równy z jakimś tokenem..

A ja chcę każdy token dodać do tablicy.

Chyba nie zauważyłeś, że za tablica.add jest zamknięcie pętli while ;)

Pozdrawiam,
Kamil.
0

Ty naprawdę nie widzisz, że ostatni token próbujesz czytać dwa razy?
W tej pętli

while(st.hasMoreTokens()){
                             if(podlancuch.equals(st.nextToken())){
                                     i++;
                             }

odczytujesz wszystkie tokeny, a potem chcesz odczytać jeszcze jeden.

0

Ah, racja :)

Mój błąd.

Poprawiony kod:

	    	 while(st.hasMoreTokens()){
	    		 token = st.nextToken();
	    		 if(podlancuch.equals(token)){
	    			 i++;
	    		 }
	    		 
	    	tablica.add(token);
	    	
	    	 }

Jeszcze raz bardzo dziękuję :)

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