2014-04-09 2 views
0

Я довольно новичок в Java, и я пытаюсь заполнить свой JList данными из базы данных. Данные извлекаются из базы данных с помощью метода visKunder() в классе Database.AWT-EventQueue-0 NullPointerException [RESOLVED]

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() в классе GUI 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()); 
} 

Я не знаю, если это уместно, но я использовал Netbeans' GUI Builder для разработки GUI. Любые советы о том, как исправить эту проблему, будут очень оценены.

EDIT:

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, который запускает всю программу. Первое, что делается в System, - это создание объекта базы данных и подключение к базе данных. Этот объект базы данных является тогда тем, что затем используется как параметр в каждом классе GUI.

+0

, какая линия обсаженных исключение? – Salah

+0

Я думаю, что это ArrayList kunder = d1.visKunder(), но я не могу понять, почему. Исключение в нити "АВТ-EventQueue-0" java.lang.NullPointerException \t на sysbase.RegVedKjøp.fyllListe (RegVedKjøp.java: 181) \t на sysbase.RegVedKjøp.initComponents (RegVedKjøp.java: 105) \t на sysbase.RegVedKjøp. (RegVedKjøp.java: 28) –

+0

Да, но какая строка из вашего кода? – Salah

ответ

0

d1, очевидно, null. Зачем? Ну, потому что вы называете fyllListe() метод в методе initComponents(), который до инициализации d1 поля в конструкторе, поэтому, пожалуйста, просто изменить порядок, собственно конструктор:

public RegVedKjøp(Database d1) { 
    this.d1 = d1; 
    initComponents(); 
} 
+0

Я буду звучать как полная твист, извините, но как я это сделаю? –

+0

@ user3514879 вы можете показать больше кода до вызова 'fyllListe'? – nikis

+0

Пожалуйста, посмотрите раздел ** EDIT ** в вопросе кода и дополнительную информацию об общей функциональности и структуре программы. –

0

Из того, что вы написали. Вероятнее всего, причина в том, что d1 является нулевым. Когда создается RegVedKjøp. Тогда база данных d1 является нулевой в классе.

Если бы я был вами. Я бы отлаживал и проверял, является ли база данных d1 нулевой или нет. Но так как вы не добавили свой стек, трудно сказать точно. Существует некоторая переменная внутри метода visKunde, которая также может быть нулевой. Поскольку они создаются вне метода.

+0

Вы правы, d1 имеет значение null при создании компонентов в initComponents. Любые идеи, как это исправить? –

+0

Ну, это зависит от того, как выглядит код. Но, вероятно, причина в том, что он не создан так, как должен. Я предлагаю вам присмотреться к тому, что происходит при создании объекта базы данных. Тогда, если вы не можете понять, почему. Попробуйте google.com. Вы обязательно найдете ответ там. С информацией, которая добавлена ​​здесь. Невозможно дать вам исправленный ответ. – Viggo