Pierwsze kroko Java i Exception - > StringIndexOutOfBoundsException

0

Dopiero rozpocząłem swoją przygodę z językiem Java, można powiedzieć. Mam pewną książkę i wykonuje poszczególne zadania. Jednym z zadań było wypisanie wszystkich cyfr danej liczby. Generalnie problem wydaje się prosty ale ja natrafiłem na problem z wyjątkiem. Oto kod

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        new Main();
    }


    public Main(){
        String tmp;
        int n;
        n = 0;

        tmp = JOptionPane.showInputDialog("Podaj liczbe");

        Character x = (char)tmp.charAt(n);

        do {

          JOptionPane.showMessageDialog(null, x );
          n++;
          x = (char)tmp.charAt(n);
          
        } while (!x.equals(null));

    }
}

Ja widać napisanie i zrozumienie tego nie stanowi problemu. Niestety w pętli wychodzę poza obszar Stringa wyrzuca mi coś takiego

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2

Żeby to ominąć myślałem, że można po prostu sprawdzić czy zmienna jest null ale to też nie pomogło :(.
Moje pytanie jest takie, co robię źle :)? Jak to rozwiązać ?

Chciałem jeszcze dodać abyście byli wyrozumiali i nie besztali mnie za głupotę :).

dodanie znacznika <code class="java"> oraz <quote> dla treści błędu - fp

0

chary w stringu są na pozycjach 0-(dlugosc_stringa-1), w pewnym momencie pobierasz znak z pozycji dlugosc_stringa (jeśli chcesz to mieć dalej w pętli do while to zamiast badania wartości x badaj długość stringa i n). Albo zmień pętle na for.

0

No wiem że String to tablica znaków, lecz po prostu poruszałem się na poziomie wiedzy jaka została przedstawiona w książce do czasu pojawienia się tego zadania. Być może robiłem błąd. Pytanie moje jest jednak czy można w jakiś sposób obsłużyć to tak jak do tej pory robiłem ? Czy zmienna x przyjmuje jakąś wartość kiedy wychodzę poza obszar pamięci ( myślę że nie ) ? Kiedy mogę zatem wykorzystać wartość null ?

0

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#charAt%28int%29
Nie, nie przyjmuje żadnej wartości, rzuca wyjątek, który opisałeś.

Najlepiej zmienić pętle z do while na np. for.
Jak widać poniżej kod stał się dużo prostszy.


tmp = JOptionPane.showInputDialog("Podaj liczbe");
 
for(int i = 0; i < tmp.length(); i++)
{
   JOptionPane.showMessageDialog(null,  tmp.charAt(i) );
}
0

Ok, mam jeszcze jedno pytanie, czym jest w takim razie wartość null ?

0

Doslownie - niczym, z reguly jest to odpowiednik wartosci zerowej dla adresow (referencji).

0

null = 0; można by rzec, że jest to "wskaźnik na nic".
Po więcej spójrz do książki/dokumentacji.

0

hmm, 0 jednak ma swój kod w pamięci, można go użyć chcąc coś zaznaczyć. Null jak rozumiem jest wskaźnikiem na brak wartości - tak samo jak w bazie danych. czyli x powinie przyjąć wartość null, ponieważ wyszedł poza obszar pamięci zapisanej dla tego Stringa. Zapewne teraz tak pomyślałem błąd wynikał stad, że ( jak przeczytałem w opisie funkcji chatAt ) funkcja zwracała mi wyjątek zanim tak naprawdę zacząłem sprawdzać warunek x.equals(null). Jeśli źle myślę poprawcie mnie.

0

.equals() sluzy do porownywania obiektow, == do porownywania referencji. To referencja moze miec wartosc null, a nie obiekt.
Co wiecej null to po prostu zero jest, zerowy adres.

Lap przyklad w C, zeby bylo to ladnie widoczne:
http://ideone.com/nT3yFO

0

thx __tmp

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