Was ist hier falsch?
-
Hallo!
Ich habe ein Problem (bin totaler Java-Beginner):import java.awt.*; import java.awt.event.*; class hellowin { static Frame myFrame1 = new Frame(); static Button myButtons[]; public static void Initialize() { for(int i=0;i<10;i++) { myButtons[i] = new Button(); } } public static void showwin() { Initialize(); myButtons[0].setLabel("Hello"); myButtons[1].setLabel("Welt"); myButtons[0].addActionListener( new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent ButtonEvent) { System.exit(0); } }); myFrame1.add(myButtons[0]); myFrame1.add(myButtons[1]); myFrame1.setLayout(new FlowLayout()); myFrame1.setTitle("Hello World"); myFrame1.setSize(200, 100); myFrame1.setVisible(true); } public static void main(String args[]) { //System.out.println("scheissprogramm"); showwin(); } }
Kompiliert wirds ohne Probleme, aber wenn ichs starte...
Exception in thread "main" java.lang.NullPointerException at hellowin.Initialize(hellowin.java:14) at hellowin.showwin(hellowin.java:19) at hellowin.main(hellowin.java:45)
Kann sein das mein Ansatz noch zu prozedual ist (ich hab echte Probleme mit OOP) aber mich interessiert hier mehr was da bitte falsch sein soll? Ein ähnliches Beispiel ausm Netz macht es genauso...
Gruss, code_pilot
-
Du sagst zwar dass du ein Array von Buttons haben möchtest reservierst dafür aber überhaupt keinen Speicher für das Array. Für die Referenzen allerdings tust du es ...
[java] static Button myButtons[] = new Button[10];[/code]
-
myButtons ist eine Nullreferenz
-
Hi!
Jau danke, funktioniert. Aber noch eine Frage:Wenn ich es doch so deklariere:
static Button myButtons[] = new Button[10];
Meint man doch das ich ein Array erstelle, welches 10 mal das Objekt Button enthält. Wiso MUSS ich dann aber diese for-Schleife noch ausführen, wo dann nochmal jedes Objekt explizit ein Objekt zugewiesen bekommt??
for(int i=0;i<10;i++) { myButtons[i] = new Button(); }
Denn als ich es ohne meine Initialize()-Funktion probiert hatte, funktionierte es wieder nicht, wird sie jedoch aufgerufen gehts.
Gruss, code_pilot
-
Original erstellt von code_pilot:
**Wenn ich es doch so deklariere:static Button myButtons[] = new Button[10];
Meint man doch das ich ein Array erstelle, welches 10 mal das Objekt Button enthält. Wiso MUSS ich dann aber diese for-Schleife noch ausführen, wo dann nochmal jedes Objekt explizit ein Objekt zugewiesen bekommt??**
Nein, dann hat man ein Array erzeugt, was 10 Nullreferenzen vom Typ Button enthält.
-
Arghhh kann sein das ich zu viel prozedural programmiere ... in C sagt man
HWND Fenster[10];
aber das sind ja auch keine Objekte naja da muss man sich erstmal umgewöhnen und umdenken in Java
Gruss, code_pilot
-
Hmmm!
Wisst ihr was mir mal aufgefallen ist?Wenn ich mein Beispiel von oben kompiliere (javac hellowin.java)
also mein Programm:
import java.awt.*; import java.awt.event.*; class hellowin { static Frame myFrame1 = new Frame(); static Button myButtons[] = new Button[10]; public static void Initialize() { for(int i=0;i<10;i++) { myButtons[i] = new Button(); } } public static void showwin() { Initialize(); myButtons[0].setLabel("Hello"); myButtons[1].setLabel("Welt"); myButtons[0].addActionListener( new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent ButtonEvent) { System.exit(0); } }); myFrame1.add(myButtons[0]); myFrame1.add(myButtons[1]); myFrame1.setLayout(new FlowLayout()); myFrame1.setTitle("Hello World"); myFrame1.setSize(200, 100); myFrame1.setVisible(true); } public static void main(String args[]) { showwin(); } }
dann erzeugt der Compiler, warum auch immer, gleich zwei .class-Files, nämlich einmal hellowin.class und hellowin$1.class! Was soll das??? Lösche ich die hellowin$1.class, dann kommt eine Exception!!
Aber bei dem Programm
class hello { public static void main(String args[]) { System.out.println("Hallo!"); } }
wird, wie es sein muss, nur eine class-Datei, hello.class, erzeugt, und die Funktioniert auch.
Warum erzeugt der Compiler eine hellowin$1.class und wie kann ich das beheben??
Gruss, code_pilot
-
Übrigens ... die darfst du natürlich nicht löschen!
-
Wegen dem hier:
[java]myButtons[0].addActionListener(
new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent ButtonEvent)
{
System.exit(0);
}
});[/code] Hier erzeugst du nämlich eine anonyme innere Klasse. Wenn du diese .class dekompilierst kriegst du eine Klasse mit genau einer Methode (der actionPerformed) nämlich...
-
ahja ok danke ... kann man das mit dem actionperformed auch anders lösen? Ich hab das jetzt so aus einem Buch übernommen.
Gruss, code_pilot
-
Klar da gibts mehrere Möglichkeiten wobei mir die obige am besten gefällt.
a) Die Klasse in der die Events gefeuert werden zum ActionListener machen und dann die Methode actionPerformed implementieren.
b) Eine Eventhandler als separate Klasse implementieren und als Listener bei addListener übergeben.
c) Anonyme, innere Klassen so wie oben.