Zeigerfehler für Attribute

Roydebatzen

Mitglied
Hallo, ich habe einen fehler in folgendem Quelltext:
Java:
class Graph {
//Hier werdend die Attribute deklariert.
String Ausgabe;//Hier nur Fließtext verwenden. Dann fehlen Attribute für die Städte.
String[] standorte;
int[][] matrix;
String list;
/*
public Graph(){

}
*/
public void initFromUser(){
System.out.println("Anzahl Staedte: ");//müsste klappen
int amountTowns = In.readInt();// müsste klappen
int i = 0;// müsste klappen
String[] townsName = new String[amountTowns];//falsch, Hier muss etwas komplett anderes stehen.
while(i < amountTowns){// müsste klappen
System.out.println("Ortsname eingeben: ");// müsste klappen
townsName[i] = In.readWord();
i++;// müsste klappen
}


//Hier beginnt der Abschnitt indem die Ausgabe der Orte generiert wird. Bekante Fehler sind das Fehlen von Leerzeichen
int townCounter = 0;// müsste klappen
this.Ausgabe = ("Es gibt folgende Orte: ");
this.standorte = townsName;//vllt. falsch
//Hier wird der Ausgabewert der Matrix initialisiert
int a = 0;// müsste klappen
int j = 1;// müsste klappen
int[][] adjacencymatrix = new int[amountTowns][amountTowns];// müsste klappen, eventuell

//Hier wird der Ausgabewert für die Matrix generiert. Ist die Form korrekt?
while(a<amountTowns){// müsste klappen
while(j<amountTowns){// müsste klappen
System.out.println("Entfernung zwischen " + townsName[a] + " und " + townsName[j] + " (oder -1 für keine Verbindung): ");
adjacencymatrix[a][j] = In.readInt();// müsste klappen
adjacencymatrix[j][a] = adjacencymatrix[a][j];//müsste klappen
adjacencymatrix[j][j] = 0;//müsste klappen
j++;
}
a++;//müsste klappen
j = a + 1;//müsste klappen
}

//Zuweisung der Matrix, bzw. des Attributes
this.matrix = adjacencymatrix;//Richtige Zuweisung? Eventuell falsch
//adjacencyMatrixToLists();

}
}
/*
Hier sollen die Listen entstehen.
public void adjacencyMatrixToLists(){
	int listen = 0;
	int orte = 1;
	while(listen < matrix[].length()){kann ich jetzt auf matrix zugreifen?
		while(orte < matrix[].length()){
			String erstelleliste =\n + Standorte[listen];
			if(matrix[listen][orte] != -1){
				erstelleliste  = erstelleliste + "(" + Standorte[orte] + ", " + matrix[listen][orte] + ")"}
		}//Eventuell String falsch erstellt,also nicht gültig so.
		orte = 0;//müsste klappen
		listen++;//müsste klappen
	}
	this.list = erstelleliste;//Zuweisung korrekt?
}
//Aufgabe c) fehlt komplett
}

*/
.
Der folgende Datei ausführen soll:
Java:
class Towns{

public static void main(String args[]){
Graph towns = new Graph();
towns.initFromUser();
System.out.println(towns);
}

}
Der Fehler ist ein Zeigerfehler, weil die System.outprint von towns nicht auf die Attribute vond Towns zeigt, denke ich. Also ich denke die Attribute von towns werden schon richtig gespeichert, aber in der Ausgabe schein kein Zeiger drauf zu weisen.
Falls ihr die In Klasse braucht um mir zu helfen, findet ihr Sie hier:
http://www.ssw.uni-linz.ac.at/JavaBuch/In.class

Ich wäre für Hilfe echt dankbar.:toll:
 
Java:
class Towns{

public static void main(String args[]){
Graph towns = new Graph();
towns.initFromUser();
System.out.println(towns);
}

}

du gibst Syso hier nur das Objekt, woher soll Syso denn wissen, was es ausgeben soll außer das Objekt? ^^

wenn du hier z.b. die Attribute ausgeben lassen willst,... is Getter/Setter, toString- Methode oder eine "Methode mit Syso's drin" sinnvoll 🙂
 
Zuletzt bearbeitet:
Deine Klasse Graph hat keine eigene toString()-Methode, folglich wird die Standardmethode verwendet und die gibt dir nur die Referenz aus.

Aber was sollte denn
Java:
System.out.println(towns);
überhaupt ausgeben? Den String Ausgabe?
Aber selbst der beinhält nur "Es gibt folgende Orte: ", mehr speicherst du darin nicht. Da kann man nicht von einem Fehler sprechen, sondern es verhält sich genau so, wie du es programmiert hast. Ob das so beabsichtigt ist, kann man schlecht beurteilen, wenn man nicht weiß, was dein Programm denn überhaupt machen soll.
 
Hi,

mein Programm soll eine Ortematrix erstellen, also eine Matrix ausgeben in denen die Distanzen zwischen den Orten ausgegeben werde. Also eigentlich(!) sollen alle Attribute ausgegeben werden. Wir hatten auch schon mal so eine Aufgabe un da wurde es eigentlich so ähnlich gelöst. Da wurde ein Objekt[] a erstellt und dann in einer Methode ein System.out.print(p) gemacht wobei vorher das objekt a mitels ":" in p kopiert wurde, dann wurde das ganze array oder die kopie ausgegeben, so wollte ich das nun auch machen.
 
Zuletzt bearbeitet:
Um diese Ausgabe musst du dich aber selbst kümmern. Es gibt dafür keine automatische Methode, die immer sinnvolle Ergebnisse liefert - wie denn auch? Java kann ja nicht wissen, welche Instanzvariablen wie zu interpretieren sind und in welchem Zusammenhang sie stehen.

Deine Instanzvariablen enthalten zum Beispiel:
Ausgabe: "Es gibt folgende Orte: "
Standorte: Ein Array mit den vom Benutzer eingegeben Ortsnamen
matrix: Ein zweidimensionales Array, das die Entfernungen zwischen den eingegeben Orten enthält
list: null
 
Ja genau so.

Jetzt wollte ich aber eben diese Augabe durch System.out.print(towns) erhalten.
ich dachte er macht das denn in der Reihenfolge wie die Instanzvariablen gegeben sind. Also das er erst den Inhaltt von Ausgabe dann standorte und dann matrix ausgibt. Wie sollte ich es denn sonst machen? Er hat ja praktisch einen Zeiger von towns auf die Instanzvariablen, oder nicht? Ja nja gut irgendwie ist das schon klar, das er z.B. die Matrix nicht sinnvoll ausgeben kann, könnt ihr mir denn einen Ansatz geben, wie ich die Instanzvariablen über System.ou.print(towns) ausgeben kann?
Ich muss ja praktisch entweder alle sachen(ausgabe, standorte...) in towns speichern oder eher wahrschienlich einen Zeiger von towns direkt auf diese Objekte bauen. Ich könnte natürlich auch einen String mit genau diesen Instanzvariablen bauen, aber selbst dann muss ich ja noch einen zeiger von towns auf diesen string bauen, richtig?
 
Zuletzt bearbeitet:
Ich könnte natürlich auch einen String mit genau diesen Instanzvariablen bauen
Genau das solltest du. Mit einer toString()-Methode in deiner Graph-Klasse könnte das zum Beispiel so aussehen:
Java:
	public String toString() {
		return Ausgabe + Arrays.toString(standorte);
	}
Wie auch noch deine Matrix hier schön ausgeben wird, musst du dir allerdings selbst überlegen.
 
Zuletzt bearbeitet:
Oh s*****e, hoffentlich bin ich icht viel zu spät.
Ich will keine return-methode schreiben.
Ich will den Inhalt eines objects towns ausgeben über system.out.print(towns).
Ansonsten erhalte ich ja in der Zeile system.out.print(towns) immer einen zeigerfehler generiert.

Danke falls mir noch jemand helfen kann
 
Der Inhalt eines Objektes vom Typ towns ist was? --- da bin ich jetzt genau so blöd wie Java auch.
Logisch, denn den Inhalt hast du ja verzapft, ich und java können nicht wissen, was du da als Ausgabe haben möchtest.
sysout gibt was wieder ? ... richtig einen string! ... also gib der Methode auch einen String!

simples Beispiel:
Java:
public class ToStringTest {

	private int zahl  = 5;
	private String string = "Die Zahl ist ";
	
	public ToStringTest(){
		
	}
	
	public String toString(){
		return  string + zahl;
	}
	
	
	public static void main(String[] args) {
		System.out.println(new ToStringTest());
	}
}

Ausgabe= "Die Zahl ist 5"
 
Danke nochmal für die späte Antwort.

Ja das mit dieser toString methode ist so eine Technik. HAbs jetzt aber hinbekommen. versuch noch grad die ausgeklammerte toadjacencymatrix() mit an zu hängen. Falls du noch Lust hast mir zu helfen,

Ich dachte ich mach es einfach so, dass ich in meiner toString() noch eine Zeile hinzufüge ungefähr so:

String wasAuszugebenIst = AllesWasSchonDrinIst + list;

und dann wollte ich noch meine andere Methode also die adjacencymatrixtolist() so überarbeiten das sie funktioniert, aber ich finde den Fehler grade nicht.
Aufgerufen wird Sie in der intFromUser();

und folgendes steht grade drin:

Java:
public void adjacencyMatrixToLists(){//Die Methode funktioniert nicht
	int listen = 0;
	String erstelleliste = new String();
	int orte = 1;
	while(listen < matrix.length){
		while(orte < matrix.length){
			erstelleliste ="\n" + standorte[listen];
			if(matrix[listen][orte] != -1){
				erstelleliste  = erstelleliste + "(" + standorte[orte] + ", " + matrix[listen][orte] + ")";
			}
		}
		orte = 0;
		listen++;
	}
	this.list = erstelleliste;
}
 
"String wasAuszugebenIst = AllesWasSchonDrinIst + list;"
kann man theoretisch so machen, wenn du den String dann auch wirklich zurück gibst in der toString Methode und dir das so genügt.

was genau funktioniert denn nicht? (Exception?, Falsche Ausgabe? Gar nix?) 😉
was mir nur so auffällt mit Schlaf- Augen,... in dem Codestück
Code:
erstelleliste ="\n" + standorte[listen];
überschreibst du jedes Mal deinen String.

Bau einfach mal ein paar Syso ein... dann siehst Durchgang für Durchgang, wie das Programm arbeitet und kannst, gerade zu Anfang, viel leichter Fehler finden
 
Zuletzt bearbeitet:
mittlerweile hab ichs hinbekommen, aber wer mal genauer hinguckt, dem springt der fehler praktisch ins auge.
Also das mit dem überschreiben ist der eine richtig grobe schnitzer, aber es ist noch ein zweiter noch fetterer fehler drin und indirekt hast du ihn schon angesprochen....viel spaß 😀
 

Neue Themen


Zurück
Oben