NullPointerException

nephilim89

Utente Attivo
24 Mar 2010
64
5
0
ciao! mi dà questo errore:
Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1045)
at javax.swing.JToolBar.addImpl(JToolBar.java:561)
at java.awt.Container.add(Container.java:365)
at src.ZetaMoviesApp.<init>(ZetaMoviesApp.java:39)
at src.ZetaMoviesApp.main(ZetaMoviesApp.java:136)

codice:
PHP:
package src;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.sql.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTable;
import java.util.Vector;

class moviesApp extends JFrame implements ActionListener{

private Button ok;
private Button annulla;
private JPanel northPanel;
private JTable mainTable;
private JPanel statusBar;
private JProgressBar progressBar;
private JMenuBar menuBar;
private JMenu fileMenu;
private JMenuItem nuovoFile;
private BorderLayout borderLayout;
private JToolBar toolBar;


public moviesApp(){
    
	borderLayout = new BorderLayout();
	this.setLayout(borderLayout);    
        
        northPanel = new JPanel(new GridLayout(2,1));

        menuBar = new JMenuBar();
            menuBar.add(fileMenu = new JMenu("File"));
                fileMenu.add(nuovoFile = new JMenuItem("Nuovo"));

        toolBar = new JToolBar("toolBar",JToolBar.HORIZONTAL);
            toolBar.add(ok);
            toolBar.add(annulla);

  	ok = new Button("Ok");
	ok.addActionListener(this);
	
	annulla = new Button("Annulla");
	annulla.addActionListener(this);

        statusBar = new JPanel(new GridLayout(1,1));

        // CREAZIONE JTABLE
        try{
            String driver = "org.apache.derby.jdbc.EmbeddedDriver";
            Class.forName(driver).newInstance();

            String protocol = "jdbc:derby:zmovies;";
            Connection c = DriverManager.getConnection( protocol );

            Statement exe = c.createStatement();
            ResultSet rs = exe.executeQuery("SELECT * FROM movies;");
            ResultSetMetaData m = rs.getMetaData();

            DefaultTableModel model = new DefaultTableModel();
            JTable jTable1 = new JTable(model);

            // Aggiungi le colonne "manualmente"
            model.addColumn("ID");
            model.addColumn("Titolo");
            model.addColumn("Genere");
            model.addColumn("Anno");
            model.addColumn("Regista");
            model.addColumn("Attori");
            model.addColumn("Copertina");
            model.addColumn("Conservato in");

            // Aggiungi le righe leggendo dal db;
            while(rs.next()) {
              Vector<String> row = new Vector<String>();
              row.addElement(rs.getString("ID"));
              row.addElement(rs.getString("Title"));
              row.addElement(rs.getString("Genre"));
              row.addElement(rs.getString("Release"));
              row.addElement(rs.getString("Director"));
              row.addElement(rs.getString("Actor"));
              row.addElement(rs.getString("Cover"));
              row.addElement(rs.getString("Stored"));

              model.addRow(row);
            }

            rs.close();
            exe.close();
            c.close();
        }
        catch (ClassNotFoundException e){ System.out.println(e); }
        catch (SQLException e){ System.out.println(e); }
        catch (InstantiationException e){ System.out.println(e); }
        catch (IllegalAccessException e){ System.out.println(e); }



        northPanel.add(menuBar);
        northPanel.add(toolBar);


        this.add(northPanel,BorderLayout.NORTH);
	this.add(mainTable,BorderLayout.CENTER);
	this.add(statusBar,BorderLayout.SOUTH);
	this.setTitle("mia finestra");
	this.setSize(900,600);
	this.setVisible(true);

	this.addWindowListener(new WindowAdapter(){
		public void windowClosing(WindowEvent e){
			dispose();
		}
		public void windowIconified(WindowEvent e){
			setTitle("Ridotto a Icona");
		}
		public void windowDeiconified(WindowEvent e){
			setTitle("mia finestra");
		}
		} ) ;
	
}



public void actionPerformed(ActionEvent e){

System.out.println(e);
}

public static void main(String arg[])
{

	moviesApp launch = new moviesApp();

}

}
come risolvo?
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
Prima di aggiungere un componente alla JToolBar devi istanziarlo. L'errore è qui:

PHP:
toolBar = new JToolBar("toolBar",JToolBar.HORIZONTAL);
toolBar.add(ok);
toolBar.add(annulla);

ok = new Button("Ok");
ok.addActionListener(this);

annulla = new Button("Annulla");
annulla.addActionListener(this);
Aggiungi alla JToolBar i Button "ok" e "annulla" prima di istanziarli. Prova a modificare il codice in questo modo:

PHP:
ok = new Button("Ok");
ok.addActionListener(this);

annulla = new Button("Annulla");
annulla.addActionListener(this);

toolBar = new JToolBar("toolBar",JToolBar.HORIZONTAL);
toolBar.add(ok);
toolBar.add(annulla);
 

nephilim89

Utente Attivo
24 Mar 2010
64
5
0
ho modificato, ora l'errore è

java.sql.SQLException: [Microsoft][Driver ODBC Microsoft Access] Impossibile tro
vare il file "(sconosciuto)".
Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1041)
at java.awt.Container.add(Container.java:959)
at javax.swing.JFrame.addImpl(JFrame.java:540)
at java.awt.Container.add(Container.java:927)
at src.moviesApp.<init>(ZetaMoviesApp.java:104)
at src.moviesApp.main(ZetaMoviesApp.java:134)

il tutto è organizzato cosi:

\directorydellapplicazione\
---file.bat
---src\
--------moviesApp.java
--------zmovies.mdb
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
Dovresti postare il codice per verificare le righe che causano l'eccezione. Comunque il problema dovrebbe essere dovuto al fatto che non viene trovato il la classe che implementa il driver jdbc:

PHP:
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
Class.forName(driver).newInstance();
Tale classe dovrebbe trovarsi in un fil .JAR che deve essere incluso nel classpath.
Comunque dubito che utilizzando un driver jdbc per Derby tu possa accedere ad un database Access (.mdb)
 

nephilim89

Utente Attivo
24 Mar 2010
64
5
0
?devo aver postato un codice vecchio,l'avevo modificato cosi:

PHP:
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
            Class.forName(driver);

            String protocol = "jdbc:odbc:; Driver={Microsoft Access Driver (*.mdb)}; DBQ=zmovies.mdb";
            Connection c = DriverManager.getConnection( protocol );
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
Ok allora il problema dovrebbe essere dovuto al fatto che la libreria non viene trovata. Devi aggiungerla al classpath. Non ti da errore in fase di compilazione in quanto la classe viene istanzizta a runtime tramite il metodo Class.forName().
Come esegui il codice? Tramite qualche IDE tipo Eclipse oppure direttamente da riga di comando?
Se utilizzi un IDE ti basta semplicemente includere il JAR necessario nel progetto, da riga di comando invece devi utilizzare l'opzione -cp o -classpath per includerlo.
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
Ricontrollando più attentamente l'eccezione sollevata potrebbe anche essere che non trova fisicamente il file .mdb Dal codice esso viene cercato nella root del progetto che sicuramente non sarà sotto src. Prova a spostarlo nella directory dell'applicazione.
 

nephilim89

Utente Attivo
24 Mar 2010
64
5
0
la compilazione la eseguo dal dos tramite questo file .bat:
javac src/*.java
java src.moviesApp

il file mdb e il file java si trovano entrambi in src.
se faccio javac -classpath src/*.java mi dice:

javac: no source files
Usage: javac <options> <source files>
use -help for a list of possible options

D:\...\movies>java src.moviesApp
java.sql.SQLException: [Microsoft][Driver ODBC Microsoft Access] Impossibile tro
vare il file "(sconosciuto)".
Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1041)
at java.awt.Container.add(Container.java:959)
at javax.swing.JFrame.addImpl(JFrame.java:540)
at java.awt.Container.add(Container.java:927)
at src.moviesApp.<init>(moviesApp.java:104)
at src.moviesApp.main(moviesApp.java:134)


eppure in un altra directory ho un altra applicazione java che usa un file mdb strutturato allo stesso modo e funziona correttamente
 

nephilim89

Utente Attivo
24 Mar 2010
64
5
0
ho provato a togliere "package src;" dal codice e a mettere tutto quanto (file bat,java,mdb) nella stessa cartella. non è ordinato come prima ma almeno in questo modo l'eccezzione del database sembra sparire,ma resta questo:

Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1041)
at java.awt.Container.add(Container.java:959)
at javax.swing.JFrame.addImpl(JFrame.java:540)
at java.awt.Container.add(Container.java:927)
at moviesApp.<init>(moviesApp.java:104)
at moviesApp.main(moviesApp.java:134)
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
C'è un'errore nell'interfaccia grafica. Non hai creato l'istanza dell'oggetto mainTable (JTable) che poi aggiungi alla fine nel JFrame:
Codice:
this.add(mainTable,BorderLayout.CENTER);
Quindi in questo caso è null e genera l'eccezione.
Suppongo che deve essere la JTable che visualizza i dati del database. Quindi invece di:
Codice:
JTable jTable1 = new JTable(model);
dovresti utilizzare mainTable:
Codice:
mainTable = new JTable(model);
 

nephilim89

Utente Attivo
24 Mar 2010
64
5
0
acc errore di distrazione! ho sostituito e mi da sempre l'errore

Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1041)
at java.awt.Container.add(Container.java:959)
at javax.swing.JFrame.addImpl(JFrame.java:540)
at java.awt.Container.add(Container.java:927)
at moviesApp.<init>(moviesApp.java:104)
at moviesApp.main(moviesApp.java:134)

se uso netbeans come ide mi sottolinea in giallo mainTable e dice Local variables hide a filed.

riposto il codice completo

PHP:
 import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.sql.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTable;
import java.util.Vector;

class moviesApp extends JFrame implements ActionListener{

private Button ok;
private Button annulla;
private JPanel northPanel;
private JTable mainTable;
private JPanel statusBar;
private JProgressBar progressBar;
private JMenuBar menuBar;
private JMenu fileMenu;
private JMenuItem nuovoFile;
private BorderLayout borderLayout;
private JToolBar toolBar;


public moviesApp(){
    
	borderLayout = new BorderLayout();
	this.setLayout(borderLayout);    
        
        northPanel = new JPanel(new GridLayout(2,1));

        menuBar = new JMenuBar();
            menuBar.add(fileMenu = new JMenu("File"));
                fileMenu.add(nuovoFile = new JMenuItem("Nuovo"));

  	ok = new Button("Ok");
	ok.addActionListener(this);
	
	annulla = new Button("Annulla");
	annulla.addActionListener(this);

        toolBar = new JToolBar("toolBar",JToolBar.HORIZONTAL);
            toolBar.add(ok);
            toolBar.add(annulla);

        statusBar = new JPanel(new GridLayout(1,1));

        // CREAZIONE JTABLE
        try{
            String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
            Class.forName(driver);

            String protocol = "jdbc:odbc:; Driver={Microsoft Access Driver (*.mdb)}; DBQ=zmovies.mdb";
            Connection c = DriverManager.getConnection( protocol );

            Statement exe = c.createStatement();
            ResultSet rs = exe.executeQuery("SELECT * FROM movies;");
            ResultSetMetaData m = rs.getMetaData();

            DefaultTableModel model = new DefaultTableModel();
            JTable mainTable = new JTable(model);

            // Aggiungi le colonne "manualmente"
            model.addColumn("ID");
            model.addColumn("Titolo");
            model.addColumn("Genere");
            model.addColumn("Anno");
            model.addColumn("Regista");
            model.addColumn("Attori");
            model.addColumn("Copertina");
            model.addColumn("Conservato in");

            // Aggiungi le righe leggendo dal db;
            while(rs.next()) {
              Vector<String> row = new Vector<String>();
              row.addElement(rs.getString("ID"));
              row.addElement(rs.getString("Title"));
              row.addElement(rs.getString("Genre"));
              row.addElement(rs.getString("Release"));
              row.addElement(rs.getString("Director"));
              row.addElement(rs.getString("Actor"));
              row.addElement(rs.getString("Cover"));
              row.addElement(rs.getString("Stored"));

              model.addRow(row);
            }

            rs.close();
            exe.close();
            c.close();
        }
        catch (ClassNotFoundException e){ System.out.println(e); }
        catch (SQLException e){ System.out.println(e); }



        northPanel.add(menuBar);
        northPanel.add(toolBar);


        this.add(northPanel,BorderLayout.NORTH);
	this.add(mainTable,BorderLayout.CENTER);
	this.add(statusBar,BorderLayout.SOUTH);
	this.setTitle("mia finestra");
	this.setSize(900,600);
	this.setVisible(true);

	this.addWindowListener(new WindowAdapter(){
		public void windowClosing(WindowEvent e){
			dispose();
		}
		public void windowIconified(WindowEvent e){
			setTitle("Ridotto a Icona");
		}
		public void windowDeiconified(WindowEvent e){
			setTitle("mia finestra");
		}
		} ) ;
	
}



public void actionPerformed(ActionEvent e){

System.out.println(e);
}

public static void main(String arg[])
{

	moviesApp launch = new moviesApp();

}

}
io lo rileggo in continuazione ma nn trovo niente fuori posto!
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
e non hai corretto bene. Mi spiego, se la mainTable l'hai già dichiarata qui :
Codice:
public class moviesApp extends JFrame implements ActionListener{
   ....
   private JTable mainTable;
  ...
quando crei l'istanza devi togliere il JTable, cioè devi fare in questo modo:
Codice:
DefaultTableModel model = new DefaultTableModel();
mainTable = new JTable(model);
quindi senza il JTable davanti
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
Secondo me stai facendo un po' di confusione e stai andando per tentativi. Prima dichiari mainTable come attributo privato di classe:

PHP:
private JTable mainTable;
Poi invece quando lo istanzi ne crei uno nuovo all'interno del try {} catch() per cui con visibilità solamente all'interno del costrutto:

PHP:
JTable mainTable = new JTable(model);
Quindi stai istanziando un nuovo attributo mainTable con lo stesso nome dell'attributo privato di classe, ma con visibilità solamente all'interno del costrutto try catch. E' per questo che Netbeans ti da errore ed è per questo che l'applicativo va in eccezione.
Praticamente stai aggiungendo un componente null.

PHP:
this.add(mainTable,BorderLayout.CENTER);
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
Oppsss, lespaul mi ha preceduto. Segui le sue indicazioni e ti consiglio di prestare maggiore attenzione al codice.
 

nephilim89

Utente Attivo
24 Mar 2010
64
5
0
oook ora va perfettamente! questo codice viene fuori da vari tentavi di creare un applicazione con netbeans e nell'usare derby e access!per questo era tutto incasinato!
comunque ho capito gli errori e le relative spiegazioni!

vi ringrazio per la pazienza!
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
Scusami, ma se all'inizio dichiari:
Codice:
import java.awt.*;
Perché subito dopo scrivi anche questo?
Codice:
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
E' inutile, in quanto l'asterisco sta ad indicare che Java deve importare l'intero package.
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
attenzione: l'intero package si, ma non i sotto package. L' importazione giusta sarebbe questa:
Codice:
import java.awt.*;
import java.awt.event.*;
scusami Alessandro per la precisazione ma mi era sembrato di capire che intendessi anche i sottopackage. Se non è cosi pardon :)
 

nephilim89

Utente Attivo
24 Mar 2010
64
5
0
perchè inizialmente era un progetto desktop di netbeans,che importa classe per classe.io invece di solito importo tutto il package. nel codice che ho postato ci sono entrambi perchè il tutto è ancora in fase di transizione da netbeans :)

grazie per la precisazione