у нас есть база данных, и в этой базе данных есть одна таблица "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());
}
}
Проблема заключается в том, что вы объявили переменную экземпляра vString
но вы никогда ничего не присваиваете ей, поэтому она остается (автоматически) инициализирована null
. Внутри цикла while вы объявляете локальный varibale vString
и используется для хранения данных, полученных из базы данных. После того, как цикл заканчивается, локальная переменная vString
не больше. В main
методе вы печатаете результат метода database()
который является null
хранящимся в переменной экземпляра vString
. Ваша проблема известна как " Переменная затенение".
System.out.print(d.database())
на System.out.print(d.data)
public String vString
database()
return 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);
}