AWT-EventQueue-0 NullPointerException
Я довольно новичок в Java и пытаюсь заполнить свой JList данными из базы данных. Данные извлекаются из базы данных с помощью метода visKunder() в классе Database.
public ArrayList<Kunde> visKunder(){
String s1 = "select kundenavn, adresse, telefon from kunde";
Statement setning = null;
String kundenavn = null;
String adresse = null;
int telefon = 0;
ResultSet res = null;
ArrayList<Kunde> kunder = new ArrayList<>();
try{
forbindelse.setAutoCommit(false);
setning = forbindelse.createStatement();
res = setning.executeQuery(s1);
while(res.next()){
kundenavn = res.getString("kundenavn");
adresse = res.getString("adresse");
telefon = res.getInt("telefon");
Kunde kunde = new Kunde(kundenavn, telefon, adresse);
kunder.add(kunde);
}
forbindelse.commit();
}catch(SQLException error){
Opprydder.rullTilbake(forbindelse);
Opprydder.skrivMelding(error, "visKunder()");
}finally{
Opprydder.lukkSetning(setning);
Opprydder.lukkResSet(res);
try {
forbindelse.setAutoCommit(true);
} catch (SQLException ex) {
Opprydder.skrivMelding(ex, "setAutoCommit()");
}
}
return kunder;
}
Проблема возникает, когда я вызываю visKunder() в классе графического интерфейса RegVedKjøp. printStackTrace() перечисляет visKunder() как проблему для исключения NullPointerException.
public class RegVedKjøp extends javax.swing.JFrame {
private static Database d1;
public RegVedKjøp(Database d1) {
initComponents();
this.d1 = d1;
}
private void initComponents(){
...
JList jList2 = new JList();
fyllListe(jList2);
...
}
private void fyllListe(JList list){
ArrayList<Kunde> kunder = d1.visKunder();
list = new JList(kunder.toArray());
}
Я не знаю, имеет ли это отношение, но я использовал GUI Builder NetBeans для разработки GUI. Любые советы о том, как решить эту проблему, будут очень благодарны.
РЕДАКТИРОВАТЬ:
private void initComponents() {
scrollbar1 = new java.awt.Scrollbar();
lagreKnapp = new javax.swing.JButton();
tKnapp = new javax.swing.JButton();
label1 = new java.awt.Label();
jLabel2 = new javax.swing.JLabel();
txtType = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
txtAntall = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
txtPris = new javax.swing.JTextField();
jLabel4 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
jList2 = new JList();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Registrer kjøp av ved - Dagsverket");
setAlwaysOnTop(true);
setResizable(false);
lagreKnapp.setFont(new java.awt.Font("sansserif", 0, 14)); // NOI18N
lagreKnapp.setText("Lagre");
lagreKnapp.setPreferredSize(new java.awt.Dimension(95, 50));
lagreKnapp.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
lagreKnappActionPerformed(evt);
}
});
tKnapp.setFont(new java.awt.Font("sansserif", 0, 14)); // NOI18N
tKnapp.setText("Tilbake");
tKnapp.setPreferredSize(new java.awt.Dimension(75, 30));
tKnapp.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tKnappActionPerformed(evt);
}
});
label1.setText("label1");
jLabel2.setFont(new java.awt.Font("sansserif", 1, 14)); // NOI18N
jLabel2.setText("Vedtype:");
jLabel2.setFocusable(false);
jLabel2.setPreferredSize(new java.awt.Dimension(70, 25));
jLabel1.setFont(new java.awt.Font("sansserif", 1, 14)); // NOI18N
jLabel1.setText("Antall sekker:");
jLabel1.setFocusable(false);
jLabel1.setName(""); // NOI18N
jLabel1.setPreferredSize(new java.awt.Dimension(70, 25));
jLabel3.setFont(new java.awt.Font("sansserif", 1, 14)); // NOI18N
jLabel3.setText("Pris pr/sekk:");
jLabel4.setFont(new java.awt.Font("SansSerif", 1, 14)); // NOI18N
jLabel4.setText("Kunde:");
jButton1.setFont(new java.awt.Font("SansSerif", 0, 14)); // NOI18N
jButton1.setText("Registrer Ny Kunde");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
Этот код генерируется GUI Builder. Я также должен заявить, что этот класс является одним из нескольких, которые помогают отображать графический интерфейс. Каждый класс отвечает за одну операцию, запрошенную пользователем. Все они собраны в классе Mainpage, который используется в классе System, который запускает всю программу. Первое, что делается в системе, - это создание объекта базы данных и подключение к базе данных. Этот объект базы данных затем используется в качестве параметра в каждом классе графического интерфейса.
2 ответа
d1
очевидно null
, Зачем? Ну, потому что вы звоните fyllListe()
метод на initComponents()
метод, который до инициализации d1
поле в конструкторе, поэтому, пожалуйста, просто измените порядок, правильный конструктор:
public RegVedKjøp(Database d1) {
this.d1 = d1;
initComponents();
}
Из того, что вы написали. Наиболее вероятной причиной является то, что d1 является нулевым. Когда RegVedKjøp создает. Тогда база данных d1 является нулевой в классе.
Если бы я был тобой. Я бы отладил и проверил, является ли база данных d1 нулевой или нет. Но так как вы не добавили свою трассировку стека, точно сказать сложно. Внутри метода visKunde есть некоторая переменная, которая также может быть нулевой. Так как они созданы вне метода.