Tablice [ArrayIndexOutOfBoundsException]

szukaj na forum nowy temat odpowiedz

Strona [ 1 ] z 1

pascalwws ten post 08-02-2010 10:38
avatar

Użytkownik
Status: Offline
Dołączył: 30-10-2007

public class Main{
        public static void main(String args[]){
                int c=6;
                int j=0;
                int i=0;
                int[][] k= new int[c][c];

                for(;i<k.length;i++){
                        k[i][j]= c*i;


                        for(j=0; j<k[i].length; j++){
                        k[i][j]=c*j;
                        System.out.println("[" +i+ "]"+"[" +j+ "]=" +k[i][j]);
                        }
                        }




        }

}


Czy może ktoś napisać mi co jest złego w tym kodzie, że wywala mi :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6

Niby pamięć, chyba powinna być zarezerwowana dla macierzy 6x6 a program działa tylko dla 6x5 .(działa, gdy w drugiej pętli zmienię na "k[i].length-1").
http://half-life.com.pl/

Ostatnio zmodyfikowany: 08-02-2010 12:05 przez pascalwws
Przejdź na górę strony
cytuj
bswierczynski ten post 08-02-2010 11:14


Użytkownik
Status: Offline
Dołączył: 29-09-2009

Przyłóż się bardziej do formatowania kodu, żaden pro-gramista nie robi tego tak na odwal. Rób porządne wcięcia, bo tak jak jest teraz znacznie gorzej się czyta! Tu więcej info o wcięciach.

A poza zakres wychodzisz w pierwszej linii zewnętrznej pętli for. Zauważ proszę, że pierwszym wyjściu z pętli wewnętrznej j wynosi 6. Następnie wykonywany jest kolejny (drugi) raz pętla zewnętrzna. I wykonuje się linijka:

k[i][j]= c*i;


Gdy tablica ma rozmiar 6x6, czyli indeksy mogą mieć wartości z przedziału [0..5], tymczasem i = 1 (OK) i j =6 (poza zakresem).

Aha, możesz włączyć forumowe kolorowanie składni otwierając tag code w ten sposób:

<code=java>


Zamiast "java" możesz też wpisać "php", "c", "cpp" i parę innych nazw języków. Niestety jest to słabo udokumentowane na forum, więc wielu nowicjuszy po prostu nie zna tej opcji (bo nie ma jak).

Na przyszłość polecam też dać tematowi lepszą nazwę niż "Początkujący". Zapewniam Cię, że to forum odwiedza codziennie wielu początkujących! Gdyby wszyscy dawali takie tematy, nikt by się w nich nie połapał. Warto też rozpocząć temat od tagu z nazwą języka, np. "[Java]". Masz sporą szansę, że ten temat znajdzie się w dziale Newbie i tam bez tagu nie będzie na pierwszy rzut oka wiadomo, o jaki język programowania chodzi.

Zauważ proszę, że bodaj wszystkie te zasady są wspomniane w przyklejonym (tj. widocznym zawsze u góry) temacie Ogłoszenie dla forumowiczów i FAQ oraz w temacie Zasady pisania tematów w dziale Java. Stosowanie się do tych wskazówek pomoże właściwym ludziom znaleźć Twój problem, a Tobie uzyskać szybszą pomoc (że nie wspomnę o tym, że tematy naruszające te powszechnie dostępne zasady mogą od razu trafić do kosza).

Ostatnio zmodyfikowany: 08-02-2010 11:24 przez bswierczynski
Przejdź na górę strony
cytuj
Koziołek ten post 08-02-2010 11:20
avatar

Użytkownik
Status: Offline
Dołączył: 27-04-2007
Skąd: Sterta
1. zmień temat na jakiś sensowny.
2. w momencie gdy przechodzisz do pętli dla i = 1 to j jest równe 6, a powinno być równe 0. Zerowanie j następuje przy starcie pętli, a powinno być realizowane wcześniej. Dodatkowo nie wiem dlaczego dwa razy wykonujesz przypisanie do k[i][j], skoro tylko to drugie będzie wypisywane.
Błąd polega na sposobie w jaki deklarujesz zmienne i i j. Są one widoczne poza pętlą, co powoduje, że musisz ręcznie zarządzać ich wartościami po opuszczeniu pętli.
public class App {

        public static void main(String args[]) {
                int c = 6;
                int[][] k = new int[c][c];

                for (int i = 0; i < k.length; i++) {
                        for (int j = 0; j < k[i].length; j++) {
                                k[i][j] = c * j;
                                System.out.println("[" + i + "]" + "[" + j + "]=" + k[i][j]);
                        }
                }

        }

}

http://koziolekweb.pl - przemyślenia o życiu i śmierci i różnościach...
Klingon multitasking systems do not support "time-sharing". When a Klingon program wants to run, it challenges the scheduler in hand-to-hand combat and owns the machine.
Przejdź na górę strony
cytuj
pascalwws ten post 08-02-2010 12:04
avatar

Użytkownik
Status: Offline
Dołączył: 30-10-2007

Dziękuję za rady :)

Poprawię się.
http://half-life.com.pl/
Przejdź na górę strony
cytuj
szukaj na forum nowy temat odpowiedz

Strona [ 1 ] z 1

1 użytkownik(ów) przegląda ten temat (1 gości)
(żadnych zarejestrowanych użytkowników)

Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0606 sek. (zapytań SQL: 9)