【问题标题】:Getting NullPointerException, JDBC/Swing. Why? [duplicate]获取 NullPointerException,JDBC/Swing。为什么? [复制]
【发布时间】:2015-03-19 15:15:02
【问题描述】:

我目前正在使用 JDBC 和 Swing 创建 GUI 并从本地数据库中获取值。我正在从数据库中获取数据并希望将其放入 JComboBox 但从一类到另一类。我已经检查过,数据来自数据库正确,所以这不是问题。当我运行程序时,我得到 NullPointerException,我不知道为什么。这是模型类中产生问题的代码:

this.ba = IO.getBetalningsansvarig();

DB-通信类:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class dbIO {

//Code for fetching data from the database and putting it into an ArrayList.
    public ArrayList<String> getBetalningsansvarig() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        ArrayList<String> asd = new ArrayList<String>();
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
        String connectionUrl = "jdbc:sqlserver://localhost;" + "database=INL5";
        Connection conn = DriverManager.getConnection(connectionUrl, "testadmin", "test");
        System.out.println("ANSLUTNINGEN LYCKADES");
        Statement stmt = conn.createStatement();
        String namn;
        ResultSet rs = stmt.executeQuery(
                "SELECT Namn "
                + "FROM Betalningsansvarig ");

        while (rs.next()) {
            namn = rs.getString("Namn");
            asd.add(namn);
        }
        for (String s : asd) {
            System.out.println(s);
        }
        stmt.close();
        conn.close();

        return (asd);
    }

}

模型类:

import java.sql.SQLException;
import java.util.ArrayList;

public class Model {
    private dbIO IO = new dbIO();
    private ArrayList<String> ba = new ArrayList<String>();

    public void setBa(ArrayList<String> ba) {
        this.ba = ba;
    }
    public ArrayList<String> getBa() {
        return ba;
    }

    public Model() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        this.ba = IO.getBetalningsansvarig();

    }
}

主类:

import java.sql.SQLException;


public class Main {
    public static void main(String[] args) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        dbIO d = new dbIO();
        //d.start();
        Model m = new Model();
        View1 v = new View1();
        v.setModel(m);
        v.open();

    }

}

查看类:

import java.sql.SQLException;
import java.util.ArrayList;

public class View1 extends javax.swing.JFrame {
    private Model m;
    private ArrayList<String> betalningsansvariga = new ArrayList<String>();
    private jComboBox1;

    public View1() {
        initComponents();
        betalningsansvariga = m.getBa();
        for(String s : betalningsansvariga) {
        JComboBox1.addItem(s);
     }
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        list1 = new java.awt.List();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(35, 35, 35)
                .addComponent(list1, javax.swing.GroupLayout.PREFERRED_SIZE, 219, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(526, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(44, 44, 44)
                .addComponent(list1, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(272, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    public void setModel(Model m) { this.m = m; }
    public void open() {       
        setVisible(true);
    }

}

错误信息:

Exception in thread "main" java.lang.NullPointerException
    at Model.<init>(Model.java:17)
    at Main.main(Main.java:9)
Java Result: 1

【问题讨论】:

  • 提供 Nullpointer 的堆栈跟踪可能是个好主意,并可能通过注释在代码中标记该堆栈跟踪中引用的行所在的位置。
  • 可能有很多问题,问题来自 getBetalningsansvarig(),但如果没有堆栈跟踪,我们无法确切知道在哪里。请提供完整的错误信息。

标签: java swing jdbc


【解决方案1】:

您在 main 中实例化您的 dbIO 对象,而不是在 Model 中。

【讨论】:

  • 我已经做到了。私有 dbIO IO = 新 dbIO();
【解决方案2】:

你还没有在Model类中初始化你的成员:

private dbIO IO; // effectively null

也许您想使用修饰符 static final 更好地将其定义为全局静态常量。如果它在 Model 类的命名空间中,那么您可以通过表达式 Model.IO 来引用它(在您的主方法中初始化它之后)。

请尽量遵循 Java 中的标准命名方案。编写类名以大写字母开头,以提高可读性。

【讨论】:

  • 我把它改成了 private dbIO IO = new dbIO();但没有帮助。
  • @user3428812 “没有帮助”是什么意思?您仍然观察到相同的异常还是新的不同异常?
  • 完全相同的异常。没有变化。
  • @user3428812 根据您在此处提供的信息,到目前为止,您的问题是不可重现的。在我看来,您可以从有关基本 Java 的教程课程中受益匪浅。上面给出的“重复”链接也可能对您有所帮助。祝你好运!
【解决方案3】:

在模型类中:

Model() 构造函数正在调用 dbIO 对象的方法。 dbIO 对象为空。

所以你遇到了 NullPointerException。


除了上述观察之外,还有几个地方会遇到 NullPointerException:

在 View1() 构造函数中,您再次在 null 对象上调用方法 [Model, JComboBox 为 null]。

相应地更正您的代码。

【讨论】:

  • 我需要以什么方式更正我的代码?我不明白你在暗示什么。
  • @user3428812 您在不同的地方遇到 NullPointerException ......请参阅更新的回复。
猜你喜欢
  • 2015-01-05
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多