# Prüfen ob Wert bereits in Array (Studentenverwaltung)



## bubbelban (13. Jan 2013)

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 (13. Jan 2013)

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 (13. Jan 2013)

bubbelban hat gesagt.:


> ```
> 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 (13. Jan 2013)

Timothy Truckle hat gesagt.:
			
		

> /*funktioniert leider nur mit Objekten */


Autoboxing?


----------



## Timothy Truckle (13. Jan 2013)

L-ectron-X hat gesagt.:


> Autoboxing?


Richtig, aber der erste Entwurf war mit 
	
	
	
	





```
[JAPI]Arrays[/JAPI].asList()
```
, das ja keine primitiven Arrays unterstützt.

Wieder ein schönes Beispiel, warum man ehr nicht Kommentieren sollte... :noe:

bye
TT


----------



## L-ectron-X (13. Jan 2013)

Habs jetzt nicht getestet, aber es sollte kürzer auch so gehen:

```
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 (13. Jan 2013)

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 (13. Jan 2013)

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 (13. Jan 2013)

L-ectron-X hat gesagt.:


> 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.
> ...


Dass löst aber seine NPE nicht...

bye
TT


----------



## L-ectron-X (13. Jan 2013)

Das ist richtig, dafür hat er aber bereits weiter oben die passenden Hinweise bekommen. Oder nicht?


----------



## bubbelban (13. Jan 2013)

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


```
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 (13. Jan 2013)

bubbelban hat gesagt.:


> 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) {
> ...


_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:In die Zwischenablage kopieren


null

. Daher rührt auch Deine NPE

bye
TT_


----------



## L-ectron-X (13. Jan 2013)

bubbelban hat gesagt.:


> mit students_ == getMatrikelNo() hab ich es auch probiert aber das ging auch nicht.._


_


		Java:In die Zwischenablage kopieren


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._


----------

