Arrayn skrivs ut korrekt med korrekt antal element men krashar när den är klar. Java

Permalänk

Arrayn skrivs ut korrekt med korrekt antal element men krashar när den är klar. Java

Varför krashar den, svaret i konsollen är

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 22 out of bounds for length 22
at className/inupp6.NewMenu.print(NewMenu.java:12)
at className/inupp6.NewMenu.menu(NewMenu.java:41)
at className/inupp6.NewMenu.main(NewMenu.java:85)

Det konstiga är att hela arrayn skrivs ut som den ska med ett ökat element tillagdt. (Jag tog bort fel medelandet från hur arrayn kommer ut i konsolen.
Några ideer om hur jag fixar detta?

1
1000 | Pris: 345kr | antal i lager: 2
1001 | Pris: 550kr | antal i lager: 3
1002 | Pris: 826kr | antal i lager: 9
1003 | Pris: 297kr | antal i lager: 7
1004 | Pris: 835kr | antal i lager: 6
1005 | Pris: 806kr | antal i lager: 6
1006 | Pris: 321kr | antal i lager: 7
1007 | Pris: 902kr | antal i lager: 2
1008 | Pris: 167kr | antal i lager: 9
1009 | Pris: 735kr | antal i lager: 7

New Array1
1000 | Pris: 345kr | antal i lager: 2
1001 | Pris: 550kr | antal i lager: 3
1002 | Pris: 826kr | antal i lager: 9
1003 | Pris: 297kr | antal i lager: 7
1004 | Pris: 835kr | antal i lager: 6
1005 | Pris: 806kr | antal i lager: 6
1006 | Pris: 321kr | antal i lager: 7
1007 | Pris: 902kr | antal i lager: 2
1008 | Pris: 167kr | antal i lager: 9
1009 | Pris: 735kr | antal i lager: 7
1010 | Pris: 682kr | antal i lager: 4

import java.util.Scanner; public class NewMenu { public static int[] print(int[] a) { int length = a.length; int[] printArr = new int[length+2]; for(int i = 0; i < printArr.length; i++) { int j = i+11; System.out.println((1000 + i) + " | Pris: " + a[i] + "kr | antal i lager: " + a[j]); } return a; } public static int input() { int output = sc.nextInt(); return output; } /* * Mer kompakt men både arrayn är i samma loop. */ public static int menu(int option) { int startSize = 10; int[] arrayPrice = new int[startSize]; int[] arrayNrOf = new int[startSize]; for (int i = 0; i < startSize; i++) { arrayPrice[i] = (int) (Math.random() * 1000) + 100; arrayNrOf[i] = (int) (Math.random() * 10) + 1; System.out.println((1000 + i) + " | Pris: " + arrayPrice[i] + "kr | antal i lager: " + arrayNrOf[i]); } System.out.println(" "); System.out.print("New Array"); while(true) { //Fungerar inte eftersom programmet krasher och kan därför inte startas om, jag vill kunna fortsätta växa listan mer än 1 gång har dock inte haft möjligheten att testa om det går. if(option == 1) { int[] updatedList = new int[startSize*2]; updatedList = insertArticle(arrayPrice, arrayNrOf); print(updatedList); if(option == 0) { break; } } } return option; } public static int[] insertArticle(int[] arrayA, int[] arrayB) { int increaseWith = input(), addPrice = (int) (Math.random()*1000)+100, addNrOf = (int) (Math.random()*10)+1; int arrALen = arrayA.length; int arrBLen = arrayB.length; int[] arrA = new int[arrALen+increaseWith]; for(int i = 0; i < arrALen; i++) { arrA[i] = arrayA[i]; } arrA[arrA.length - increaseWith] = addPrice; arrALen = arrALen+increaseWith; int[] arrB = new int[arrBLen+increaseWith]; for(int i = 0; i < arrBLen; i++) { arrB[i] = arrayB[i]; } arrB[arrB.length - increaseWith] = addNrOf; arrBLen = arrBLen+increaseWith; int[] updatedArray = new int[arrALen+arrBLen]; System.arraycopy(arrA, 0, updatedArray, 0, arrALen); System.arraycopy(arrB, 0, updatedArray, arrALen, arrBLen); return updatedArray; } public static Scanner sc = new Scanner(System.in); public static void main(String[] args) { // TODO Auto-generated method stub menu(input()); } }

Permalänk
Medlem

Kan inte java men det verkar som att du försöker nå index 22 när 21 är det högsta. Om Length är 22 är indexen 0, 1, ..., 20, 21 så när du försöker öppna 22 kraschar det.

Permalänk
Medlem

Vad är meningen med detta i din print-funktion:

int length = a.length; int[] printArr = new int[length+2]; for(int i = 0; i < printArr.length; i++) {

Här lägger du ju till 2 till längden som du egentligen borde iterera över, vilket så klart orsakar en out of bounds-exception.

Permalänk
Medlem

Som ovan, kan även vara värt att kika över villkoren för while/if-satserna

while(true) { //Fungerar inte eftersom programmet krasher och kan därför inte startas om, jag vill kunna fortsätta växa listan mer än 1 gång har dock inte haft möjligheten att testa om det går. if(option == 1) { int[] updatedList = new int[startSize*2]; updatedList = insertArticle(arrayPrice, arrayNrOf); print(updatedList); if(option == 0) { break; }

Permalänk
Medlem

Klassiskt loop error. Som innan försöker du nå något som inte existerar.

Dra en -1 på den array som kraschar vid loop.

t.ex.

for(int i = 0; i < printArr.length - 1; i++) {