0

所以你们说你们没有足够的信息来帮助我。很抱歉,这是我第一次在这样的论坛上提问,并且我没有很长时间使用 Java。

所以这是我的全部代码,可能会有很多错误,但如果你能帮助我解决它们并告诉我如何更好地进行 Java 编程,我很高兴。

主类:

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

  void top() {

    GUI g = new 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)

我希望你现在能更好地帮助我。谢谢你们的帮助!

4

3 回答 3

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();

    }

}
于 2013-08-06T16:08:03.820 回答
0

空指针异常意味着您试图对当前设置为null指向对象实例的变量进行操作。这种异常最常见的形式是

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

第三行,在调用 的someMethod()方法时,运行时首先要定位到变量myObject引用的对象。myObject如果myObject未引用有效实例,则运行时将无法定位和执行someMethod(). 这是一个错误条件,其中定义的解决方案是抛出一个NullPointerException.

在您的代码中,很难说出导致NullPointerException抛出的原因。您可以通过打印或以其他方式显示异常的堆栈跟踪来使这非常容易。堆栈跟踪将指向发生空指针取消引用的特定文件和代码行。

查看整个堆栈跟踪很重要。您可能会发现空指针取消引用发生在您调用的方法中,而不是您自己的代码中。这意味着您可能传递了一个空对象。或者您传递了一个对象,其方法或可访问插槽中的一个包含空值,而被调用的方法取决于该值。阅读堆栈跟踪,您将能够发现被调用的代码的最后一行。然后,您可以决定是否调查您传递的变量(例如在调试器中检查它们的值或将它们的值打印到 System.out),或者您是否想尝试查找您正在调用的代码的源代码,以及是否可手动回溯以确定错误发生的位置。

你也可能会发现抛出异常的那一行是模棱两可的——光看它,异常可能有几个潜在的原因,如下面的代码...

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

... 其中任何一项都可能导致异常: * myObject 可能为 null * myObject.method1() 的返回值可能为 null * myObject.method1().method2() 的返回值可能为 null

在这种情况下,有两种简单的调查方法。首先,您可以在调试器中运行代码并使用调试器来确定哪些变量无法取消引用。其次,您可以重组您的代码,以便调试更容易......

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

正确的方法取决于您的团队、您的编码标准、正在重构的代码的可读性,以及超出此答案范围的许多其他考虑因素。

于 2013-08-06T16:26:41.997 回答
0

如果这是它发生的地方,它很可能不是 JTextfield:

GUI.username.getText()

您在这里没有给我们太多内容,但是根据您上面的代码,我猜您有一个名为的变量,该变量名为GUI一个名为的公共属性username,您忘记了使用以下方法执行以下操作:

GUI.username = username;

如果GUI.username未设置为 JTextfield,则对其进行的任何方法调用都会抛出NullPointerException.

此外,您不需要?在准备好的声明中加上引号。事实上,如果你不这样做会更好,因为prepareStatement它应该由特定于供应商的驱动程序处理。这可以:

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

这将把所有责任推到 MS Access JDBC 驱动程序上。

于 2013-08-06T16:30:41.037 回答