我们有一个数据库,在这个数据库中有一个表“content”和3列“id”,“movie_name”,“movie_category”。
我们希望将此值加载到Vector并显示它,但是存在一个问题,即我们只获得“null”值。
我们如何解决这个问题?
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.*;
import java.awt.*;
import javax.swing.*;
public class Data extends JPanel{
Connection connection = null;
ResultSet resultSet = null;
Statement statement = null;
static Vector<Vector<String>> data = new Vector<Vector<String>>();
public String vString;
public String database(){
try
{
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:src//movies.db");
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT id, movie_name, movie_category FROM content");
Vector<String> columnNames = new Vector<String>();
columnNames.add("id");
columnNames.add("movie_name");
columnNames.add("movie_category");
while (resultSet.next())
{
Vector<String> vString = new Vector<String>();
vString.addElement(resultSet.getString("id"));
vString.addElement(resultSet.getString("movie_name"));
vString.addElement(resultSet.getString("movie_category"));
data.add(vString);
}
} //try
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
resultSet.close();
statement.close();
connection.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
return vString;
}
public static void main(String[] args) {
Data d = new Data();
System.out.print(d.database());
}
}
答案 0 :(得分:2)
问题是你声明了实例变量vString
但是你永远不会给它分配任何东西,所以它保持(自动)用null
初始化。在while循环中,您声明了一个本地变量vString
,它用于存储从数据库中检索的数据。 while循环结束后,本地变量vString
不再是。在main
方法中,您打印的database()
方法的结果是null
存储在实例变量vString
中的结果。
您的问题称为Variable shadowing。
System.out.print(d.database())
更改为System.out.print(d.data)
public String vString
database()
方法返回void
修复代码:
public class Data extends JPanel{
Connection connection = null;
ResultSet resultSet = null;
Statement statement = null;
static Vector<Vector<String>> data = new Vector<Vector<String>>();
public void database(){
try
{
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:src//movies.db");
statement = connection.createStatement();
resultSet = statement.executeQuery("SELECT id, movie_name, movie_category FROM content");
Vector<String> columnNames = new Vector<String>();
columnNames.add("id");
columnNames.add("movie_name");
columnNames.add("movie_category");
while (resultSet.next())
{
Vector<String> vString = new Vector<String>();
vString.addElement(resultSet.getString("id"));
vString.addElement(resultSet.getString("movie_name"));
vString.addElement(resultSet.getString("movie_category"));
data.add(vString);
}
} //try
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
resultSet.close();
statement.close();
connection.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Data d = new Data();
d.database();
System.out.print(d.data);
}