[Java]Sortering av array, vad är fel på min kod?

Permalänk

[Java]Sortering av array, vad är fel på min kod?

Hej!

Jag har fått problem med en skoluppgift.
Uppgiften går ut på att sortera en array utav CD-objekt, vilket är en class vi skapat bestående utav CD-skivor.

Mitt problem är att jag stöter på ett problem på rad 62 när jag försöker köra programmet. Närmare bestämt

Citat:

"Exception in thread "main" java.lang.NullPointerException
at labb4.Labb4.findMin(Labb4.java:62)
at labb4.Labb4.sort(Labb4.java:76)
at labb4.Labb4.main(Labb4.java:54)
Java Result: 1"

Här kommer resten utav koden.

Labb4.java:

package labb4; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; public class Labb4 { // Här börjar klassen Labb4. public static void main(String[] args) throws FileNotFoundException { CD[] skivor = new CD[100]; // Skapar en array av typen CD med 100 index. int i = 0; try { File myFile = new File("C:\\Users\\Micke\\Documents\\NetBeansProjects\\Labb4\\src\\labb4\\skivor.txt"); FileReader fileReader = new FileReader(myFile); BufferedReader lineReader = new BufferedReader(fileReader); //Filereader (fileReader) läser av filen "myFile" med hjälp utav en BufferedRader (lineReader). String textLine; while ((textLine = lineReader.readLine()) != null) { String[] strArr = textLine.split(" "); CD skiva; if (strArr.length == 7) { skiva = new CD(strArr[0], strArr[1], strArr[2], Integer.parseInt(strArr[4]), strArr[3], Integer.parseInt(strArr[5]), Double.parseDouble(strArr[6])); } else { skiva = new CD(strArr[0], strArr[1]); } /* While-loop som delar upp varje rad i textfilen och sätter in i en array (strArr[]). Om arrayens längd är 7 så skapas ett CD-objekt med sju strängar. * Annars skapas ett CD-objekt med två strängar. */ skivor[i] = skiva; ++i; // CD-objekten läggs i varsitt index i en array vid namn "skivor". } // Skrivorna sorteras enligt metoden "sort". lineReader.close(); fileReader.close(); // lineReader och fileReader stänger de filer som de arbetar med. } catch (IOException ioe) { System.out.println("Fel i din inläsning "); } // Om ingen fil finns i angiven katalog skrivs detta felmeddelande ut. int max = i; sort(skivor); writeCDsToFile(skivor, max); } public static int findMin(CD[] array, int startIndex) { int min = startIndex; for (int i = startIndex + 1; i < array.length; i++) { if (array[i].getArtist().compareToIgnoreCase(array[min].getArtist()) < 0) { min = i; } if (array[i].getArtist().compareToIgnoreCase(array[min].getArtist()) == 0) { if (array[i].getTitel().compareToIgnoreCase(array[min].getTitel()) < 0) { min = i; } } } return min; } public static void sort(CD[] skivor) { // Metoden sort börjar här. for (int i = 0; i < skivor.length; i++) { int idx = findMin(skivor, i); CD tmp = skivor[idx]; skivor[idx] = skivor[i]; skivor[i] = tmp; } /* Iteration som sorterar skivorna med Selection Sort. Metoden antar att den första skivan är den minsta och jämför den sedan med de andra skivorna. * Om metoden hittar ett mindre värde sätts detta värde på första platsen och resten flyttas ett steg åt höger. * I detta fall jämförs skivornas artister. Skulle artisterna vara lika så börjar metoden istället jämföra titlarna för att avgöra vilken skiva som är minst. */ } public static void writeCDsToFile(CD[] discs, int max) throws FileNotFoundException { File sortedFile = new File("C:\\Users\\Micke\\Documents\\NetBeansProjects\\Labb4\\src\\labb4\\SorteradeSkivor.txt"); PrintWriter pw = new PrintWriter(sortedFile); // En sorterad fil skapas med File (sortedFile). Strängarna skrivs till filen med hjälp av PrintWriter (pw). for (int i = 0; i < max; ++i) { if (discs[i].getGenre() == null) { pw.printf("%s, %s \n", discs[i].getArtist(), discs[i].getTitel()); pw.println(); } else { pw.printf("%s, %s, %s, %d, %s, %d, %.2f \n", discs[i].getArtist(), discs[i].getTitel(), discs[i].getGenre(), discs[i].getUtgivningsår(), discs[i].getSkivbolag(), discs[i].getAntal(), discs[i].getSpeltid()); pw.println(); } } // Iteration som avgör hur PrintWriter med hjälp utav "printf" och "println" ska skriva skivorna till filen. pw.close(); } }

CD.java:

package labb4; public class CD { // här börjar klassen CD private String artist; //deklarerar att variabeln artist ska vara av string private String titel; //deklarerar att variabeln titel ska vara av typen string private String genre; //deklarerar att variabeln genre ska vara av typen string private int utgivningsår; //deklarerar att variabeln utgivningsår ska vara av typen int private String skivbolag; //deklarerar att variabeln skivbolag ska vara av typen string private int antal; //deklarerar att variabeln antal ska vara av typen int private double speltid; //deklarerar att variabeln speltid ska vara av typen double public CD() { } // Detta är en defult konstruerare public CD(String artist, String titel) { this.artist = artist; this.titel = titel; } //Detta är en konstruerare med 2 parametrar (artist och titel) public CD(String artist, String titel, String genre, int utgivningsår, String skivbolag, int antal, double speltid) { this.artist = artist; this.titel = titel; this.genre = genre; this.utgivningsår = utgivningsår; this.skivbolag = skivbolag; this.antal = antal; this.speltid = speltid; } //Detta är en konstruerare som innehåller alla angivna variabler public void printBreaf() { System.out.printf("%s\n%s\n%s\n", artist, titel, utgivningsår); } //Denna metod skriver ut artist,titel,utgivningsår public void printFull() { System.out.printf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n", artist, titel, genre, skivbolag, utgivningsår, antal, speltid); } //Denna metod skriver ut alla variabler jag angivit /*Här kommer alla get metoder av det variabler jag angivit * Get metoden funkar så att den hämtar värdet från den * angivna variabeln */ public String getArtist() { return artist.toString(); } public String getTitel() { return titel.toString(); } public String getGenre() { return genre; } public int getUtgivningsår() { return utgivningsår; } public String getSkivbolag() { return skivbolag.toString(); } public int getAntal() { return antal; } public double getSpeltid() { return speltid; } /*Här kommer alla set metoder av de variabler jag angivit * Set metoden funkar så att den sätter ett värde på den * angivna variabeln */ public void setArtist(String artist) { this.artist = artist.toString(); } public void setTitel(String titel) { this.titel = titel.toString(); } public void setGenre(String genre) { this.genre = genre.toString(); } public void setUtgivningsår(int utgivningsår) { this.utgivningsår = utgivningsår; } public void setSkivbolag(String skivbolag) { this.skivbolag = skivbolag.toString(); } public void setAntal(int antal) { this.antal = antal; } public void setSpeltid(double speltid) { this.speltid = speltid; } }

Skivor.txt (som Labb4.java läser av):

Citat:

Elvis_Presley Jailhouse_Rock Rock RCA 1991 17 72.23
Massive_Attack Protection
Massive_Attack Blue_Lines
Test_Iscicles Circle-Square-Triangle Ska NoLabel 1995 2 9.12

Hjälp uppskattas då jag börjar närma mig deadline för uppgiften.

Permalänk

Läs meddelandet i det exception du får en gång till, det är ett lätt fel, du ska klara av det om du lagt tid på att försöka förstå det ni lär er (om ni inte har en oerhört konstig lärare). Jag såg felet direkt, en ledtråd: titta på antal rader i filen med CD-skivor, hur många loopar du när du sorterar?

Visa signatur

RTFM - vacker sak att säga till folk som ställer dumma frågor