ich fürchte ich habe wirklich eine peinlich einfachste Frage, bin jedoch absoluter Anfänger und traue mich nun mal zu fragen.
Und zwar habe ich eine eigene Klasse "node" erstellt, mit der ich Knoten eines Graphen repräsentieren möchte.
Nun muss ich aus einer Datei einen Graphen einlesen, der natürlich aus vielen Knoten besteht. Um dies zu speichern würde ich gerne mit einem Array arbeiten. Diese Array erstelle ich nun mit
Code:
node[] nodes = new node[gsize];
wobei gsize die Größe des Graphen ist. Will ich nun zum Beispiel mit
Code:
nodes[2].getcolor();
die Färbung eines Knoten erfragen bekomme ich immer
Exception in thread "main" java.lang.NullPointerException
at main.main(main.java:17)
Der Konstruktor eines Knoten "node" sieht wie folgt aus:
Code:
public node(){
this.owner=0;
this.color=0;
};
Leider habe ich keine Idee wieso er angeblich auf einen Null Bereich zugreift. Entschuldigt bitte diese dumme Frage, aber ihr wisst sicher sofort wo das Problem liegt.
Node eins = new Node();
Node[] nodes = new Node[7];
Da fällt auf Anhieb ein Unterschied auf: Die Klammern ()
(woher soll das Programm auch wissen, welchen Konstriktor es aufrufen soll, ohne Kammern)
So sollte es funktionieren:
Code:
public class Test {
public static void main(String[] args) {
Node[] nodes = new Node[]{new Node(),new Node()};
nodes[1].getColor();
}
}
class Node{
int owner;
int color;
public Node(){
owner=5;
color=5;
}
void getColor(){
System.out.println("hh");
}
}
De facto funktioniert es tatsächlich so. Allerdings wenn ich
Code:
Node[] nodes = new Node[]{new Node(),new Node()};
nodes[1].getColor();
benutze, initialisiere ich in diesem Fall genau zwei neue Knoten, jedoch müsste ich genau gsize viele neue Knoten initialisieren. Kann ich das noch irgendwie mit einem Trick umgehen?
Ich weiß leider erst durch die Datei den Wert an Knoten den ich brauche. :-(
public static void main(String[] args) {
Node[] nodes = new Node[7];
for(int i=0; i<nodes.length; i++){
nodes[i] = new Node();
}
nodes[1].getColor();
}
(bzw. für die 7 halt die Variable einsetzen)
--------------------------------------------------------------------------
Die einzelnen Felder müssen halt noch initialisiert werden
Das ist genauso, als wenn du ein int Array erzeugst mit: int [] name = new int[5];
und dann auf den 2. Inhalt zugreifen möchtest, (das geht zwar, weil Java automatisch die leeren Felder mit
0 initialisiert, doch bei anderen Typen geht es nicht, z.B. bei deiner Klasse)
Noch schnell eine weitere Sache, vielleicht kannst du auch damit was anfangen, es tut mir echt leid, mit solchen Fragen hier anzukommen:
Code:
while ((line=f.readLine())!=null) {
if (line==".") System.out.println(1);
Somit möchte ich in meiner Datei den . als Trennzeichen nutzen, jedoch bekomme ich niemals eine 1 ausgegeben, das bedeutet irgendwie erkennt er meinen Vergleich nicht?!?!?!?
import java.io.*;
public class AnzahlDerZeichen{
public static void main(String args[]) throws IOException{
String dateiname="datei.txt";
BufferedReader ein = new BufferedReader(new FileReader(dateiname));
int zeichenanzahl=0;
int chValue; // Speichert das aktuell gelesene Zeichen als int.
// Braucht man um auf -1 abfragen zu können!
char ch; // Speichert das aktuell gelesene Zeichen als char.
while((chValue = ein.read()) != -1){
ch = (char) chValue;
if(chValue=='.'){zeichenanzahl++;}
}
ein.close();
System.out.println(""+zeichenanzahl);
}
}
Dieser Programm zählt die Punkte in einem txt Dokument.
Die Variable "line" ist doch ein String -Objekt. Daher würde die Lösung über mir nur funktionieren, wenn in der ganzen
Zeile nur ein Punkt steht, wenn es aber zwischen zwei Worten als Trennsymbol stehen soll, hilft dir dies bestimmt weiter
Edit: oder wenn deine Datei folgenden Inhalt hat: "name.name" und du willst nun die beiden "Namen" in zwei einzelnen
Variablen speichern, dann mach es doch einfach so. Du liest die ganze Zeile aus, speicherst sie in einem String und
zerlegst diesen (der Punkt als Trennzeichen):
Ich würde dir empfehlen, statt des Arrays eine ArrayList zu verwenden. Da kann man beliebige viele Knoten reintun, und weiß immer, wie viele gerade drin sind.