Fragen zum Java-Einstieg

  • Ersteller Jazz Kartell
  • Erstellt am

Jazz Kartell

Gast
Hallo zusammen,

ich habe gerade beschlossen, parallel zu C++ auch gleich noch Java zu lernen...
Und nach den ersten paar Gehversuchen stellen sich mir folgende Fragen:

- Für C++ benutze ich Xcode und für Java habe ich mir NetBeans runtergeladen, weil ich irgendwo gelesen habe, dass sich Xcode nur bedingt für die Java-Entwicklung eignen würde. Könnt Ihr das bestätigen oder kann man mit Xcode alles machen, was man mit z.B. NetBeans machen kann?

- Eine Frage zu NetBeans: Da ich ja jetzt ziemlich viele kleine Java "Programme" basteln werde, angefangen mit "HalloWelt" :), brauche ich eine übersichtliche Darstellung (Buch/Kapitel/Programm). In Xcode habe ich meine Ordner, in denen die ganzen Dateien verteilt sind. In NetBeans bekomm ich das nicht hin. Sehe ich das richtig, dass in NetBeans alles was einzeln ausführbar sein soll auch ein eigenes Projekt sein muss?

- Nun zum eigentlichen Problem:
Ich habe Java 6 installiert und es auch geschafft, dass NetBeans diese Version benutzt... Nicht lachen, gönnt mir mein Erfolgserlebnis...

Zunächst der Quelltext:

import java.io.*;

public class Eingabe {

public static void main (String[] args) {

String name;
int geburtsjahr;


Console cons=System.console();


cons.printf("\n");
cons.printf("Bitte geben Sie Ihren volständigen Namen ein: ");
name = cons.readLine();

cons.printf("Bitte geben Sie Ihr Geburtsjahr ein: ");
String eingabe = cons.readLine();
geburtsjahr = Integer.parseInt(eingabe);
cons.printf("\n");

cons.printf(" %1$f, %2$d war ein sehr guter Jahrgang!", name, geburtsjahr);
cons.printf("\n");
}
}

Diese Console Funktion ist wohl neu in Java 6 und macht wohl das Handling von Stringeingaben leichter...
Nun bekomme ich aber beim Ausführen einen Null Pointer Exception error bei cons.printf("\n"); Da bin ich verwirrt, was ein Null Pointer ist, ist mir bewusst, aber in diesem Zusammenhang ist mir das schleierhaft.

Vielen Dank für Eure Hilfe
 

smile

Klarapfel
Registriert
11.01.05
Beiträge
279
Eine Nullpointer Exception bekommst Du immer dann, wenn Du versuchst auf ein Objekt zuzugreifen, welches nicht existiert. Im Fall von

cons.printf("\n");

kann das eigentlich nur das cons Objekt sein, da es das einzige Objekt in der Zeile ist. Andererseits hast Du ja zuvor schon erfolgreich mit dem cons gearbeitet <amKopfKratz />

Ahh, das fliegt Dir oben, direkt nach der (vergeigten) Zuweisung schon um die Ohren!?

Bevor man auf einem neuen Objekt arbeitet, sollte man immer erstmal gucken, ob es auch wirklich korrekt erzeugt wurde. Also sowas wie

if (cons != null) {

}

einbauen...
 

Trapper

Meraner
Registriert
12.05.05
Beiträge
231
Bevor man auf einem neuen Objekt arbeitet, sollte man immer erstmal gucken, ob es auch wirklich korrekt erzeugt wurde.

"Immer" halte ich für etwas übertrieben. Wenn man allerdings unsicher ist, ob die Objekt-Referenz auf NULL zeigen könnte, ist das Vorgehen natürlich dringend angeraten. Vor allem im speziellen Fall von System.console(), da sich die Java-API folgendermaßen dazu äußert:
Returns the unique Console object associated with the current Java virtual machine, if any.
Result: The system console, if any, otherwise null.
 

macmondamin

Zuccalmaglios Renette
Registriert
17.04.06
Beiträge
258
ich programmier auch gerne und viel in JAVA, bin absolut von der freien Entwicklungsumgebung Eclipse überzeugt. Bitte mal anschauen!

Gruß!
 

Jazz Kartell

Gast
macmondamin schrieb:
ich programmier auch gerne und viel in JAVA, bin absolut von der freien Entwicklungsumgebung Eclipse überzeugt. Bitte mal anschauen!

Habe ich schon mal angeschaut. Ich werde allerdings bei Xcode und NetBeans bleiben. Die zwei sind ja auch nicht die schlechteste Wahl :)

Returns the unique Console object associated with the current Java virtual machine, if any.
Result: The system console, if any, otherwise null

Mein Englisch ist nicht wirklich schlecht, aber das verstehe ich nicht... Ist das wirklich ein kompletter Satz?

smile schrieb:
Ahh, das fliegt Dir oben, direkt nach der (vergeigten) Zuweisung schon um die Ohren!?

Bevor man auf einem neuen Objekt arbeitet, sollte man immer erstmal gucken, ob es auch wirklich korrekt erzeugt wurde. Also sowas wie

if (cons != null) {

}

einbauen...

Ja, gleich beim ersten cons.printf .
Rein logisch müsste dann doch alles unter der Initalisierung
Console cons=System.console(); in die if-Abfrage? Also: ist cons kein Null Pointer, mach den Rest...
Oder was müsste in der if-Anweisung stehen?

Ist insgesamt also das Problem, dass das Objekt cons nicht richtig initalisiert wurde, sprich gar nicht existiert? Aber warum? Im Quelltext ist doch kein Fehler, oder doch?

Vielen Dank für die schon gegebene Hilfe

Frohes Frühstücken
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Mein Englisch ist nicht wirklich schlecht, aber das verstehe ich nicht...
Da steht halt, es wird die Systemkonsole zurückgegeben, falls eine existiert, ansonsten halt 'null'

Ist insgesamt also das Problem, dass das Objekt cons nicht richtig initalisiert wurde, sprich gar nicht existiert? Aber warum? Im Quelltext ist doch kein Fehler, oder doch?
Nein, im Quelltext ist so gesehen kein Fehler. Dein System hat einfach keine Systemconsole. Ich kenne Netbeans nicht, daher weiß ich nicht, was es bedeutet, wenn "Netbeans Java 6 benutzt". Ich vermute, Netbeans benutzt zwar das Java 6, wenn es den Code compiliert, wenn das Programm aber gestartet wird, läuft es dann eben doch nicht unter Java 6.

MacApple
 

Jazz Kartell

Gast
Da steht halt, es wird die Systemkonsole zurückgegeben, falls eine existiert, ansonsten halt 'null'

Nein, im Quelltext ist so gesehen kein Fehler. Dein System hat einfach keine Systemconsole. Ich kenne Netbeans nicht, daher weiß ich nicht, was es bedeutet, wenn "Netbeans Java 6 benutzt". Ich vermute, Netbeans benutzt zwar das Java 6, wenn es den Code compiliert, wenn das Programm aber gestartet wird, läuft es dann eben doch nicht unter Java 6.

MacApple

Okay, das ist sehr komisch.
Diesen console Befehl gab es wohl in Java 5 noch nicht. Ich habe in NetBeans eingestellt, dass er eben Java SE 6 und nicht Java 5 verwenden soll. Auch im Terminal wird mir die 6er Version angezeigt. Somit müsste standartmäßig die 6er Version genutzt werden, also auch beim Ausführen. Auch die Autovervollständigung in NetBeans kennt die "console" Funktion.
Ich komm nicht drauf, was da schief läuft, Funktion ist bekannt, keine Fehler beim kompilieren, aber nen Null Pointer, also doch unbekannte Funktion.
Ich habe das Problem jetzt auch beim OSXEntwicklerforum gepostet. Ich bin gespannt.
Könnte es evtl. sein, dass besagte Funktion in der Prerelease Version von Java SE 6 einfach noch nicht integriert ist, so nach dem Motto, steht in der Liste, ist aber noch nicht drin? Man weiß es nicht.
 

Trapper

Meraner
Registriert
12.05.05
Beiträge
231
Ich komm nicht drauf, was da schief läuft, Funktion ist bekannt, keine Fehler beim kompilieren, aber nen Null Pointer, also doch unbekannte Funktion.

Nein, ein Null Pointer heisst nicht, dass die Funktion nicht bekannt ist. Du bekommst von System.console() einfach kein Consolen-Objekt geliefert sondern einen NULL-Wert. Wahrscheinlich unterstützt die JVM bei dir (evlt. generell auf dem Mac) die Console nicht - damit bist du im "otherwise null" Fall.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Ich habe in NetBeans eingestellt, dass er eben Java SE 6 und nicht Java 5 verwenden soll. Auch im Terminal wird mir die 6er Version angezeigt. Somit müsste standartmäßig die 6er Version genutzt werden, also auch beim Ausführen.
Starte mal

/Applications/Utilities/Java/Java SE 6/Java Preferences

und schau mal nach, ob in der Liste unter "Java Programm Laufzeit-Einstellungen" "Java SE 6" an oberster Stelle steht.

MacApple
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Dann scheint die Mac OS X Version von Java 6 noch ein Problem mit der Systemkonsole zu haben.

MacApple
 

Jazz Kartell

Gast
Dann scheint die Mac OS X Version von Java 6 noch ein Problem mit der Systemkonsole zu haben.

MacApple

Das hoffe ich. Gibt es irgendwo eine Informationsquelle, wo man dazu Informationen bekommen kann?

Oder besser: Hat hier jemand eine Linux oder Windows Umgebung in der er das obige Programm mal testen kann?
 

Jazz Kartell

Gast
Die Dokumentation zur Java SE 6 Preview gibt es als seperaten Download an gleicher Stelle wie die Preview selbst.

MacApple

Das ist mir klar. Ist auch schon längst runtergeladen. Aber dort finde ich nichts zu system.console().
scheint wohl tatsächlich so zu sein, dass das release diese funktion einfach noch nicht unterstützt.
 

SizzLorr

Grahams Jubiläumsapfel
Registriert
02.08.06
Beiträge
107
ICh würde Eclipse nehmen. Früher oder später kommst du dahin. Ich programmiere zwar unter Windows und kenne die OSX alternativen nicht aber IMHO ist das hier die beste Wahl zumal auch kleinere Fehler unterkringelt werden und du Objekte besser verfolgen kannst.

Am Anfang würde ich garnicht mit Eingaben arbeiten sondern direkt fest mit Variablen und denen einen Wert zuweisen. Wenn man es richtig machen will müsste man auch noch mit Try und Catch usw arbeiten und falsche Eingaben damit abfangen.

Warum arbeitest du bei der Ausgabe nicht mit System.out.println( );

Exceptions kommen auch schon wenn du mit der Konsole kompilierst und nen Rechtschreibfehler hast im Sinne von Groß/Kleinschreibung im Namen.
 

Jazz Kartell

Gast
ICh würde Eclipse nehmen. Früher oder später kommst du dahin.
Warum arbeitest du bei der Ausgabe nicht mit System.out.println( );

Hab mir Eclipse besorgt und werd damit jetzt mal weiter machen.

Ich fange ja grad erst mit Java an. Laut dem Buch das ich benutze, ist ein Nachteil von System.out.prinln(), dass keine Umlaute ausgegeben werden können. Dies ist jetzt in Java 6 durch die oben verwendete Funktion möglich.
 

Tengu

Apfel der Erkenntnis
Registriert
05.02.07
Beiträge
721
Also ich meine, wer ganz vorne mitprogrammiert, braucht java 6, sofort. Der Rest der Welt könnte selbst Java 3 noch nehmen. ;)