Java Problem bei der Rückgabe eines Arrays

silverhammer

Mitglied
Hallo Community

Ich habe ein Programm geschrieben, dass in einem Geschäft 3 neue Mitarbeiter erstellt (personalnummer, name und geschlecht in einem array gespeichert).

Das Programm soll nun (mit einer for-Schleife [zwingend!]) nach dem Mitarbeiter mit der Personalnummer 3 suchen und dessen namen und Personalnummer ausgeben. Hier mal die 3 Klassen, die ich erstellt habe:

Java:
package Lektion_1;

public class MitarbeiterTest {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
	Mitarbeiter mArr [] = new Mitarbeiter [10] ; 
	
	mArr[0] = new Mitarbeiter (2, "Hans", 'm'); 
	mArr[1] = new Mitarbeiter (3, "Anna", 'w'); 
	mArr[2] = new Mitarbeiter (6, "Erik", 'm'); 
	
	Mitarbeiter m = searchPersNr (mArr, 3); //mArr sagt wo zu suchen ist, 3 sagt welcher Wert gesucht wird
	System.out.println( m ); 
	
	} //close main
	
	private static Mitarbeiter searchPersNr (Mitarbeiter[] mArr, int pnr) { //mArr nimmt alle Arrays mit (mit allen infos)
		for (int i = 0; i < mArr.length; i++) {
			
			if (mArr [i].getPnr() == 3) {
				
				String t = mArr [i].getName(); 
				int p = mArr [i].getPnr(); 
				char s = mArr [i].getSex(); 
				
				Rückgabe r [] = new Rückgabe [1]; 
					r [0] = new Rückgabe (t, p); 
					
			} //close if

		} //close for
		
	return r [];
		
	} //close searchPersNr
	
	
} //close class

Java:
package Lektion_1;

public class Mitarbeiter {
	public int pnr; 
	public String name; 
	public char sex; 
	
	public Mitarbeiter (int pnr, String name, char sex) {
		this.pnr = pnr; 
		this.name = name; 
		this.sex = sex; 
			
	} //close public Mitarbeiter
	
	public String toString () {
		return pnr + " " + name + " (" + sex +")"; 
	} //close String toString

	public String getName() {
		return name; 
	} //close String getName

	public int getPnr() {
		return pnr;
	} //closeString getPnr
	
	public char getSex() {
		return sex;
	} //close getSex
	
} //close class

Java:
package Lektion_1;

public class Rückgabe {

	public String t; 
	public int p;
	public char s; 
	
	public Rückgabe (String t, int p) {
		this.t = t; 
		this.p = p; 
		this.s = s; 
		
		
	} //close public Rückgabe

} //close class


ich habe noch einen Fehler bei der Rückgabe (Zeile 36 der main-klasse)
wieso kann ich diesen Array nicht zurück geben?

Dank im Voraus 🙂
 
Zuletzt bearbeitet:
Wenn du in deiner searchPersNr-Methode als Rückgabetyp Mitarbeiter hast, kannst du auch nur einen Mitarbeiter zurückgeben.
Wenn du ein Array vom Typ Rückgabe zurückgeben möchtest musst du das auch so hinschreiben.

Java:
private static Rückgabe[] searchPersNr (Mitarbeiter[] mArr, int pnr){
//mach was
Rückgabe r [] = new Rückgabe [1];
r [0] = new Rückgabe (t, p); 
return r;
}

€dit:
Wenn du allerdings immer nur ein Array mit der Länge 1 zurückgibst macht das wenig Sinn.
Das Array ist dann überflüssig.
 
Zuletzt bearbeitet:
Danke schon mal für die Hilfe

bei mir sieht der code jetzt so aus:

Java:
private static Rückgabe searchPersNr (Mitarbeiter[] mArr, int pnr) { //mArr nimmt alle Arrays mit (mit allen infos)
		for (int i = 0; i < mArr.length; i++) {
			
			if (mArr [i].getPnr() == 3) {
				
				String t = mArr [i].getName(); 
				int p = mArr [i].getPnr(); 
				char s = mArr [i].getSex(); 
				
				Rückgabe r [] = new Rückgabe [1]; 
					r [0] = new Rückgabe (t, p); 
					
			} //close if

			return r ;

		} //close for
		
	
		
	} //close searchPersNr


sind die klammern am richtigen ort gesetzt?
Bei "return r" kriege ich aber noch die fehlermeldung: "r cannot be resolved to a variable"

wieso nicht?


Edit: Die Rückgabe beinhaltet aber ja den namen und die personalnummer, also ein String und ein int...
 
Zuletzt bearbeitet:
Das liegt daran, dass r nur innerhalb des If-Blocks bekannt ist.

Zur Rückgabe:
Du gibst ein Array von Rückgabe zurück. Aus was der Typ Rückgabe besteht ist dabei egal.
Deine Methodendekleration stimmt aber immer noch nicht ganz, wenn du wirklich das Array zurück geben willst.
Java:
private static Rückgabe[] searchPersNr (Mitarbeiter[] mArr, int pnr)
Die eckigen Klammern fehlen bei dir. Du sagst das nur ein Rückgabe-Objekt returned wird. Bei der return-Anweisung im Methodenrumpf steht, dass du ein Array von Rückgabe-Objekten zurückgibst.
Das stimmt nicht überein, also musst eine Sache anpassen.
 
Also nochmals die ganze main...geändert habe ich in zeile 15 und 20 mitarbeiter durch rückgabe ersetzt

Das Problem ligt also noch in zeile 36, dass ich r nicht zurückgeben kann.

Java:
package Lektion_1;

public class MitarbeiterTest {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
	Mitarbeiter mArr [] = new Mitarbeiter [10] ; 
	
	mArr[0] = new Mitarbeiter (2, "Hans", 'm'); 
	mArr[1] = new Mitarbeiter (3, "Anna", 'w'); 
	mArr[2] = new Mitarbeiter (6, "Erik", 'm'); 
	
	Rückgabe [] m = searchPersNr (mArr, 3); //mArr sagt wo zu suchen ist, 3 sagt welcher Wert gesucht wird
	System.out.println( m ); 
	
	} //close main
	
	private static Rückgabe [] searchPersNr (Mitarbeiter[] mArr, int pnr) { //mArr nimmt alle Arrays mit (mit allen infos)
		for (int i = 0; i < mArr.length; i++) {
			
			if (mArr [i].getPnr() == 3) {
				
				String t = mArr [i].getName(); 
				int p = mArr [i].getPnr(); 
				char s = mArr [i].getSex(); 
				
				Rückgabe r [] = new Rückgabe [1]; 
					r [0] = new Rückgabe (t, p); 
					
			} //close if
			
		} //close for
	
		return r;
		
	} //close searchPersNr
	
	
} //close class


Wie kann ich denn die Rückgabe machen? dafür müsste ich ja das r irgendie aus der if schleife herausnehmen.. nur wie?
 
Zuletzt bearbeitet:
Ich find das ganz umständlich geschrieben. Aber naja, erklärung oben ist korrekt.

Nutze doch einfach eine HashMap oder so, dann kannst alles rein klimpern und über den Key bekommst du deinen Mitarbeiter ganz einfach.

public class MitarbeiterTest {

public static void main(String[] args) {
// TODO Auto-generated method stub


HashMap<int, Mitarbeiter > mitarbeiterMap = new HashMap<int, Mitarbeiter> ;

mitarbeiterMap.add(new Mitarbeiter (1, "Hans", 'm'));
mitarbeiterMap.add(new Mitarbeiter (2, "Hansi", 'm'));
mitarbeiterMap.add(new Mitarbeiter (3, "Hans", 'm'));

Mitarbeiter m = mitarbeiterMap.get(3);

System.out.println( m.getName() );

} //close main
 
Du musst nur die Sichtbarkeit von r erhöhen.

So:
Java:
    private static Rückgabe [] searchPersNr (Mitarbeiter[] mArr, int pnr) { //mArr nimmt alle Arrays mit (mit allen infos)
        for (int i = 0; i < mArr.length; i++) {
           
                Rückgabe r [] = new Rückgabe [1];

            if (mArr [i].getPnr() == 3) {
               
                String t = mArr [i].getName();
                int p = mArr [i].getPnr();
                char s = mArr [i].getSex();
       
                    r [0] = new Rückgabe (t, p);
                      return r;
            } //close if
           
        } //close for
   
     
       
    } //close searchPersNr

oder besser:
Java:
   private static Rückgabe [] searchPersNr (Mitarbeiter[] mArr, int pnr) { //mArr nimmt alle Arrays mit (mit allen infos)

Rückgabe r [] = new Rückgabe [1];

        for (int i = 0; i < mArr.length; i++) {
           
                

            if (mArr [i].getPnr() == 3) {
               
                String t = mArr [i].getName();
                int p = mArr [i].getPnr();
                char s = mArr [i].getSex();
       
                    r [0] = new Rückgabe (t, p);
                       return r;
            } //close if
           
        } //close for
   
    
       
    } //close searchPersNr


Wenn dir das noch nicht klar ist, solltest du aber aufjeden Fall nochmal etwas über die Sichtbarkeit von Variablen nachlesen. Das ist absolut wichtig und muss man verstanden haben.

€dit: (@dogmi)
sind sicherlich einige Sachen die man vereinfachen könnte, aber ich denke mal Silverhammer ist noch nicht solange dabei. Deshalb lieber Schritt für Schritt.
 
Zuletzt bearbeitet:
Jaa aber ich muss leider eine for schleife machen und mit arrays arbeiten (Studium... vorschriften... etc) :S

Dein 2. Post hat sehr geholfen.. danke 🙂

in eclipse werden jetzt keine fehler mehr angezeigt, wenn ich das Programm aber abspiele kommt folgende fehlermeldung in der Ausgabe:

Exception in thread "main" java.lang.NullPointerException


was ist das genau? und wie behebe ich dieses Problem?
 
Danke für den tipp 🙂

Wie richtig vermutet wird bin ich noch nicht lange dabei.. aber das kommt mit der zeit (bin optimistisch ^^)

was genau meinst du mit sichtbarkeit der variabeln? ich konnte kein unterschied sehen in deinem Post zu meinem... bin ich blind ? :S
 
Jaa aber ich muss leider eine for schleife machen und mit arrays arbeiten (Studium... vorschriften... etc) :S

was für *****en, nur Theorie und keine Praxis.
Hoffe ich hab nix vergessen.

Ich schreib dir das mal richtig:

package Lektion_1;

public class MitarbeiterTest {

public static void main(String[] args) {
// TODO Auto-generated method stub


Mitarbeiter mArr [] = new Mitarbeiter [10] ;

mArr[0] = new Mitarbeiter (2, "Hans", 'm');
mArr[1] = new Mitarbeiter (3, "Anna", 'w');
mArr[2] = new Mitarbeiter (6, "Erik", 'm');

int index = searchPersNr (mArr, 3);

System.out.println( mArr[index ].getName() );

} //close main

private static int searchPersNr (Mitarbeiter[] mArr, int pnr) {
for (int i = 0; i < mArr.length; i++) {

if (mArr .getPnr() == pnr) {

return i;

} //close if

} //close for



} //close searchPersNr


} //close class
 
Musst am besten dazu sagen, dass wo genau der Fehler auftritt (in welcher Zeile).

Ich vemute das Problem liegt aber ursrpünglich in der Rückgabe-Klasse.
Java:
public class Rückgabe {
 
    public String t;
    public int p;
    public char s;
   
    public Rückgabe (String t, int p) {
        this.t = t;
        this.p = p;
        this.s = s;
    } //close public Rückgabe
 
} //close class

Du hast die Instanzvariable s, welche nie wirklich mit einem Wert belegt wird. Im Konstuktor übergibst du ja auch kein char. Im Prinzip ist s aber auch überflüßig, weil dich ja eh nur der Name und die Personalnummer interessieren.


Zur Sichtbarkeit:
Solltes du dir wie gesagt auf jeden Fall klar machen. Hier kannst du z.B nochmal nachlesen.
Galileo Computing :: Java ist auch eine Insel – 2.4 Blöcke, Initialisierung und Sichtbarkeit


mfg

€dit:
Ja der Unterschied war die Stelle wo r definiert ist. Die Return Anweisung sollte im If-Block stehen. So wird, wenn du den Treffer hast direkt returned und nicht unötigerweise noch alle anderen Mitarbeiter untersucht.
 
Zuletzt bearbeitet:
Also einen fehler wird mir nicht mehr angezeigt.. nur die ausgabe lautet dann:

Exception in thread "main" java.lang.NullPointerException
at Lektion_1.MitarbeiterTest.searchPersNr(MitarbeiterTest.java:24)
at Lektion_1.MitarbeiterTest.main(MitarbeiterTest.java:15)


Die rückgabe in die if schlaufe zu nehmen funktioniert nicht, weil dann for keine rückgabe mer hätte... was ja nicht sein darf :S

in der Rückgabe klasse ist s drinn wird aber nicht benutzt. Ich habe die mal rein getan damit isch das geschlecht auch ausgeben könnte, das wäre dann für eine erweiterung vorhanden. Jetzt landet das einfach auf dem garbage collector... sollte aber nicht stören.

Wenn sie die 3 classen bei sich testen finden sie vielleicht den fehler.. ich weiss nicht wie ich es besser beschreiben könnte... ich schicke die 3 klassen nochmals alle mit:

Java:
package Lektion_1;

public class MitarbeiterTest {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	
	Mitarbeiter mArr [] = new Mitarbeiter [10] ; 
	
	mArr[0] = new Mitarbeiter (2, "Hans", 'm'); 
	mArr[1] = new Mitarbeiter (3, "Anna", 'w'); 
	mArr[2] = new Mitarbeiter (6, "Erik", 'm'); 
	
	Rückgabe [] m = searchPersNr (mArr, 3); //mArr sagt wo zu suchen ist, 3 sagt welcher Wert gesucht wird
	System.out.println( m ); 
	
	} //close main
	
	private static Rückgabe [] searchPersNr (Mitarbeiter[] mArr, int pnr) { //mArr nimmt alle Arrays mit (mit allen infos)
		Rückgabe r [] = new Rückgabe [1];
		for (int i = 0; i < mArr.length; i++) {
			
			if (mArr [i].getPnr() == 3) {
				
				String t = mArr [i].getName(); 
				int p = mArr [i].getPnr(); 
				char s = mArr [i].getSex(); 
				
				
					r [0] = new Rückgabe (t, p); 
					
			} //close if
			
		} //close for
	
		return r ;
		
	} //close searchPersNr
	
	
} //close class

Java:
package Lektion_1;

public class Mitarbeiter {
	public int pnr; 
	public String name; 
	public char sex; 
	
	public Mitarbeiter (int pnr, String name, char sex) {
		this.pnr = pnr; 
		this.name = name; 
		this.sex = sex; 
			
	} //close public Mitarbeiter
	
	public String toString () {
		return pnr + " " + name + " (" + sex +")"; 
	} //close String toString

	public String getName() {
		return name; 
	} //close String getName

	public int getPnr() {
		return pnr;
	} //closeString getPnr
	
	public char getSex() {
		return sex;
	} //close getSex
	
} //close class

Java:
package Lektion_1;

public class Rückgabe {

	public String t; 
	public int p;
	public char s; 
	
	public Rückgabe (String t, int p) {
		this.t = t; 
		this.p = p; 
		this.s = s; 
		
		
	} //close public Rückgabe

} //close class
 
Okay, nochaml drüber geschaut.
Die Exception kommt, weil du bei Methodenaufruf ein Array mit der Länge 10 übergibst.
Allerdings hast du nur die ersten drei Plätze belegt. Bei allen anderen steht dann einfach nur null drin.
In der Methode bekommst du dann beim vierten Durchlauf der Schleife das Problem. Du willst prüfen ob die Personalnummer des Mitarbeiters an der vierten Stelle im Array die gesuchte Nummer ist.
Nur steht an der vierten Stelle einfach nur die null-Referenz und daher auch die NullPointerException.


@return
ja dann brauchst du noch eine zweite return Anweisung die etwas zurückgibt, wenn die if-Bedingung nie wahr geworden ist.
Das Problem hast du so aber auch noch.
Wenn die gesucht Nummer nicht existiert, dann gibst du jetzt auch nur das Array zurück in dem an Stelle 0 auch nur die null-Referenz steht.

@Rückgabe-Klasse
Ich würde das dennoch lieber weg machen, weil es (auch wenn es das jetzt doch nicht war) Problemen führen kann wenn man versucht auf s zu zugreifen.
Außerdem kannst du, wenn du das Geschlecht auch mit zurückgeben willst in deiner searchPersNr-Methode auch gleich das gefundene Mitarbeiter_Objekt zurückgeben. Rückgabe und Mitarbeiter hätten dann genau die gleichen Attribute.

€dit:
du solltes den Hinweis von Barista auch noch berücksichtigen
 
Zuletzt bearbeitet:
Danke sehr.. jetzt haben wir es gleich 🙂

Ich habe das ende der main mit einem break ergänzt.. sieht jetzt so aus:

Java:
private static Rückgabe [] searchPersNr (Mitarbeiter[] mArr, int pnr) { //mArr nimmt alle Arrays mit (mit allen infos)
		Rückgabe r [] = new Rückgabe [1];
		for (int i = 0; i < mArr.length; i++) {
			
			if (mArr [i].getPnr() == 3) {
				
				String t = mArr [i].getName(); 
				int p = mArr [i].getPnr(); 
				char s = mArr [i].getSex(); 
				
				
					r [0] = new Rückgabe (t, p); 

			} //close if
			 break; 
		} //close for
		
		return r; 
		
	} //close searchPersNr
	
	
} //close class


nun bekomme ich folgende ausgabe:
[LLektion_1.Rückgabe;@1bd4f279

Nach meinem wissen weiss java jetzt wo die ausgabe gespeichert ist, kann diese aber nicht lesen. Stimmt das?
Wie kann ich nun dieses Problem beheben?
 
Das ist der Hash-Code in hexadezimal.
Rückgabe hat die toString Methode vermutlich nicht überschrieben, daher wird die aus der Superklasse (Object) aufgerufen.
Wobei du wenn dann auch eine Stelle des Arrays angeben muss, welche du Ausgeben willst.
Für das gesamte Array ist die toString-Methode sowieso nicht überschrieben.
 

Zurück
Oben