[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
"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):
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.