Autore Topic: Cursor Null Pointer Exception  (Letto 819 volte)

Offline swet90

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Davide Antonelli
  • Sistema operativo:
    Windows 8
Cursor Null Pointer Exception
« il: 24 Luglio 2013, 19:33:53 CEST »
0
Ragazzi , ciao a tutti, ho un problema con la mia prima app, in sostanza c' è un FragmentActivity che al suo interno contiene una funzione per leggere un database e popolare una ListView, funziona tutto molto bene tranne il fatto che quando termino l' activity ( oppure premo il tasto back) viene generato un errore e l' app termina in modo imprevisto!

Leggendo un po su internet ho trovato che il problema potrebbe essere causato dal fatto che il Cursor potrebbe essere null e quindi generare l' eccezione!
Ecco il sorgente della funzione che prende i dati :

Codice (Java): [Seleziona]
Cursor c;
MyDatabase db;
public datipersonali Leggidati(){
       
     
                datipersonali dat0 ;
        dat0=new datipersonali (dato);
        getActivity().startManagingCursor(c);
       
       
       db.open();  //apriamo il db
       
        c=db.fetchProducts();
       
        if (db.fetchProducts().getCount() > 0){


            c.moveToLast();


             dat0.eta=(Integer.valueOf(c.getString(c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_ETA_KEY))));//'c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_ETA_KEY' restituisce l' indice della colonna del db, occorre fare il metodoc.string() per ottenrere la stringa e dopo il metodo Integer.valueOf per pttenere l' INT
             dat0.peso=Integer.valueOf(c.getString(c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_PESO_KEY)));
            dat0.altezza=Integer.valueOf(c.getString(c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_ALTEZZA_KEY)));
            dat0.data=c.getString(c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_DATA_KEY));
////////////////////////////riempio l'interfaccia grafica
           
           
            /////////////////////////////////////////////////////////
           

          dato=dat0;
try {
        SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor
           getActivity(),
            R.layout.datilayout, //il layout di ogni riga/prodotto
            c,
            new String[]{MyDatabase.progressoMetaData.PROGRESSO_PESO_KEY,MyDatabase.progressoMetaData.PROGRESSO_ETA_KEY,MyDatabase.progressoMetaData.PROGRESSO_ALTEZZA_KEY,MyDatabase.progressoMetaData.PROGRESSO_DATA_KEY},//questi colonne
            new int[]{R.id.peso1,R.id.eta1,R.id.altezza1,R.id.data1});//in queste views

            datiLv.setAdapter(adapter); //la listview ha questo adapter
           
             
             
                             
       
       
           
}catch (Exception exc){
        System.out.println(exc);
}



           


        }else{
           
        }
       return dat0;
       
    }

e questo invece è il log cat;

Codice: [Seleziona]
07-24 19:27:59.622: D/AndroidRuntime(11200): Shutting down VM
07-24 19:27:59.622: W/dalvikvm(11200): threadid=1: thread exiting with uncaught exception (group=0x414b0930)
07-24 19:27:59.630: E/AndroidRuntime(11200): FATAL EXCEPTION: main
07-24 19:27:59.630: E/AndroidRuntime(11200): java.lang.RuntimeException: Unable to stop activity {com.davide.palestrando/com.davide.palestrando.Home}: java.lang.NullPointerException
07-24 19:27:59.630: E/AndroidRuntime(11200):         at android.app.ActivityThread.handleSleeping(ActivityThread.java:3259)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at android.app.ActivityThread.access$2700(ActivityThread.java:141)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1413)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at android.os.Handler.dispatchMessage(Handler.java:99)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at android.os.Looper.loop(Looper.java:137)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at android.app.ActivityThread.main(ActivityThread.java:5041)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at java.lang.reflect.Method.invokeNative(Native Method)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at java.lang.reflect.Method.invoke(Method.java:511)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at dalvik.system.NativeStart.main(Native Method)
07-24 19:27:59.630: E/AndroidRuntime(11200): Caused by: java.lang.NullPointerException
07-24 19:27:59.630: E/AndroidRuntime(11200):         at android.app.Activity.performStop(Activity.java:5258)
07-24 19:27:59.630: E/AndroidRuntime(11200):         at android.app.ActivityThread.handleSleeping(ActivityThread.java:3256)
07-24 19:27:59.630: E/AndroidRuntime(11200):         ... 10 more

potete aiutarmi?

Grazie

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Cursor Null Pointer Exception
« Risposta #1 il: 24 Luglio 2013, 19:50:20 CEST »
0
Cosa fai a riga 525 della classe Activity?

Offline swet90

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Davide Antonelli
  • Sistema operativo:
    Windows 8
Re:Cursor Null Pointer Exception
« Risposta #2 il: 24 Luglio 2013, 20:04:26 CEST »
0
La riga 525 non esiste nella mia Activity....
Dove l' hai vista?

Grazie

Offline crbin1

  • Utente junior
  • **
  • Post: 61
  • Respect: +6
    • labeltodo
    • Mostra profilo
    • Do Androids Dream of Electric Sheep?
  • Dispositivo Android:
    Galaxy Nexus
Re:Cursor Null Pointer Exception
« Risposta #3 il: 24 Luglio 2013, 21:00:07 CEST »
0
Sovrascrivi il metodo onStop nella tua Activity?

Offline swet90

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Davide Antonelli
  • Sistema operativo:
    Windows 8
Re:Cursor Null Pointer Exception
« Risposta #4 il: 24 Luglio 2013, 21:05:31 CEST »
0
No non sovrascrivo il metodo OnStop!! Vorrei provare a intercettare la chiusura dell' activity in modo da poter rilasciare il puntatore prima della chiusura ma non riesco, anche se teoricamente la funzione startmanagincursor dovrebbe essere autosufficiente...


Offline crbin1

  • Utente junior
  • **
  • Post: 61
  • Respect: +6
    • labeltodo
    • Mostra profilo
    • Do Androids Dream of Electric Sheep?
  • Dispositivo Android:
    Galaxy Nexus
Re:Cursor Null Pointer Exception
« Risposta #5 il: 24 Luglio 2013, 21:29:36 CEST »
0
Prova a postare tutta l'activity, il problema secondo me non è nella parte di codice che hai postato, è qualcosa che fai nei metodi di chiusura activity dove hai il NullPointerException

Offline swet90

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Davide Antonelli
  • Sistema operativo:
    Windows 8
Re:Cursor Null Pointer Exception
« Risposta #6 il: 24 Luglio 2013, 21:37:20 CEST »
0
Non gestisco la chiusura dell activity, domani postero l intero codice!

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Cursor Null Pointer Exception
« Risposta #7 il: 25 Luglio 2013, 07:54:38 CEST »
0
La riga 525 non esiste nella mia Activity

Hai ragione, scusami.
Posta il codice della classe che ci si dà un'occhiata.

Offline swet90

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Davide Antonelli
  • Sistema operativo:
    Windows 8
Re:Cursor Null Pointer Exception
« Risposta #8 il: 25 Luglio 2013, 16:11:31 CEST »
0
Ragazzi ecco il codice:

Codice: [Seleziona]
import android.support.v4.app.Fragment;
import android.app.AlertDialog;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
public class home1 extends Fragment  {
        datipersonali dato;
   
    TextView twaltezza;
   
    Button elimina;
    String path;
    ListView vocimenu,datiLv;
    Cursor c;
    Vibrator vb;
    Calendar cal;
    MyDatabase db;
    View rootView;
   
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                 
                final View rootView = inflater.inflate(
                                R.layout.home, container, false);
                String [] funzioni = getResources().getStringArray(R.array.VociMenu);
        final Context context =rootView.getContext();
        vb= (Vibrator) rootView.getContext().getSystemService(Context.VIBRATOR_SERVICE);
        datiLv= (ListView)rootView.findViewById((R.id.datiLV));
        db=new MyDatabase(rootView.getContext());
       
     
        cal=new GregorianCalendar();
        datiLv.setSelector(R.drawable.selezione_item_datilv);
        datiLv.setClickable(true);
       // db=new MyDatabase(rootView.getContext());
        datiLv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                vb.vibrate(60);
                AlertDialog.Builder builder=new AlertDialog.Builder(rootView.getContext());
                builder.setTitle("Elimina");

                builder.setMessage("Sei sicuro di voler eliminare il record selezionato?!");
                builder.setCancelable(true);


                builder.setPositiveButton("Sì", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        eliminarecord(c.getInt(c.getColumnIndex(MyDatabase.progressoMetaData.ID)));
                    }

                });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();

                    }



                });
                builder.show();
                return false;
            }});


        Leggidati();
        return rootView;
        }
       

    public datipersonali Leggidati(){
       
     
                datipersonali dat0 ;
        dat0=new datipersonali (dato);
        getActivity().startManagingCursor(c);
       
       
       db.open();  //apriamo il db
       
        c=db.fetchProducts();
       
        if (db.fetchProducts().getCount() > 0){


            c.moveToLast();


             dat0.eta=(Integer.valueOf(c.getString(c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_ETA_KEY))));//'c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_ETA_KEY' restituisce l' indice della colonna del db, occorre fare il metodoc.string() per ottenrere la stringa e dopo il metodo Integer.valueOf per pttenere l' INT
             dat0.peso=Integer.valueOf(c.getString(c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_PESO_KEY)));
            dat0.altezza=Integer.valueOf(c.getString(c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_ALTEZZA_KEY)));
            dat0.data=c.getString(c.getColumnIndex(MyDatabase.progressoMetaData.PROGRESSO_DATA_KEY));
////////////////////////////riempio l'interfaccia grafica
           
           
            /////////////////////////////////////////////////////////
           

          dato=dat0;
try {
        SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor
           getActivity(),
            R.layout.datilayout, //il layout di ogni riga/prodotto
            c,
            new String[]{MyDatabase.progressoMetaData.PROGRESSO_PESO_KEY,MyDatabase.progressoMetaData.PROGRESSO_ETA_KEY,MyDatabase.progressoMetaData.PROGRESSO_ALTEZZA_KEY,MyDatabase.progressoMetaData.PROGRESSO_DATA_KEY},//questi colonne
            new int[]{R.id.peso1,R.id.eta1,R.id.altezza1,R.id.data1});//in queste views

            datiLv.setAdapter(adapter); //la listview ha questo adapter
           
             
             
                             
       
       
           
}catch (Exception exc){
        System.out.println(exc);
}



           


        }else{
           
        }
       return dat0;
       
    }



 


        public int eliminarecord(int id){
        int eliminato = 0;
        db.open();
        db.deleteContact(id);

        eliminato = 1;
        db.close();
        Leggidati();

        //System.out.println("Id oggetto da eliminare: " +id);


        return eliminato;
    }
   

}



Grazie a tutti per l' interesse!


Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Cursor Null Pointer Exception
« Risposta #9 il: 29 Luglio 2013, 12:09:40 CEST »
+1
Forse ho trovato uno spunto interessante legato al tuo problema su > questo blog < (post interessante tra l'altro)

Noto che in effetti fai:
Codice (Java): [Seleziona]
      getActivity().startManagingCursor(c);
      db.open();  //apriamo il db
       
       c=db.fetchProducts();

Ovvero imposti nell'activity un cursore gestito prima di inizializzarlo davvero.
Quindi quando il sistema verifica se ci sono cursori gestiti ne vede uno, ma non è quello che usi (lo istanzi dopo, per cui probabilmente stai dicendo all'activity di gestire un cursore a null).
Prova a spostare lo startManagingCursor(c) dopo aver fatto il fetchProducts(), in modo che quando viene eseguito performStop() venga trovato effettivamente il cursor corretto da chiudere da parte del sistema.
« Ultima modifica: 29 Luglio 2013, 12:17:04 CEST da Sakazaki »

Offline swet90

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Davide Antonelli
  • Sistema operativo:
    Windows 8
Re:Cursor Null Pointer Exception
« Risposta #10 il: 29 Luglio 2013, 17:38:48 CEST »
0
Avevi ragione, il tuo ragionamento è sicuramente corretto perché così facendo l' errore è sparito! Sei un grande!!! Grazie!!!