2016-05-30 15 views
-1

Ich habe versucht, eine einfache Java App Spreadsheet zu machen. Dafür benutze ich JTable im Schwung. Mein Code ist wie folgt:Warum bekomme ich den Fehler "Exception In Initializer"?

import javax.swing.*; 
import java.awt.*; 

public class Main { 

    private JFrame Frame; 
    public Font f = new Font("Candara", Font.PLAIN, 14); 
    public JFileChooser choicer = new JFileChooser(); 
    public String dir; 
    private JTable Table; 
    public String[] columns; 
    public String[][] data = new String[10][2]; 
    public static Main m = new Main(); 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        m.Frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public Main() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     Frame = new JFrame(); 
     Frame.setTitle("Spreadsheet"); 
     Frame.setBounds(100, 100, 1000, 800); 
     Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JMenuBar menuBar = new JMenuBar(); 
     Frame.setJMenuBar(menuBar); 

     JMenu File_Menu = new JMenu("File"); 
     File_Menu.setFont(f); 
     menuBar.add(File_Menu); 

     JMenuItem New_Doc = new JMenuItem("New Document"); 
     New_Doc.setFont(f); 
     New_Doc.addActionListener(e -> { 
      choicer.setCurrentDirectory(new java.io.File(".")); 
      choicer.setDialogTitle("New Document"); 
      choicer.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
      choicer.setAcceptAllFileFilterUsed(false); 

      if (choicer.showOpenDialog(new JPanel()) == JFileChooser.APPROVE_OPTION) { 
       dir = String.valueOf(choicer.getCurrentDirectory()); 
      } 
     }); 
     File_Menu.add(New_Doc); 

     JMenuItem Save_Doc = new JMenuItem("Save Document"); 
     Save_Doc.setFont(f); 
     File_Menu.add(Save_Doc); 

     JMenuItem Open_Doc = new JMenuItem("Open Document"); 
     Open_Doc.setFont(f); 
     File_Menu.add(Open_Doc); 
     Frame.getContentPane().setLayout(null); 

     m.newTable(); 
     Table = new JTable(data, columns); 
     Table.setBounds(10, 11, 964, 718); 
     Table.setFillsViewportHeight(false); 
     Frame.getContentPane().add(Table); 
     Table.setDragEnabled(false); 

    } 

    public void newTable() { 
     int i = 1; 
     columns = new String[10]; 
     while (i <= 10) { 
      columns[i - 1] = String.valueOf(i); 
     } 

     i = 0; 
     int j = 0; 
     while (i < 10) { 
      while (j < 2) { 
       data[i][j] = String.valueOf(i + j); 
      } 
     } 

    } 

} 

Wenn ich diesen Code ausführen, bekomme ich die folgende Meldung:

Exception in thread "main" java.lang.ExceptionInInitializerError Verursacht durch: java.lang. Nullpointer
bei Main.initialize (Main.java:76) (diese Zeile: m.newTable();)..
am Main (Main.java:34)
am Main (Main.java:13)

Warum passiert das?

Gibt es außerdem etwas falsch in der Art und Weise, in der ich die Grenzen für die Tabelle festlegen?

+0

warum Sie die Klasse in einem Singleton-Wege-Implementierung und danach es als normal-Klasse? – Paul

+0

@Paul was genau meinst du damit? –

+0

ich und j nicht inkrementieren –

Antwort

2

Sie initialize Konstruktor innerhalb von Main nennen, wenn m noch nicht belegt:

public Main() { 
    initialize(); 
} 

Sie sollten in der Lage sein zu beheben mit statischen Initialisierungsbaustein:

public static Main m; 
static{ 
    m = new Main(); 
    m.initialize(); 
} 

aber entfernen initialize(); von Main Klassenkonstruktor. Ein weiterer aproach wäre zu bewegen:

m = new Main(); 
    m.initialize(); 

kurz vor:

m.Frame.setVisible(true); 
+0

Danke, aber jetzt bekomme ich eine weitere Ausnahme wie oben gezeigt –

+0

Sie müssen noch 'm.initialize();' aufrufen – marcinj

Verwandte Themen