2013-08-06 13 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