Próbuję zrobić prostą małą metodę w Javiektóry stworzy listę malejących wartości całkowitych z dowolnego wejścia, które mu podam (np. jeśli N = 10, zwróci tablicę: {10,9,8,7,6,6,5,4,3, 2,1} Jest to niewielka część mojego kodu i kompiluje się poprawnie, ale otrzymuję wyjątki wskaźnika zerowego podczas wykonywania. Czy jest jakiś problem, który wyróżnia się w poniższym kodzie?
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
for(int i = N; i > 1; i--) {
int q = 0;
a[q] = i;
q++;
}
return a;
} `
Odpowiedzi:
1 dla odpowiedzi № 1Nie powinieneś otrzymywać wyjątku zerowego wskaźnika, twój kod ma wyjątek indeksowania poza zakresem. Dzieje się tak, ponieważ uruchamiasz swój i
od N
aż do 1
, wyłączne, podczas gdy powinno iść N-1
aż do 0
:
for(int i = N-1, q=0; i >= 0; i--, q++) {
a[q] = i+1;
}
Uwaga jak q
i i
można zadeklarować w nagłówku pętli.
Możesz przepisać tę pętlę bez q
także:
for(int i = 0 ; i != N ; i++) {
a[q] = N-i;
}
1 dla odpowiedzi nr 2
Inicjujesz q
przy każdej iteracji 0
. Dlaczego nie
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
for(int i = N; i >= 1; i--) {
a[i-1] = N - i + 1;
}
return a;
}
Ewentualnie możesz użyć
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
for(int i = 0; i < N; i++) {
a[i] = N - i;
}
return a;
}
Które jest prawdopodobnie jaśniejsze
0 dla odpowiedzi № 3
Wielokrotnie nadpisujesz pozycję 0
twojej tablicy, powtarzając wielokrotnie q
. Oto poprawka:
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = N; i > 1; i--) {
a[q] = i;
q++;
}
return a;
}
0 dla odpowiedzi nr 4
N jest górną granicą. Tablice w Javie o rozmiarze N są indeksowane od 0 do N-1. Więc kiedy odwołujesz się do [N], będzie to odwoływać się do indeksu poza zakresem.
0 dla odpowiedzi № 5
Twój kod w obecnej postaci zwróci tablicę rozmiarów N
ale tylko pierwszy element tablicy zostanie zaktualizowany dziesięć razy. Oto dlaczego, gdy przechodzimy przez logikę twojego programu,
create an array of type Integer, sized N
First iteration:
for-loop starts at i=N, let"s make N = 10 for our purposes
q is set to 0 and a[0] is updated to N, which is 10 in the first iteration
q is incremented to 1
i is decremented to 9
Second iteration:
i is now 9
q is set to 0 and a[0] is set to 9
q is incremented to 1
i is decremented to 8
W tym momencie widzimy problem. Możesz tak myśleć q
w drugiej iteracji powinien zaczynać się od 1 i być zwiększany do 2 po aktualizacji a[1]
i nie a[0]
, ale tak nie jest. Z każdą iteracją pętli for nowej zmiennej q
jest zrobione. Po zakończeniu iteracji zmienna q
to śmieci zbierane / wyrzucane. Dlatego rozwiązaniem jest użycie zmiennej, która nie jest wyrzucana po każdej iteracji pętli for. Użyjmy więc i
zamiast tego uzyskać dostęp do określonego indeksu w tablicy od
1) ta sama zmienna i
można uzyskać dostęp za pomocą każdej iteracji pętli i
2) zmienna i
jest automatycznie zwiększany lub zmniejszany na końcu każdej iteracji w zależności od nagłówka pętli
Zastosowanie tych zmian spowoduje, że
private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = 0; i < N; i++) {
a[i] = N - i;
}
return a;
}
0 dla odpowiedzi № 6
Twój kod powinien wyglądać tak:
public static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = N - 1; i >= 0; i--) {
a[q] = i + 1;
q++;
}
return a;
}
Musisz zainicjować q poza pętlą for, ponieważ za każdym razem, gdy się zapętli, q jest inicjowane zerem i staje się [0] = 10, a [0] = 9 itd. ...