2013-08-06 12 views
0

所以你們說你沒有足夠的信息來幫助我。我很抱歉,這是我第一次在這樣的論壇上提出問題,而且我很久沒有用Java工作了。nullTextException在一個JTextfield文本中

所以這裏是我的整個代碼,可能會有很多的錯誤,但是我很高興如果你幫我解決它們並說我如何做更好的Java編程。

主類:

public class Main { 
    public static void main(String[] args) { 
    new Main().top(); 
    } 

    void top() { 

    GUI g = new GUI(); 


    } 
} 

類GUI:

import java.awt.event.ActionListener; 
import java.text.SimpleDateFormat; 
import javax.swing.*; 

public class GUI { 

JFrame frame; 
JPanel panel; 
static JLabel label; 
static JLabel username_bezeichnung; 
static JLabel vorname_bezeichnung; 
static JLabel nachname_bezeichnung; 
static JLabel geburtstag_bezeichnung; 
static JLabel email_bezeichnung; 
static JLabel passwort_bezeichnung; 
static JButton registrieren; 
static JButton login; 
static JButton registrierenBestätigen; 
static JTextField username; 
static JTextField vorname; 
static JTextField nachname; 
static JTextField email; 
static JFormattedTextField geburtstag; 
static JPasswordField passwort; 


void gui() { 

    ListenerHome h = new ListenerHome(); 
    ListenerRegistrieren r = new ListenerRegistrieren(); 

    /** 
    * Frames 
    */ 
    // Frame Main 
    frame = new JFrame("Main"); 
    frame.setSize(800, 600); 
    frame.setLocation(600, 200); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    /** 
    * Panels 
    */ 
    // Panel Main 
    panel = new JPanel(); 
    panel.setSize(780, 475); 
    panel.setLayout(null); 
    frame.add(panel); 

    /** 
    * Labels 
    */ 
    // Label Main 
    label = new JLabel(); 
    label.setSize(200, 300); 
    label.setLocation(230, 30); 
    label.setVisible(true); 
    label.setText("Guten Tag, was möchten Sie tun?"); 
    panel.add(label); 

    // Label Username 
    username_bezeichnung = new JLabel(); 
    username_bezeichnung.setBounds(65, 50, 120, 30); 
    username_bezeichnung.setVisible(false); 
    username_bezeichnung.setText("Username"); 
    panel.add(username_bezeichnung); 

    // Label Vorname 
    vorname_bezeichnung = new JLabel(); 
    vorname_bezeichnung.setBounds(65, 90, 120, 30); 
    vorname_bezeichnung.setVisible(false); 
    vorname_bezeichnung.setText("Vorname"); 
    panel.add(vorname_bezeichnung); 

    // Label Nachname 
    nachname_bezeichnung = new JLabel(); 
    nachname_bezeichnung.setBounds(65, 130, 120, 30); 
    nachname_bezeichnung.setVisible(false); 
    nachname_bezeichnung.setText("Nachname"); 
    panel.add(nachname_bezeichnung); 

    // Label Geburtstag 
    geburtstag_bezeichnung = new JLabel(); 
    geburtstag_bezeichnung.setBounds(390, 50, 120, 30); 
    geburtstag_bezeichnung.setVisible(false); 
    geburtstag_bezeichnung.setText("Geburtstag"); 
    panel.add(geburtstag_bezeichnung); 

    // Label E-Mail 
    email_bezeichnung = new JLabel(); 
    email_bezeichnung.setBounds(390, 90, 120, 30); 
    email_bezeichnung.setVisible(false); 
    email_bezeichnung.setText("E-Mail"); 
    panel.add(email_bezeichnung); 

    // Label Passwort 
    passwort_bezeichnung = new JLabel(); 
    passwort_bezeichnung.setBounds(390, 130, 120, 30); 
    passwort_bezeichnung.setVisible(false); 
    passwort_bezeichnung.setText("Passwort"); 
    panel.add(passwort_bezeichnung); 

    /** 
    * Buttons 
    */ 
    // Button registrieren 
    registrieren = new JButton("Registrieren"); 
    registrieren.setLocation(200, 320); 
    registrieren.setSize(120, 50); 
    registrieren.setVisible(true); 
    registrieren.addActionListener(h); 
    panel.add(registrieren); 

    // Button login 
    login = new JButton("Login"); 
    login.setLocation(350, 320); 
    login.setSize(120, 50); 
    login.setVisible(true); 
    login.addActionListener(h); 
    panel.add(login); 

    // Button registrieren bestätigen 
    registrierenBestätigen = new JButton("Registrieren"); 
    registrierenBestätigen.setLocation(390, 350); 
    registrierenBestätigen.setSize(120, 50); 
    registrierenBestätigen.setVisible(false); 
    registrierenBestätigen.addActionListener(r); 
    panel.add(registrierenBestätigen); 

    /** 
    * Textfields 
    */ 
    // Textfield Username 
    username = new JTextField("", 20); 
    username.setBounds(150, 50, 120, 30); 
    username.setVisible(false); 
    panel.add(username); 

    // Textfield Vorname 
    vorname = new JTextField("", 20); 
    vorname.setBounds(150, 90, 120, 30); 
    vorname.setVisible(false); 
    panel.add(vorname); 

    // Textfield Nachname 
    nachname = new JTextField("", 20); 
    nachname.setBounds(150, 130, 120, 30); 
    nachname.setVisible(false); 
    panel.add(nachname); 

    // Textfield Geburtstag 
    geburtstag = new JFormattedTextField(new SimpleDateFormat("dd.MM.yyyy")); 
    geburtstag.setValue(new java.util.Date()); 
    geburtstag.setBounds(475, 90, 120, 30); 
    geburtstag.setVisible(false); 
    panel.add(geburtstag); 

    // Textfield E-Mail 
    email = new JTextField("", 25); 
    email.setBounds(475, 50, 120, 30); 
    email.setVisible(false); 
    panel.add(email); 

    // Passwortfield Passwort 
    passwort = new JPasswordField("", 20); 
    passwort.setBounds(475, 130, 120, 30); 
    passwort.setVisible(false); 
    panel.add(passwort); 

} 
} 

類ListenerHome

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class ListenerHome implements ActionListener { 



@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == GUI.registrieren) { 
     GUI.label.setVisible(false); 
     GUI.username_bezeichnung.setVisible(true); 
     GUI.vorname_bezeichnung.setVisible(true); 
     GUI.nachname_bezeichnung.setVisible(true); 
     GUI.geburtstag_bezeichnung.setVisible(true); 
     GUI.email_bezeichnung.setVisible(true); 
     GUI.passwort_bezeichnung.setVisible(true); 
     GUI.registrieren.setVisible(false); 
     GUI.login.setVisible(false); 
     GUI.registrierenBestätigen.setVisible(true); 
     GUI.username.setVisible(true); 
     GUI.vorname.setVisible(true); 
     GUI.nachname.setVisible(true); 
     GUI.email.setVisible(true); 
     GUI.geburtstag.setVisible(true); 
     GUI.passwort.setVisible(true); 


    } 
} 
} 

類ListenerRegistrieren

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 

public class ListenerRegistrieren implements ActionListener { 


    public void actionPerformed(ActionEvent e) {   
     if(e.getSource() == GUI.registrierenBestätigen) { 
       addBenutzer(); 
     } 
    } 



private static void addBenutzer() { 

    try { 

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection conn = DriverManager.getConnection("jdbc:odbc:MSAccess"); 
    PreparedStatement pstm; 
    String sql = "Insert Into Benutzer ('Benutername', 'Vorname', 'Nachname', 'E-Mail') values ('?','?','?','?')"; 
    pstm = conn.prepareStatement(sql); 

    // SQL Statements 
    pstm.setString(1, GUI.username.getText()); 
    pstm.setString(2, GUI.vorname.getText()); 
    pstm.setString(3, GUI.nachname.getText()); 
    pstm.setString(4, GUI.email.getText()); 
    pstm.executeUpdate(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

堆棧跟蹤

java.lang.NullPointerException 
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString(Unknown Source) 
at verwaltung.ListenerRegistrieren.addBenutzer(ListenerRegistrieren.java:37) 
at verwaltung.ListenerRegistrieren.actionPerformed(ListenerRegistrieren.java:20) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$200(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

我希望你能幫助我更好了。謝謝你們的幫助!

+2

1)與NPE無關,請爲什麼username.setVisible(false); 2,爲了更快地發佈SSCCE更好的幫助? short,runnable,compilable, – mKorbel

+0

你確定'pstm = conn.prepareStatement(sql);'返回一個有效的'PreparedStatement'嗎? – Laf

+0

這可能是另一個問題。但首先我必須知道爲什麼它是一個空指針 – JUNGE

回答

2

我想它不是JTextfield引發NullPointer,但GUI。這可能沒有提及頂部的object

就像我從你的代碼中看到的,你沒有GUI類的構造函數。您需要更改

void gui() { 

public GUI() { 

改變這一點,並移除的DatabaseConnection後,我可以存取權限的GUI領域,以靜態變量的方式是醜陋的,但工程:

private static void addBenutzer() { 

    try { 

     System.out.println(GUI.username.getText()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

如果現在仍然發生異常,數據庫連接出現問題,我無法進一步測試,因爲我沒有數據庫和驅動器。但對我來說,數據庫連接看起來沒問題。

這裏是所有類應該如何來實現:

import java.text.SimpleDateFormat; 

import javax.swing.JButton; 
import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 

public class GUI { 

    JFrame frame; 
    JPanel panel; 
    JLabel label; 
    JLabel username_bezeichnung; 
    JLabel vorname_bezeichnung; 
    JLabel nachname_bezeichnung; 
    JLabel geburtstag_bezeichnung; 
    JLabel email_bezeichnung; 
    JLabel passwort_bezeichnung; 
    JButton registrieren; 
    JButton login; 
    JButton registrierenBestätigen; 
    JTextField username; 
    JTextField vorname; 
    JTextField nachname; 
    JTextField email; 
    JFormattedTextField geburtstag; 
    JPasswordField passwort; 

    public GUI() { 

     ListenerHome h = new ListenerHome(this); 
     ListenerRegistrieren r = new ListenerRegistrieren(this); 

     /** 
     * Frames 
     */ 
     // Frame Main 
     frame = new JFrame("Main"); 
     frame.setSize(800, 600); 
     frame.setLocation(600, 200); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     /** 
     * Panels 
     */ 
     // Panel Main 
     panel = new JPanel(); 
     panel.setSize(780, 475); 
     panel.setLayout(null); 
     frame.add(panel); 

     /** 
     * Labels 
     */ 
     // Label Main 
     label = new JLabel(); 
     label.setSize(200, 300); 
     label.setLocation(230, 30); 
     label.setVisible(true); 
     label.setText("Guten Tag, was m�chten Sie tun?"); 
     panel.add(label); 

     // Label Username 
     username_bezeichnung = new JLabel(); 
     username_bezeichnung.setBounds(65, 50, 120, 30); 
     username_bezeichnung.setVisible(false); 
     username_bezeichnung.setText("Username"); 
     panel.add(username_bezeichnung); 

     // Label Vorname 
     vorname_bezeichnung = new JLabel(); 
     vorname_bezeichnung.setBounds(65, 90, 120, 30); 
     vorname_bezeichnung.setVisible(false); 
     vorname_bezeichnung.setText("Vorname"); 
     panel.add(vorname_bezeichnung); 

     // Label Nachname 
     nachname_bezeichnung = new JLabel(); 
     nachname_bezeichnung.setBounds(65, 130, 120, 30); 
     nachname_bezeichnung.setVisible(false); 
     nachname_bezeichnung.setText("Nachname"); 
     panel.add(nachname_bezeichnung); 

     // Label Geburtstag 
     geburtstag_bezeichnung = new JLabel(); 
     geburtstag_bezeichnung.setBounds(390, 50, 120, 30); 
     geburtstag_bezeichnung.setVisible(false); 
     geburtstag_bezeichnung.setText("Geburtstag"); 
     panel.add(geburtstag_bezeichnung); 

     // Label E-Mail 
     email_bezeichnung = new JLabel(); 
     email_bezeichnung.setBounds(390, 90, 120, 30); 
     email_bezeichnung.setVisible(false); 
     email_bezeichnung.setText("E-Mail"); 
     panel.add(email_bezeichnung); 

     // Label Passwort 
     passwort_bezeichnung = new JLabel(); 
     passwort_bezeichnung.setBounds(390, 130, 120, 30); 
     passwort_bezeichnung.setVisible(false); 
     passwort_bezeichnung.setText("Passwort"); 
     panel.add(passwort_bezeichnung); 

     /** 
     * Buttons 
     */ 
     // Button registrieren 
     registrieren = new JButton("Registrieren"); 
     registrieren.setLocation(200, 320); 
     registrieren.setSize(120, 50); 
     registrieren.setVisible(true); 
     registrieren.addActionListener(h); 
     panel.add(registrieren); 

     // Button login 
     login = new JButton("Login"); 
     login.setLocation(350, 320); 
     login.setSize(120, 50); 
     login.setVisible(true); 
     login.addActionListener(h); 
     panel.add(login); 

     // Button registrieren best�tigen 
     registrierenBestätigen = new JButton("Registrieren"); 
     registrierenBestätigen.setLocation(390, 350); 
     registrierenBestätigen.setSize(120, 50); 
     registrierenBestätigen.setVisible(false); 
     registrierenBestätigen.addActionListener(r); 
     panel.add(registrierenBestätigen); 

     /** 
     * Textfields 
     */ 
     // Textfield Username 
     username = new JTextField("", 20); 
     username.setBounds(150, 50, 120, 30); 
     username.setVisible(false); 
     panel.add(username); 

     // Textfield Vorname 
     vorname = new JTextField("", 20); 
     vorname.setBounds(150, 90, 120, 30); 
     vorname.setVisible(false); 
     panel.add(vorname); 

     // Textfield Nachname 
     nachname = new JTextField("", 20); 
     nachname.setBounds(150, 130, 120, 30); 
     nachname.setVisible(false); 
     panel.add(nachname); 

     // Textfield Geburtstag 
     geburtstag = new JFormattedTextField(new SimpleDateFormat("dd.MM.yyyy")); 
     geburtstag.setValue(new java.util.Date()); 
     geburtstag.setBounds(475, 90, 120, 30); 
     geburtstag.setVisible(false); 
     panel.add(geburtstag); 

     // Textfield E-Mail 
     email = new JTextField("", 25); 
     email.setBounds(475, 50, 120, 30); 
     email.setVisible(false); 
     panel.add(email); 

     // Passwortfield Passwort 
     passwort = new JPasswordField("", 20); 
     passwort.setBounds(475, 130, 120, 30); 
     passwort.setVisible(false); 
     panel.add(passwort); 

    } 
} 

-

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class ListenerHome implements ActionListener { 

    private GUI gui; 

    public ListenerHome(GUI gui) { 
     this.gui = gui; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == gui.registrieren) { 
      gui.label.setVisible(false); 
      gui.username_bezeichnung.setVisible(true); 
      gui.vorname_bezeichnung.setVisible(true); 
      gui.nachname_bezeichnung.setVisible(true); 
      gui.geburtstag_bezeichnung.setVisible(true); 
      gui.email_bezeichnung.setVisible(true); 
      gui.passwort_bezeichnung.setVisible(true); 
      gui.registrieren.setVisible(false); 
      gui.login.setVisible(false); 
      gui.registrierenBestätigen.setVisible(true); 
      gui.username.setVisible(true); 
      gui.vorname.setVisible(true); 
      gui.nachname.setVisible(true); 
      gui.email.setVisible(true); 
      gui.geburtstag.setVisible(true); 
      gui.passwort.setVisible(true); 

     } 
    } 
} 

-

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 

public class ListenerRegistrieren implements ActionListener { 

    private GUI gui; 

    public ListenerRegistrieren(GUI gui) { 
     this.gui = gui; 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == gui.registrierenBestätigen) { 
      addBenutzer(); 
     } 
    } 

    private void addBenutzer() { 

     try { 

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      Connection conn = DriverManager.getConnection("jdbc:odbc:MSAccess"); 
      PreparedStatement pstm; 
      String sql = "Insert Into Benutzer ('Benutername', 'Vorname', 'Nachname', 'E-Mail') values ('?','?','?','?')"; 
      pstm = conn.prepareStatement(sql); 

      // SQL Statements 
      pstm.setString(1, gui.username.getText()); 
      pstm.setString(2, gui.vorname.getText()); 
      pstm.setString(3, gui.nachname.getText()); 
      pstm.setString(4, gui.email.getText()); 
      pstm.executeUpdate(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

-

public class Main { 
    public static void main(String[] args) { 
     new GUI(); 

    } 

} 
+0

不,它有一個引用我的主要類 – JUNGE

+0

我不是指類引用,而是對創建對象的引用 –

+0

你能解釋一下嗎?我很抱歉,我是一個初學者,使用java GUI – JUNGE

0

空指針異常意味着您試圖對當前設置爲null的變量進行操作,而不是指向對象的實例。此異常的最常見的形式是形式

Object myObject = ...; 
// for whatever reason, myObject = null 
myObject.someMethod(); 

在第三行中,當myObjectsomeMethod()方法被調用的,則運行時必須首先找到由變量myObject引用的對象。如果myObject未引用有效實例,則運行時將無法找到並執行someMethod()。這是一個錯誤條件,其中定義的分辨率是拋出NullPointerException

在你的代碼中,很難判斷是什麼導致NullPointerException被拋出。您可以通過打印或以其他方式顯示異常的堆棧跟蹤來讓自己變得非常簡單。堆棧跟蹤將指向發生空指針取消引用的特定文件和一行代碼。

查看整個堆棧跟蹤很重要。您可能會發現空指針取消引用發生在您調用的方法中,而不是您自己的代碼中。這意味着你可能傳遞了一個空對象。或者你傳遞了一個對象,其中一個方法或可訪問的插槽包含一個空值,並且調用的方法依賴於該值。通過堆棧跟蹤讀取,您將能夠發現被調用的代碼的最後一行。然後,您可以決定是否調查您傳遞的變量(例如,在調試器中檢查它們的值,或者將它們的值打印到System.out中),或者如果您想嘗試查找要調用的代碼的來源,並且如果可手動回溯以確定發生錯誤的位置。

你也可以發現,在拋出異常的線是模糊的 - 只是讀它,有可能是例外幾個可能的原因,如下面的代碼...

myObject.method1().method2().method3(); 

.. 。以下任一情況可能導致異常: * myObject可能爲空 * myObject.method1()的返回值可能爲null * myObject.method1()。method2()的返回值可能爲null

在這種情況下,有兩種簡單的調查方法。首先,您可以在調試器中運行代碼,並使用調試器來確定哪些變量無法取消引用。其次,你可以調整你的代碼,使調試更容易...

result1 = myObject.method1(); 
result2 = myObject.method2(); 
myObject.method3(); 

正確的方法取決於你的團隊,你的編碼標準,代碼的可讀性正在重組,這是其他因素的主機超出了這個答案的範圍。

+0

好吧,我知道你的意思。但你能看看我編輯的問題,看看你能幫我解決這個明確的問題嗎? 非常感謝你 – JUNGE

0

如果這就是它的發生,這是最有可能不選擇JTextField:

GUI.username.getText() 

你沒有給我們太多去這裏,但是基於上面的代碼,我猜你有一個名爲username公共屬性命名GUI變量,你忘了做這樣的事情有:

GUI.username = username;

如果GUI.username未設置爲一個JTextField,一個ny方法調用它會拋出NullPointerException

此外,您不需要在準備好的聲明中加入?左右的引號。實際上,如果你不這樣做,因爲prepareStatement應該由供應商特定的驅動程序處理。這是罰款:

Insert Into Benutzer ('Benutername', 'Vorname', 'Nachname', 'E-Mail') values (?, ?, ?, ?)

這將推動得到它的權利到的MS Access JDBC驅動程序全部責任。

+0

我已經編輯它,現在請再看看它謝謝 – JUNGE