Archief - [JAVA] nullpointerexception

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Exorikos

Legacy Member
Ik ben me aan het voorbereiden op mijn examen BVP van morgen en wou mijn code eens testen. Nu geeft hij een nullpounterexception waar ik niet aan uit kan.

Code:
import java.io.*;

public class Test  {
	private Student[] studenten;
	
	
	public Test(){
		studenten = new Student[20];
		try{
			BufferedReader inputStream = new BufferedReader(new FileReader("C:/Documents and Settings/Stijn/Mijn documenten/studenten.txt"));
			String line = "";
			boolean klaar = false;
			int a = 0;
			
			while(klaar == false){
				line = inputStream.readLine();
				if(line == null){
					klaar = true;
				} else{
					int i = line.indexOf(";");
					int j;
					studenten[a].setStamNummer(Integer.parseInt(line.substring(0,i)));
					i = line.indexOf("/");
					studenten[a].setGeboorteDag(Integer.parseInt(line.substring(i-1,i)));
					i = line.indexOf("/",i+2);
					studenten[a].setGeboorteMaand(Integer.parseInt(line.substring(i-1,i)));
					i = line.indexOf("/",i+2);
					studenten[a].setGeboorteJaar(Integer.parseInt(line.substring(i-3,i)));
					i = line.indexOf(";",i+2);
					j = line.indexOf(" ",i+2);
					studenten[a].setVoorNaam(line.substring(i+2,j));
					i = line.indexOf(";",i+2);
					studenten[a].setAchterNaam(line.substring(j+2,i));
					i = line.indexOf(";",i+2);
					studenten[a].setGeslacht(line.charAt(i+2));
					i = line.indexOf(";",i+2);
					j = line.indexOf(";",i+2);
					studenten[a].setStudieRichting(line.substring(i+2,j+2));
					i = j;
					studenten[a].setStudieJaar(Integer.parseInt(line.substring(i+1)));
					a++;
					i = 0;
					j = 0;
					klaar = false;
				}
			}
			inputStream.close();
		}
		catch(FileNotFoundException e){
			System.out.println("file not found");
		}
		catch(IOException e){
			System.out.println("ioexception");
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Test();
	}

	
	public String getStudieRichting(String richting){
		String studierichting;
		if(richting.equalsIgnoreCase("fysica")){
			studierichting = "Fysica";
		}
		else{ if(richting.equalsIgnoreCase("lichamelijke opvoeding")){
			studierichting = "Lichamelijke Opvoeding";
		} else{
			studierichting = null;
			System.out.println("Foute richting");
		}
		}
		return studierichting;
	}
		
}

Code:
/**
 * 
 * @author Stijn
 *
 */
public class Student {
	private int stamnummer;
	private int geboortedag;
	private int geboortemaand;
	private int geboortejaar;
	private String voornaam;
	private String achternaam;
	private char geslacht;
	private String studierichting;
	private int studiejaar;
	
	public Student(){
		
	}
	
	public void setStamNummer(int nr){
		stamnummer = nr;
	}
	
	public void setGeboorteDag(int dag){
		geboortedag = dag;
	}
	
	public void setGeboorteMaand(int maand){
		geboortemaand = maand;
	}
	
	public void setGeboorteJaar(int jaar){
		geboortejaar = jaar;
	}
	
	public void setVoorNaam(String naam){
		voornaam = naam;
	}
	
	public void setAchterNaam(String naam){
		achternaam = naam;
	}
	
	public void setGeslacht(char geslacht){
		this.geslacht = geslacht;
	}
	
	public void setStudieRichting(String richting){
		studierichting  = richting;
	}
	
	public void setStudieJaar(int jaar){
		studiejaar = jaar;
	}
	
	public int getStamNummer(){
		return stamnummer;
	}
	
	public int getGeboorteDag(){
		return geboortedag;
	}
	
	public int getGeboorteMaand(){
		return geboortemaand;
	}
	
	public int getGeboorteJaar(){
		return geboortejaar;
	}
	
	public String getVoorNaam(){
		return voornaam;
	}
	
	public String getAchterNaam(){
		return achternaam;
	}
	
	public char getGeslacht(){
		return geslacht;
	}
	
	public String getStudieRichting(){
		return studierichting;
	}
	
	public int getStudieJaar(){
		return studiejaar;
	}

}

De errors zijn:
Exception in thread "main" java.lang.NullPointerException
at Test.<init>(Test.java:22)
at Test.main(Test.java:60)

Ik heb nagekeken dat die stamnummer een int is, en hij zet die dus mooi om van string naar int. Waarom komt die NullPointerException dan?

Tyfius

Legacy Member
Kunt ge anders ook is "C:/Documents and Settings/Stijn/Mijn documenten/studenten.txt" online zetten? Dat zou het voor ons al wat makkelijker maken om eens te testen.

Parnakra

Legacy Member
Als je een array van objects maakt, dien je elk object in die array ook aan te maken.

M.a.w., na de initialisatie van je array dien je (met een for-lus, bv.) je volledige tabel te overlopen en elk object erin te initialiseren (met de gewenste constructor).

/edit: je kan ook per lijn die je inleest een tijdelijk Student-object maken en dat linken naar het element v/d tabel waar je momenteel mee bezig bent.

Tyfius

Legacy Member
Ik ben geen java expert, maar ik denk dat uw probleem aan het volgende ligt:
Code:
studenten = new Student[20];
Volgens mij mag je dat niet doen. Je maakt hier geen nieuw studenten object aan maar declareert een array.

Code:
int i = line.indexOf(";");
int j;
studenten[a] = new Student();
studenten[a].setStamNummer(Integer.parseInt(line.substring(0, i)));
Dit werkte wel bijvoorbeeld.

Verder zit er nog wel een fout, ik kreeg nadien hetvolgende:
Code:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -4
	at java.lang.String.substring(Unknown Source)
	at Test.<init>(Test.java:33)
	at Test.main(Test.java:66)

Exorikos

Legacy Member
Bedankt. Die fouten daarna ga ik nog even uitzoeken, er zitten ook indexfouten tussen blijkbaar.

EDIT: refreshen kan geen kwaad ;p

MilM

Legacy Member
Die if-else lus binnen uw while lus is overbodig

Verander gewoon
String line = inputStream.readLine();

en dan while(line != null)

Niet dat het belangrijk is, is gewoon maar keer meedelen :p
Viel mij gewoon direct op en toont niet echt proper

Zo'n dingen best minimaliseren om het leesbaar te houden en niet beginnen if/else structuren met variabele booleans aanmaken
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan