Wątek przeniesiony 2018-12-03 22:17 z Java przez bogdans.

Wyjątek wykroczenia poza rozmiar tablicy – gdzie jest błąd?

0
package bmi;
import java.util.Scanner;

public class KSZ {
    public static void main(String[] args) {

          Scanner input = new Scanner(System.in);

          System.out.print("Jaka to firma (wpisz) jednoosobowa lub wieloosobowa: ");
          String firma = input.next();

          switch(firma){
          case "jednoosobowa":
              System.out.print("Podaj wartość nadwyżek finansowych: \n");
              System.out.print("W ilu latach?: ");
                int n = input.nextInt();
                float [] NF = new float[n];

                    for (int i = 0; i < n; i++) {
                        System.out.print(" Rok "+i+" ");
                        NF[i] = input.nextFloat();
                    }

                    for (int i = 0; i < n; i++) {
                        System.out.print(NF[i]+" ");
                    }
                    System.out.println();

                float [] NI = new float[n];
                System.out.print("Podaj wartość nakładu inwestycyjnego: ");
                NI[0] = input.nextFloat();

    //---------- Księgowa stopa zwrotu z amortyzacją liniową
                  //float NI1, NI2, NI3, NI4, NI5;
                  //float A1, A2, A3, A4, A5;
                  //float Zn1, Zn2, Zn3, Zn4, Zn5;

                  //Obliczenie amortyzacji liniowej
                  float [] A = new float[n];
                  for (int i = 0; i < n; i++) {
                        A[i]=NI[0]/n;
                    }
                  for (int i = 0; i < n; i++) {
                        System.out.print(A[i]+" ");
                    }
                  System.out.println();
                 // A1 = NI/n;
                 // A2 = NI/n;
                 // A3 = NI/n;
                 // A4 = NI/n;
                 // A5 = NI/n;
                  float [] Zn = new float[n];
                  for (int i = 0; i < n; i++) {
                        Zn[i]=NF[i] - A[i];
                    }
                  for (int i = 0; i < n; i++) {
                        System.out.print(Zn[i]+" ");
                    }
                  System.out.println();
                  //Zn1 = NF[1] - A[1];
                  //Zn2 = NF[2] - A[2];
                  //Zn3 = NF[3] - A[3];
                  //Zn4 = NF[4] - A[4];
                  //Zn5 = NF[5] - A[5];
                  //float [] NII = new float[n];
                  for (int i = 0; i < n; i++) {
                        NI[i+1]=NI[i] - A[i+1];
                    }
                  for (int i = 0; i < n; i++) {
                        System.out.print(NI[i]+" ");
                    }
                  System.out.println();
                  //NI1 = NI - A[1];
                  //NI2 = NI1 - A[2];
                  //NI3 = NI2 - A[3];
                  //NI4 = NI3 - A[4];
                  //NI5 = NI4 - A[5];

                  float licznik = 0;
                  for (int i=0; i<n; i++) {
                  licznik += Zn[i];
                  }
                  float mianownik = 0;
                  for (int i=0; i<n; i++) {
                  mianownik += NI[i];
                  }

                  float zysknetto = licznik/n ;
                  float nakładyinwestycyjne = (NI[0]+mianownik)/n+1;
                  float KSZ1 = (zysknetto / nakładyinwestycyjne)*100;
                  System.out.print(KSZ1);          
            break;
          case "wieloosobowa":
              System.out.print("Wieloosobowa");

            break;
          default:
              System.out.println("Nie rozpoznaje amortyzacji");
              break;

          }

          input.close();

      }
}

Taki błąd wyskakuje:

Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 5
at bmi.KSZ.main(KSZ.java:67)

Moim zdaniem w lini 67 jest za ilość wartości w tabeli

A w przypadku napisaniu tego typu :

for (int i = 0; i < n+1; i++) {
                        NI[i+1]=NI[i] - A[i+1];
                    }

Też jest błąd :(

1

A czego się spodziewasz skoro robisz tablicę na N elementów a potem masz pętlę która idzie o 1 element dalej? Ba, u ciebie to nawet o 2 indeksy dalej idziesz w tej pętli! Twoja tablica ma indeksy 0..n-1 a ty masz pętlę z warunkiem i < n+1 czyli maksymalnie i=n a potem w pętli robisz jeszcze NI[i+1] czyli efektywnie odnosisz się do indeksu n+1 podczas gdy ostatni indeks w tablicy to n-1.

0

Tworzysz tablicę która ma N elementów a następnie próbujesz w tej 67 linijcie odwołać się do elementu N+1. Poza tym, KSZ, serio? Nie nazywaj klas skrótami. A po drugie... polskie nazwy zmiennych to już przesada, a polskie nazwy zmiennych z polskimi znakami to już przesada do kwadratu.

0
Shalom napisał(a):

A czego się spodziewasz skoro robisz tablicę na N elementów a potem masz pętlę która idzie o 1 element dalej? Ba, u ciebie to nawet o 2 indeksy dalej idziesz w tej pętli! Twoja tablica ma indeksy 0..n-1 a ty masz pętlę z warunkiem i < n+1 czyli maksymalnie i=n a potem w pętli robisz jeszcze NI[i+1] czyli efektywnie odnosisz się do indeksu n+1 podczas gdy ostatni indeks w tablicy to n-1.

Dziękuję, słuszna uwaga! Nie mogłem się tego dopatrzeć.

NI[0] = NII - A[0];
                  for (int i = 0; i < n; i++) {
                        NI[i+1]=NI[i] - A[i+1];
                    }

Poprawiając w ten sposób również nie działa :(

0

Nadal masz tablicę N-elementową a odwołujesz się do N+1 elementu.

0
NI[0] = NII - A[0];
                  for (int i = 0; i < n+1; i++) {
                        NI[i+1]=NI[i] - A[i+1];
                    }

W ten sposób też wyskakuje błąd.
Jak mógłbym sobie z tym poradzić ?

0

N oznacza ile elementów wejdzie do tablicy.
Z tym, że pierwszy element nie wchodzi na miejsce o indeksie 1, a o indeksie 0.
Czyli, tablica o rozmiarze N, ostatni element będzie miała pod indeksem N-1.
A Ty uparcie próbujesz włożyć coś pod indeks N+1 albo i dalej, pod N+2.

0

Dziękuję za pomoc :)
Działa!

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