【问题标题】:Getting NullPointerException in Java SQLite在 Java SQLite 中获取 NullPointerException
【发布时间】:2014-12-23 13:02:31
【问题描述】:

我编写此方法以从 java 中的 SQLite 表中获取结果。

    public String[][] select(String query, String table) throws ClassNotFoundException, SQLException
{
    Connection con;
    Statement st;
    Class.forName("org.sqlite.JDBC");
    con = DriverManager.getConnection("jdbc:sqlite:"+table);
    con.setAutoCommit(false);
    st = con.createStatement();
    ResultSet rs = st.executeQuery(query);
    String[][] result = new String[100][4];
    int j = 0;
    while ( rs.next() ) {
        String  name = rs.getString("fullname");
        String  username = rs.getString("username");
        String  password = rs.getString("password");
        String  email = rs.getString("email");
        result[j][0] = name; // line number 63
        result[j][1] = username;
        result[j][2] = password;
        result[j][3] = email;
        j++;
    }
    rs.close();
    st.close();
    con.close();
    return result;
}

从我的主要方法中我实例化了这个方法:

    try{
        String[][] data = db.select("SELECT * FROM user", "fliplist.db"); // line number 37
        System.out.println(data);
    } catch (ClassNotFoundException | SQLException e){
        System.out.println(e.getMessage());
    }

这给了我这个错误:

run:
Exception in thread "main" java.lang.NullPointerException
at FlipList.Database.select(Database.java:63)
at FlipList.FlipList.main(FlipList.java:37)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

应该如何获取结果?

更新

我已经初始化了数组的第二维,现在它显示了这个错误(很可能是 garbez 值):

run:
[[Ljava.lang.String;@2077d4de
BUILD SUCCESSFUL (total time: 2 seconds)

我怎样才能返回一个数组?

【问题讨论】:

  • 帮我们一个忙,并在导致错误的行上添加注释,这样我们就可以看到它在哪里,而不必猜测您没有显示多少代码。
  • 谢谢,我在评论区插入了行号
  • 您没有初始化数组的第二维,这就是它为空的原因。应该是new String[100][4]。此外,在 while 循环之外增加行计数器 j
  • 我不确定它是否会修复它,但我认为您必须在执行语句后添加con.commit
  • @lea 可能想把它放到答案中。

标签: java sqlite


【解决方案1】:

(感谢@lea,如果他们发布了请告诉我)

您还需要初始化内部数组。在您的 while 循环中,将这样的内容放在顶部,它应该可以工作。

data[j] = new String[4];

对于您的新错误,您希望遍历数组而不是仅仅打印它。例如:

for (int i = 0; i < data.length; i++) {
    for (int j = 0; j < data[0].length; j++) {
        System.out.print(data[i][j] + "\t\t");
    }
    System.out.println();
}

我还想给您一些其他提示:

  1. j++ 移动到 while 循环中,就在右括号之前。这样,它会随着每个循环而不是在每个循环之后增加一次。 已修复!

  2. 如果您并不总是正好有一百个项目,您可能想要使用ArrayList&lt;String[]&gt; 而不是String[][]。那样的话,如果你需要,你可以超过 100 个,如果你使用的少,它会节省内存。为此,您需要为您的 while 循环执行类似的操作:

    while ( rs.next() ) {
        String[] nextRow = new String[4];
        String  name = rs.getString("fullname");
        String  username = rs.getString("username");
        String  password = rs.getString("password");
        String  email = rs.getString("email");
        nextRow[0] = name; // line number 63
        nextRow[1] = username;
        nextRow[2] = password;
        nextRow[3] = email;
        result.add(nextRow);
    }
    

您还需要将 data 的声明更改为 ArrayList&lt;String[]&gt; result = new ArrayList&lt;String[]&gt;() 而不是 String[][] result = ...

【讨论】:

  • ArrayList 对象没有 put 方法
  • @rakibtg 我的错——我打错了。那应该加。我一直在使用 add 和 out 的一些东西,但我忘记了有区别。
  • @rakibtg 确保您遵循我给出的所有说明。你会注意到你的“数据”是一个字符串[][]。我的不是。
  • 好的,我仍然遇到空指针异常错误:/ 这里我粘贴代码:paste.ubuntu.com/9608515
  • 您将数据定义为空。然后你调用它的方法。您需要先初始化数据,然后才能使用它。
【解决方案2】:

我将 ArrayList 重新定义为字符串列表而不是数组。

public void tester()
    {
        ArrayList result = new ArrayList();


    try
    {
    Connection connect = DriverManager.getConnection(host, username, password);

    String sql="select * from FRIENDS";

    Statement stmt=connect.createStatement();

    ResultSet rs=stmt.executeQuery(sql);



    String[] nextRow = new String[4];
    while ( rs.next() ) {


            String  firstname = rs.getString("FIRSTNAME");
            String  lastusername = rs.getString("LASTNAME");
            String  nickname = rs.getString("NICKNAME");
            String  friendsince = rs.getString("FRIENDSINCE");
            String  email = rs.getString("EMAIL");

            System.out.print("Firstname :- "+firstname+" lastname :- "+lastusername+" nickname :-  "+nickname+" friendsince :- "+friendsince+" Email :- "+email);

            nextRow[0] = firstname; 
            nextRow[1] = lastusername;
            nextRow[2] = nickname;
            nextRow[3] = email;

            System.out.println("The values in array are :- "+nextRow);




            int i=0;
            for(i=0;i<nextRow.length;i++)
            {
                String add1=nextRow[i];

                result.add(add1);
            }



           }

    }

希望,这会有所帮助。

【讨论】:

  • 你绝对应该在这里使用泛型——而不是ArrayList,应该是ArrayList&lt;String&gt;
  • 我首先只使用了那个(复制你们正在讨论的内容),但那是给垃圾值。在同一问题的答案之一中,我发现了以下建议:-“Ljava.lang.String;@ 在您使用字符串数组作为字符串的地方返回。”因此我尝试使用 ArrayList,它似乎工作
  • 这与我所说的无关。我是说您应该将 ArrayList 定义为 ArrayList&lt;String&gt;,因为它是更好的编码实践。
  • 您能否详细说明使用 ArrayList 而不是 ArrayList 的优点?
  • This.。简而言之,它有助于将运行时错误转化为更快速修复的编译错误,并使您的代码更整洁。
【解决方案3】:
  1. 一些非常基本的东西。请在数据库上执行查询,看看它返回什么(有时查询可能不正确,例如表名可以是“用户”而不是“用户”,只是猜测):-

从用户中选择 *

  1. 如果上面没问题,那么您能否尝试使用“columnIndex”而不是“columnName”来提取行。例如

    String  name = rs.getString(1);
    String  username = rs.getString(2);
    String  password = rs.getString(3);
    String  email = rs.getString(4);
    

这里我假设名称、用户名、密码和电子邮件分别属于第 1、第 2、第 3 和第 4 列。

【讨论】:

  • 没关系,如果我在系统上打印这个String password = rs.getString("password"); 它可以工作,但返回一个空异常错误
  • 希望以上链接对您有所帮助。
  • 最后通过以下更改使其工作:-
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多