2016-05-05 9 views
-1

Ich bekomme immer eine StackOverflowError und ich kann nicht herausfinden, warum. Dies ist die genaue FehlermeldungWas ist die Ursache dieses StackOverflowError?

java.lang.StackOverFlowError: null(in sun.awt.Win32GraphicsConfig) 

Hier ist mein Code:

import java.lang.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.Component.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 


public class Sales_Center { 

    JFrame mainf, loginf, newuserf; 
    JButton submit, login, newuser; 
    JPanel mainp, loginp, newuserp; 
    JLabel userlbl, passlbl; 
    JTextField usertxt, passtxt; 

    public static void main(String[] args) { 
     rungui(); 
    } 

    public Sales_Center() { 

      loginf = new JFrame("Login"); 
      loginf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      loginf.setSize(new Dimension(275, 150)); 
      loginp = new JPanel(); 
      loginp.setLayout(new GridLayout(0, 2, 10, 5)); 
      loginp.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
      loginp.setPreferredSize(new Dimension(250, 400)); 

      userlbl = new JLabel("Username: "); 
      loginp.add(userlbl); 

      usertxt = new JTextField(5); 
      loginp.add(usertxt); 

      passlbl = new JLabel("Password: "); 
      loginp.add(passlbl); 

      passtxt = new JTextField(5); 
      loginp.add(passtxt); 

      login = new JButton("Login"); 
      login.addActionListener(new loginb()); 
      loginp.add(login); 

      newuser = new JButton("Creat Profile"); 
      newuser.addActionListener(new newuserb()); 
      loginp.add(newuser); 

      //loginf.pack(); 
      loginf.setVisible(true); 
      loginf.setContentPane(loginp); 

    } 

    public static void rungui() { 

     JFrame.setDefaultLookAndFeelDecorated(false); 

     Sales_Center gui = new Sales_Center(); 

    } 
} 

    class loginb extends Sales_Center implements ActionListener { 

      String user, pass; 

    public void actionPerformed(ActionEvent ae) { 

       pass = passtxt.getText(); 
       user = usertxt.getText(); 
       Login login = new Login(pass, user); 


     } 
} 
     class newuserb extends Sales_Center implements ActionListener { 

      String user, pass; 

    public void actionPerformed(ActionEvent ae) { 

     pass = passtxt.getText(); 
     user = usertxt.getText(); 
     NewProfile newprofile = new NewProfile(user, pass); 

    } 
} 

Was ist die Ursache für den Fehler?

+2

Jedes 'Sales_Center' erstellt ein' loginb', das ein 'Sales_Center' ist, das dann ein anderes' loginb' erstellt, das ein anderes erstellt, ... –

+0

Warum erweitern sowohl loginb als auch newuserb Sales_Center? Das macht keinen Sinn. Hinweis: Sie sollten den Konventionen folgen und alle Klassen benennen, die mit einem Großbuchstaben beginnen und keine Unterstriche verwenden. – FredK

+1

Ihre Namenskonvention ist auch Banane. Bitte sei konsistent mit der Benennung. –

Antwort

2

So Mensch Sie Konstruktor Sales_Center Klasse haben, wo Sie führen folgende:

login.addActionListener(new loginb()); 

Ich sehe, dass LoginB von Sales_Center erstreckt. Es bedeutet, dass Konstruktor loginb Konstruktor der Superklasse aufruft. Da Sie keinen Konstruktor deklariert haben, wird Ihr Ergebniscode wie folgt aussehen:

class loginb extends Sales_Center { 
    public loginb() { 
     super(); 
    } 
} 

Was passiert also? Die Antwort ist einfach. Ihre Elternklasse erstellt eine Instanz seiner Kindklasse und Sie haben eine unendliche Rekursion. Sie versuchen, eine Instanz der Elternklasse zu erstellen, die seine Kindklasse erstellt, die seine Eltern erstellt. Es passiert immer wieder.