Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    189

    errore Excepiton in thread "main" java.lang:NullPointerException

    codice:
    import java.sql.*;
    import java.util.*;
    
    class RicetteIngredienti {
      private Statement stm;
      private ResultSet rs;
      private Connection con;
      
      boolean connetti() {
        boolean bool = false;
        try {
        	   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     	      Connection con = DriverManager.getConnection("jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Programmi\\dbricette_1_3_049.mdb");
    	  stm = con.createStatement();
    	  
    	  bool = true;
    	} catch(Exception e) {bool=false;e.printStackTrace();}
    	return bool;
      }
      
      void eseguiOperazioni() {
        try {
          // Qui, estrai sempre i tuoi ingredienti dalla tabella Ricette
          rs = stm.executeQuery("SELECT id,ingredienti FROM Tempo");
          while(rs.next()) {
            // Id ricetta
            int id = rs.getInt("id");
            String ingredienti = rs.getString("ingredienti");
            // Suddivide gli ingredienti in token
            Scanner parser = new Scanner(ingredienti);
            parser.useDelimiter("=");
            // Prendo ogni token (ingrediente)
            while(parser.hasNext()) {
              String ingrediente = parser.next();
    	      // Restituisce -1 se l'ingrediente NON è presente nella tabella Ingredienti
    	      int id_ingrediente = isIngredientePresent(ingrediente);
    		  System.out.println(id_ingrediente);
    		  Statement stm1 = con.createStatement();
    	      if(id_ingrediente != -1) {
    	        stm1.executeUpdate("INSERT INTO Ingredienti(id_ingrediente,id_ricetta,ingrediente) VALUES('"+id_ingrediente+"','"+id+"','"+ingrediente+"')");
    	      } else {
    	        // Restituisce 
    	        id_ingrediente = ultimoElementoIngredienti();
    	        stm1.executeUpdate("INSERT INTO Ingredienti(id_ingrediente,id_ricetta,ingrediente) VALUES('"+(id_ingrediente+1)+"','"+id+"','"+ingrediente+"')");
    	      }
            }
          }
    	} catch(SQLException sqlex) {sqlex.printStackTrace();}
      }
      
      // Funzioni
      private int ultimoElementoIngredienti() throws SQLException {
        Statement stm3 = con.createStatement();
      
        ResultSet rs3 = stm3.executeQuery("SELECT MAX(id_ingrediente) FROM Ingredienti");
        int ultima_riga = -1;
        while(rs3.next()) {
          // Questa è la colonna restituita, quindi dobbiamo leggere dentro di lei.
          ultima_riga = rs3.getInt("MAX(id_ingrediente)");
        }
    	stm3.close();
    	rs3.close();
        return ultima_riga;
      }
    
      private int isIngredientePresent(String ingrediente) throws SQLException {
        int id_ingrediente = -1; // Non presente
        Statement stm3 = con.createStatement();
        ResultSet rs3 = stm3.executeQuery("SELECT id_ingrediente FROM Ingredienti WHERE ingrediente = '"+ingrediente+"'");
        while(rs3.next()) {
          id_ingrediente = Integer.parseInt(rs3.getString("id_ingrediente"));
    	  break;
        }
    	stm3.close();
    	rs3.close();
        return id_ingrediente;
      }
    }
    
    public class GestioneRicette {
    public static void main(String[] args) {
    		
    	RicetteIngredienti ri;
         ri = new RicetteIngredienti();
    	if(ri.connetti()) {
    	  ri.eseguiOperazioni();
    	} else {
    	  System.out.println("Non e' stato possibile stabilire la connessione!");
    	}
    	}
    
    }
    ecco compilando questo programma, mi da i seguenti errori
    Excepiton in thread "main" java.lang:NullPointerException
    at RicetteIngredienti.isIngredientePresent(gestioneri cette.java:68)
    at RicetteIngredienti.eseguiOperazioni(.............. .........java:36)
    at GestioneRicette.main(..............java:86)

    insomma in tutte le funzioni che io richiamo.......
    qualcuno sa darmi una mano?? grazie mille

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    La variabile di istanza "con" (che poi utilizzi nel metodo eseguiOperazioni() ) non viene mai inizializzata.
    Nel metodo connetti, infatti:

    codice:
        try {
        	   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     	      Connection con = DriverManager.getConnection("jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Programmi\\dbricette_1_3_049.mdb");
    	  stm = con.createStatement();
    Dichiari e istanzi un oggetto locale, che nasconde quello di istanza, che ha lo stesso nome.

    Soluzione:

    codice:
        try {
        	   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     	      con = DriverManager.getConnection("jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Programmi\\dbricette_1_3_049.mdb");
    	  stm = con.createStatement();
    PS: La prossima volta, specifica quali sono le righe che il compilatore ti segnala, così la gente evita di doversi copiare tutto il codice e andarlo a scoprire a mano.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    ...te l'avevo detto liga di spostarlo all'esterno la dichiarazione

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    189
    java.sql.SQLException: ResultSet is closed
    at sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.clearWarnings(Unkn own Source)
    at sun.jdbc.odbc.JdbcOdbcResultSet.close(Unknown Source)
    at RicetteIngredienti.isIngredientePresent(Ge.java:76 )
    at RicetteIngredienti.eseguiOperazioni(Ge.java:37)
    at Ge.main(Ge.java:89)

    adesso mi da questo errore :S

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Errore diverso, discussione diversa.

    Tra l'altro, l'errore è chiaro e basta un piccolo sforzo per trovare la soluzione.

    Il resultset è chiuso quando tenti di effettuare un'operazione su di esso. Da qualche parte, quindi, lo chiudi (fai una close() ) quando non dovresti farlo perchè lo vuoi utilizzare ancora.

    In particolare, nel file Ge.java, alla riga 76 effettui l'operazione su un ResultSet e questo è già stato chiudo da qualche altra parte (prima di tale riga).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.