Prüfen ob Wert bereits in Array (Studentenverwaltung)

bubbelban

Mitglied
Hallo:)

ich habe eine Probleme bei dem Programmieren von einem Studentenmanager, den großteil habe ich eigentlich schon geschafft nun soll vor dem anlegen von einem neuen Studentenprofil geprüft werden ob die eingegebene Matrikelnummer bereits benutzt worden ist, klingt eigentlich nicht schwer, aber irgendwie komm ich nicht weiter, wäre sehr dankbar wenn mit jemand sagen kann was ich falsch mache hier mein Versuch:



[JAVA=46] public void setMatrikelNo(int matrikelNo) {
for(int i =0; i<= students.length; i++)
if(students.equals(matrikelNo)){
System.out.println("Waehlen sie eine andere Matrikelnummer diese ist bereits vergeben");
}
else{
this.matrikelNo = matrikelNo;
}

}[/code]



Was nicht funktioniert ist wie gesagt der Vergleich ob die Matrikelnummer in dem array bereits vorhanden ist, zeigt so keinen Fehler an aber beim Ausführen kommt folgende fehlermeldung:

Exception in thread "main" java.lang.NullPointerException
at Student.StudentManager.setMatrikelNo(StudentManager.java:48)
at Student.StudentDemo.main(StudentDemo.java:69)

Vielen Dank schon mal :)
 

L-ectron-X

Gesperrter Benutzer
students dürfte an der Stelle noch nicht initialisiert worden sein.
Außerdem macht es keinen Sinn, primitive Datentypen mit equals() zu vergleichen.
Was soll denn in students gespeichert werden?
 

Timothy Truckle

Top Contributor
Code:
Exception in thread "main" java.lang.NullPointerException
	at Student.StudentManager.setMatrikelNo(StudentManager.java:48)
	at Student.StudentDemo.main(StudentDemo.java:69)
Das Problem ist eindeutig: An der aktuellen Stelle steht noch keine Matrikelnummer.

An dieser Stelle kann ich mur mal wieder kopfschüttelnd fragen: was findet ihr immer an Arrays so toll? Nehmt doch einfach 'ne Liste, oder ein [JAPI]Set[/JAPI]:[JAVA=46] private Set<Integer> students = new HashSet<>();
public void setMatrikelNo(Integer /*funktioniert leider nur mit Objekten */ matrikelNo) {
if(students.contains(matrikelNo)){
System.out.println("Waehlen sie eine andere Matrikelnummer diese ist bereits vergeben");
}
else{
this.matrikelNo = matrikelNo;
students.add(matrikelNo);
}
}[/code]Wobei die bessere Lösung wahrscheinlich eine Map<Integer,Strudent> wäre...

bye
TT
 

L-ectron-X

Gesperrter Benutzer
Habs jetzt nicht getestet, aber es sollte kürzer auch so gehen:
Java:
private Set<Integer> students = new HashSet<>();
public void setMatrikelNo(int matrikelNo) {
    if(!students.add(matrikelNo)){
      System.out.println("Waehlen sie eine andere Matrikelnummer, diese ist bereits vergeben");
    }
}
 

bubbelban

Mitglied
in students soll die Matrikelnummer,Name, usw.. gespeichert werden!

das man einen Array benutzen soll ist eben Vorgabe da kann ich leider nichts ändern ;)

werd's mal probieren zu ändern ,danke schon mal :)
 

L-ectron-X

Gesperrter Benutzer
Aha, also ist students eine Referenz auf ein Student-Array, welches Objekte von Student speichert.
Dann geht der Vergleich mit equals() nicht, weil du ein Student-Objekt nicht mit einem int vergleichen kannst.
Student braucht dann eine Methode getMatrikelNo(), welche die Matrikelnummer des Studenten als int zurück gibt.
Dann kannst du mit == vergleichen.

Wenn du ein Integer zurück gibst, nimmst du equals().
 

Timothy Truckle

Top Contributor
Aha, also ist students eine Referenz auf ein Student-Array, welches Objekte von Student speichert.
Dann geht der Vergleich mit equals() nicht, weil du ein Student-Objekt nicht mit einem int vergleichen kannst.
Student braucht dann eine Methode getMatrikelNo(), welche die Matrikelnummer des Studenten als int zurück gibt.
Dann kannst du mit == vergleichen.

Wenn du ein Integer zurück gibst, nimmst du equals().
__________________
Dass löst aber seine NPE nicht...

bye
TT
 

bubbelban

Mitglied
hab das mit == auch schon probiert nur vermutlich falsch.. kopier jetzt mal die komplette klasse und startklasse..

Java:
public class StudentManager {

	/* -- Statische Elemente zum Verwalten aller Student-Objekte */
	static int              counter = 0;  // zaehlt die Anzahl angelegter Studenten
	static final int        MAX_STUDENTS = 10;
	static StudentManager[] students = new StudentManager[MAX_STUDENTS];
	                                      // in students werden instanziierte 
										  // Studenten abgelegt; die Anzahl ist 
										  // auf 10 beschraenkt
  
	
	
	private int    matrikelNo;
	String firstName, 
	       lastName;

	double grade1, 
	       grade2, 
		   grade3;

	/* -- Konstruktor */	
	public StudentManager() {
		if (counter < students.length) {  // Student hinzufuegen, counter erhoehen			
			students[counter]= this;
			counter++;
		}
		else {  // Meldung, dass zu viele Studenten generiert werden, Abbruch ...
			System.out.flush();
			System.err.println("Zu viele Studenten!");
			System.exit(-1);
		}
	}
	
	public int getMatrikelNo() {
		return matrikelNo;
	}

	public void setMatrikelNo(int matrikelNo) {
		
				for(int i =0; i<= students.length; i++)
					if(students[i] == matrikelNo){
						System.out.println("Waehlen sie eine andere Matrikelnummer diese ist bereits vergeben");
					}
					else{
					this.matrikelNo = matrikelNo;
					}
				
	}
	/* -- objekt-spezifische Methoden */
	double calcMean() {
		return (grade1 + grade2 + grade3) / 3.0;
	}
	static void printReportForAllStudents() {  // Ausgabe der reports ALLER Studenten
		for (int i = 0; i < counter; i++)
			students[i].printReport();
	}
	void printReport() {
		System.out.print(firstName + " " + lastName + " ");
		System.out.printf("(MatrNr. %07d) ", matrikelNo);
		System.out.printf("Notenschnitt: %.1f", calcMean());
		System.out.println();
	}[/Java]

und die startklasse:
[code=Java]public static void main(String[] args) {
                     StudentManager emil;

			emil = new StudentManager();  // Instanziierung eines Objekts ...
			emil.setMatrikelNo(9721332);
			emil.firstName  = "Emil";
			emil.lastName   = "Mueller";
			emil.grade1 = 1.3;
			emil.grade2 = 2.3;
			emil.grade3 = 1.7;
			
			
			StudentManager.printReportForAllStudents();
}

wenn ich das mit == statt mit equals mach zeigt es schon vor dem ausführen einen Fehler.. hab es vermutlich falsch eingesetzt? mit students == getMatrikelNo() hab ich es auch probiert aber das ging auch nicht..
 

Timothy Truckle

Top Contributor
hab das mit == auch schon probiert nur vermutlich falsch.. kopier jetzt mal die komplette klasse und startklasse..

[JAVA=6] static StudentManager[] students = new StudentManager[MAX_STUDENTS];[/code]
[JAVA=38] public void setMatrikelNo(int matrikelNo) {

for(int i =0; i<= students.length; i++)
if(students == matrikelNo){[/code]
So im direkten Vergleich sollte Dir auffallen, was L-ectron-X meinte...
Außerdem fehlt immernoch die Stelle, an der Du Werte in das Array einfügst. Bisher sind alle Elemente
Code:
null
. Daher rührt auch Deine NPE

bye
TT
 

L-ectron-X

Gesperrter Benutzer
mit students == getMatrikelNo() hab ich es auch probiert aber das ging auch nicht..

Java:
if(students[i].getMatrikelNo() == matrikelNo) {
Aber dafür muss in students am Index ein initialisiertes StudentManager-Objekt zu finden sein.
Sonst NullPointerException.

Das Array sollte besser nur Student heißen und Objekte von Student speichern.
 

Neue Themen


Oben