arrays oproepen vanuit verschillende methoden, waarom java.lang.ArrayIndexOutOfBoundsException?

Vraag: wat is er mis met mijn arrays en hoe los ik het op?

Details: Ik initialiseerde de array in de hoofdmethode en de waarden werden ingesteld in één methode. Ik riep de array-waarden in een 2e methode en alles was in orde. Toen ik probeerde om de reeks in een derde methode te roepen, kreeg ik de fouten buiten de grenzen, hoewel de grootte van de serie precies hetzelfde is. Ik probeerde de array te bellen om het te kopiëren en sorteer vervolgens de 2e array.

dank je

private static  WeatherLocation[] WeatherSpots = new WeatherLocation[6];
private static Scanner Input = new Scanner(System.in);

public static void main(String[] args) 
{int Count;

for(Count = 0 ; Count < 6; Count++)
    WeatherSpots[Count] = new WeatherLocation();

WeatherSpots[0].LocationID = "Tciitcgaitc";
WeatherSpots[1].LocationID = "Redwood Haven";
WeatherSpots[2].LocationID = "Barrier Mountains";
WeatherSpots[3].LocationID = "Nina's Folly";
WeatherSpots[4].LocationID = "Scooly's Hill";
WeatherSpots[5].LocationID = "Twin Cones Park";
    SetUp();

    String Command = "";
    while(!Command.equals("Quit"))  {
    Menu();

    System.out.print("Enter Command: ");
    Command = Input.nextLine();

    if(Command.equals("Post"))
        PostTemperatureInfo();
    if(Command.equals("Daily"))
        WeeklyReport();
    else if (Command.equals("HighLow"))
        Sorting();
    }
}

public static void PostTemperatureInfo()
{
    Scanner LocalInput = new Scanner(System.in); 
    int K;
    int Temp;
    //...then get the values for each location...

    System.out.println( "Enter the Temperature for each weather station below:\n");
    System.out.println( "---------------------------------------------------------------");

    for(K = 0 ; K < 6 ; K++)  {
        System.out.println( "Weather Station: " + WeatherSpots[K].LocationID);  //Display the location of the fishing spot...

        System.out.print( "Enter Temperature:\t");   //Get the count...
        Temp = LocalInput.nextInt();
         System.out.println( "---------------------------------------------------------------");
         WeatherSpots[K].CatchCount = Temp;
        }
    System.out.println("");
     System.out.println("");
     System.out.println("");
}
public static void WeeklyReport()
{
    for(K = 0 ; K < 6 ; K++) 
        {System.out.println( "" + WeatherSpots[K].LocationID +"\t\t" + WeatherSpots[K].CatchCount + "\t\t" + String.format("%.2f", (WeatherSpots[K].CatchCount - 32) * 5/9));
}
}

public static void Sorting()
{int K = 0; 

for(K = 0 ; K < 6 ; K++);
    {int [] copycat = new int[K];


    System.arraycopy(WeatherSpots[K].CatchCount, 0, copycat[K], 0, 6);
    System.out.println("" + copycat[K]);
    Arrays.sort(copycat, 0, K);
    System.out.println("Minimum = " + copycat[0]); 
System.out.println("Maximum = " + copycat[K -1]);  

        }
    }
}
2
het weglaten van de invoer en de klassenaam verhindert ons om snel uw bestand te compileren. Uw persoonlijke naamgevingsconventies maken het moeilijk om uw code te analyseren; variabelen en attributen worden gewoonlijk met kleine letters in Java genoemd. Het delen van lustellers over verschillende methoden is een slechte gewoonte - verklaar ze in de loop header en niet te vroeg. Uw K in WeeklyReport wordt buiten verklaard, uiteraard als een andere statische variabele die 2 onafhankelijke gebruiksmogelijkheden van uw klasse verbiedt - u moet natuurlijk iets meer lezen over statisch . In Sorteren declareert u een andere K, die uw static var in de schaduw stelt ...
toegevoegd de auteur user unknown, de bron
Wat is de 2e en de 3e methode waar je het over hebt? Als we de meeste onderdelen van het programma niet nodig hebben om het probleem te begrijpen ( menu ), verwijder dan het gebruik van deze methoden en test of u de fout nog steeds kunt reproduceren. Anders bieden deze methoden, dat we uw fout kunnen reproduceren. Wat is een WheatherSpot? Misschien kun je de fout reproduceren met een array van strings of int, zodat we er niet om hoeven te geven? Maak een dergelijke test met een eenvoudige int-array. Hoogstwaarschijnlijk zult u de fout dan zelf vinden.
toegevoegd de auteur user unknown, de bron
Ik ben er zeker van dat een deel van de code in uw voorbeeld niet relevant is voor het probleem. Kun je proberen alles te verwijderen dat niet betrokken is bij het veroorzaken van de fout?
toegevoegd de auteur millimoose, de bron

2 antwoord

Vraag: Waarom niet "array.length" gebruiken in plaats van een hardcoded "6"?

Vraag: Ik zou je echt ontmoedigen om die inspringstijl te gebruiken, als je het kunt vermijden.

Hoe dan ook - dit zou moeten werken (ik heb het zelf niet geprobeerd):

public static void Sorting() {
  for(int K = 0 ; K < WeatherSpots.length ; K++) {
     int [] copycat = new int[K];

     System.arraycopy(
       WeatherSpots[K].CatchCount, 0, copycat[K], 0, WeatherSpots.length);
     System.out.println("" + copycat[K]);
     Arrays.sort(copycat, 0, K);
     System.out.println("Minimum = " + copycat[0]); 
     System.out.println("Maximum = " + copycat[K -1]);  
  }
}

Het belangrijkste was om van het externe ";" af te komen na de lus "for ()".

1
toegevoegd
ik krijg nog steeds dezelfde fouten als eerst: P Maar bedankt voor de snelle reactie Ik heb geen array.length gebruikt omdat de naam van de array "weatherspots [count] .catchcount" was en ik fouten kreeg als ik er aan .length
toegevoegd de auteur user1476390, de bron

Het probleem is dat je een array copycat toewijst die alleen K gehele getallen is, en dan probeer je er 6 elementen in te passen, zelfs als K == 0. Ik begrijp uw code niet genoeg om erachter te komen wat de juiste indexen zijn, maar dat is de oorzaak van uw probleem.

Ik geloof eigenlijk niet dat je code zoals gepost zal compileren. Deze regel van Sorteren() :

System.arraycopy(WeatherSpots[K].CatchCount, 0, copycat[K], 0, 6);

lijkt machtig achterdochtig. De eerste en derde argumenten voor System.arraycopy worden geacht arrays te zijn, maar copycat [K] is een int . Blijkbaar is dat ook WeatherSpots [K] .CatchCount .

BEWERK:

Uit uw opmerkingen en code lijkt het erop dat de routine Sorteren() alleen de min- en max-waarden van WeatherSpots [K] .CatchCount moet afdrukken. Dit kan veel gemakkelijker worden gedaan dan u aan het doen bent. Hier is een manier:

public static void Sorting() {
    int min = Integer.MAX_VALUE;
    int max = Integer.MIN_VALUE;
    for (WeatherLocation loc : WeatherSpots) {
        final int count = loc.CatchCount;
        if (count < min) {
            min = count;
        }
        if (count > max) {
            max = count;
        }
    }
    System.out.println("Minimum = " + min); 
    System.out.println("Maximum = " + max);
}
1
toegevoegd
@ user1476390 - Je kunt K = 0 hebben in de voor lus, maar wat probeer je te bereiken binnen Sorteren() ? Probeert u een gesorteerde lijst met de waarden van WeatherSpots [K] .CatchCount af te drukken? als dat het geval is, kopieert u de waarden naar een enkele kopieercat -reeks met lengte WeatherSpots.length en roept u vervolgens Arrays.sort() aan. Het lijkt er echter op dat u alleen de min- en max-waarden wilt, die u kunt krijgen door de array WeatherSpots te scannen. Zie mijn bijgewerkte antwoord.
toegevoegd de auteur Ted Hopp, de bron
Betekent dit dat ik niet moet zeggen dat K = 0 in de for-lussen? Ik dacht dat dat nodig was o_O oeps! je hebt gelijk. Ik heb het bestand met de externe klasse "public class WeatherLocation {public String LocationID; public int CatchCount;" niet inbegrepen. "
toegevoegd de auteur user1476390, de bron
dank je! mijn probleem is nu opgelost :)
toegevoegd de auteur user1476390, de bron