Autore Topic: Database nullPointer  (Letto 747 volte)

Offline ms92ita

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Database nullPointer
« il: 20 Luglio 2012, 16:06:14 CEST »
0
Salve a tutti,
cercando di finire il gioco che sto creando mi sono imbattuto in un problema che non riesco minimamente a capire, cioè cercando di leggere dei dati da database mi da l'errore di null pointer.

Vi posto il codice in questione(posto solo i pezzi interessati perchè le classi che ho create sono abbastanza lunghe  :-P )


//metodo all'interno di un thread
Codice (Java): [Seleziona]
public void geographyGame() {
                        level = (1000 * level) + 2000;
                        notifyMessage(geo.createResult(context.getDatabase(), type)); //riga in cui avviene il nullpointer
                        Messages message = new Messages("Lock buttons");
                        message.putMessage("block", "buttons");
                        try {
                                Thread.sleep(level);
                                notifyMessage(message);
                        } catch (InterruptedException e) {
                                try {
                                        Thread.sleep(1000);
                                        notifyMessage(message);
                                } catch (InterruptedException e1) {
                                }
                        }
                }

//classe geography (geo nel metodo)
Codice (Java): [Seleziona]
public class Geography extends SQLiteOpenHelper {

        public static final String DB_NAME = "ReactionWorld.db";
        public static final int VERSION = 5;
        public Context context;

        public Geography(Context context) {
                super(context, DB_NAME, null, VERSION);
                this.context = context;
        }

        public void onCreate(SQLiteDatabase arg0) {
                arg0.execSQL("PRAGMA foreign_keys=ON;");
                arg0.execSQL("CREATE TABLE " + Continent.TABLE_NAME + "(" + ""
                                + Continent.ID + " INTEGER PRIMARY KEY NOT NULL," + ""
                                + Continent.NAME + " TEXT NOT NULL " + ");");
                arg0.execSQL("CREATE TABLE " + Country.TABLE_NAME + "(" + ""
                                + Country.ID + " INTEGER PRIMARY KEY NOT NULL," + ""
                                + Country.NAME + " TEXT," + "" + Country.FLAG + " TEXT," + ""
                                + Country.CAPITAL + " TEXT," + "" + Country.AREA + " DOUBLE,"
                                + Country.POPULATION + " INTEGER," + ""
                                + Country.CONTINENT + " INTEGER," + "FOREIGN KEY ( "
                                + Country.CONTINENT + " ) REFERENCES " + Continent.TABLE_NAME
                                + "(" + Continent.ID + ")" + ");");
                load(arg0);
        }

        public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
                arg0.execSQL("DELETE * FROM " + Continent.TABLE_NAME);
                arg0.execSQL("DELETE * FROM " + Country.TABLE_NAME);
                load(arg0);
        }

        public void load(SQLiteDatabase db) {
                String[] continents = context.getResources().getStringArray(
                                R.array.continents);
                String[] countries = context.getResources().getStringArray(
                                R.array.countries);
                for (int i = 0; i < continents.length; i++) {
                        db.insert(Continent.TABLE_NAME, null,
                                        Continent.getValues(continents[i], i + 1));
                }
                for (int i = 0; i < countries.length; i++) {
                        db.insert(Country.TABLE_NAME, null,
                                        Country.getValues(countries[i], i + 1));
                }
        }

        public Messages createResult(SQLiteDatabase db,int gameType) {
                int i = ((int) ((Math.random() * 5) + 1));
                String query = "SELECT * FROM " + Country.TABLE_NAME + " WHERE "
                                + Country.CONTINENT + "=" + i;
                Cursor cursor = db.rawQuery(query, null);
                Messages msg = new Messages("Game question");
                cursor.moveToPosition((int) (Math.random() * cursor.getCount()));
               
                String name1=cursor.getString(cursor.getColumnIndexOrThrow(Country.NAME)).replaceAll("\"", "'");
                String flag1=cursor.getString(cursor.getColumnIndexOrThrow(Country.FLAG)).replaceAll("\"", "'");
                String capital1=cursor.getString(cursor.getColumnIndexOrThrow(Country.CAPITAL)).replaceAll("\"", "'");
                double area1=Double.parseDouble(cursor.getString(cursor.getColumnIndexOrThrow(Country.AREA)).replaceAll("\"", "'"));
                int pop1=Integer.parseInt(cursor.getString(cursor.getColumnIndexOrThrow(Country.POPULATION)).replaceAll("\"", "'"));
               
                int index = cursor.getInt(cursor.getColumnIndexOrThrow(Country.ID));
                cursor = db.rawQuery(query + " AND " + Country.ID + "<>" + index, null);
                cursor.moveToPosition((int) (Math.random() * cursor.getCount()));
               
                String name2=cursor.getString(cursor.getColumnIndexOrThrow(Country.NAME)).replaceAll("\"", "'");
                String flag2=cursor.getString(cursor.getColumnIndexOrThrow(Country.FLAG)).replaceAll("\"", "'");
                String capital2=cursor.getString(cursor.getColumnIndexOrThrow(Country.CAPITAL)).replaceAll("\"", "'");
                double area2=Double.parseDouble(cursor.getString(cursor.getColumnIndexOrThrow(Country.AREA)).replaceAll("\"", "'"));
                int pop2=Integer.parseInt(cursor.getString(cursor.getColumnIndexOrThrow(Country.POPULATION)).replaceAll("\"", "'"));
               
                int casual=(int) (Math.random()*4);
                switch (gameType) {
                case 1:
                        if(casual==0) {
                                msg.putMessage("ImageView", flag1);
                                msg.putMessage("TextView", capital1);
                                msg.setResult(true);
                        } else {
                                msg.putMessage("ImageView", flag1);
                                msg.putMessage("TextView", capital2);
                                msg.setResult(false);
                        }
                        break;
                case 2:
                        if(casual==0) {
                                msg.putMessage("TextView", name1);
                                msg.putMessage("ImageView", flag1);
                                msg.setResult(true);
                        } else {
                                msg.putMessage("TextView", name1);
                                msg.putMessage("ImageView", flag2);
                                msg.setResult(false);
                        }
                        break;
                case 3:
                        if(casual==0) {
                                if(pop1>pop2) {
                                        msg.putMessage("TextView", name1+" > "+name2);
                                } else {
                                        msg.putMessage("TextView", name1+" < "+name2);
                                }
                                msg.setResult(true);
                        } else {
                                if(pop1>pop2) {
                                        msg.putMessage("TextView", name1+" < "+name2);
                                } else {
                                        msg.putMessage("TextView", name1+" > "+name2);
                                }
                                msg.setResult(false);
                        }
                        break;
                case 4:
                        if(casual==0) {
                                if(area1>area2) {
                                        msg.putMessage("TextView", name1+" > "+name2);
                                } else {
                                        msg.putMessage("TextView", name1+" < "+name2);
                                }
                                msg.setResult(true);
                        } else {
                                if(area1>area2) {
                                        msg.putMessage("TextView", name1+" < "+name2);
                                } else {
                                        msg.putMessage("TextView", name1+" > "+name2);
                                }
                                msg.setResult(false);
                        break;
                        }
                }
                return msg;
        }
}


//classe principale (sarebbe il context nel metodo)
Codice (Java): [Seleziona]
public void onCreate(Bundle savedInstanceState) {
                ...
                Geography geography = new Geography(this);
                geo=geography.getReadableDatabase();
                ...
        }

public SQLiteDatabase getDatabase() {
                return geo;
        }

ho provato pure a mettere getApplicationContext() quando richiamo nella classe principale il geography, ma nulla, pure con il context mi da nullpointer

P.S. prima di implementare il databse nel progetto finale avevo fatto una prova in un progetto esterno per vedere se funzionava e infatti funziona alla perfezione senza nessun tipo di problema, quindi non me lo so proprio spiegare perché dall'altra parte da problemi
« Ultima modifica: 20 Luglio 2012, 16:15:17 CEST da ms92ita »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Database nullPointer
« Risposta #1 il: 20 Luglio 2012, 16:09:39 CEST »
0
Dovresti postare il LogCat dell'errore e indicare con precisione qual'è la riga di codice indicata come sorgente dell'errore stesso.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ms92ita

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Database nullPointer
« Risposta #2 il: 20 Luglio 2012, 16:12:28 CEST »
0
ecco il logcat

Codice: [Seleziona]
07-19 01:09:35.047: E/AndroidRuntime(5682): java.lang.NullPointerException
07-19 01:09:35.047: E/AndroidRuntime(5682):         at reaction.game.GameExecution$GameThread.geographyGame(GameExecution.java:418)
07-19 01:09:35.047: E/AndroidRuntime(5682):         at reaction.game.GameExecution$GameThread.switchType(GameExecution.java:341)
07-19 01:09:35.047: E/AndroidRuntime(5682):         at reaction.game.GameExecution$GameThread.run(GameExecution.java:385)

switchtype è un metodo interno al thread per il fatto che ho tante opzioni di gioco, quindi per evitare di creare casino dentro il run ho fatto questo metodo, comunque da solo queste tre righe, nient'altro

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Database nullPointer
« Risposta #3 il: 20 Luglio 2012, 17:16:53 CEST »
0
cosa c'è a questa riga:
reaction.game.GameExecution$GameThread.geographyGame(GameExecution.java:418)
?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline ms92ita

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Database nullPointer
« Risposta #4 il: 20 Luglio 2012, 17:22:00 CEST »
0
l'avevo segnata

Codice (Java): [Seleziona]
 notifyMessage(geo.createResult(context.getDatabase(), type)); //riga in cui avviene il nullpointer
ti spiego in poche parole: sto utilizzando un thread con il metodo dell'handler (utilizzo questo perchè mi trovo più a mio agio) e per mandare il messaggio all'handler utilizzo un metodo che l'ho chiamato notifyMessage(). Visto che ho circa 10 varianti di gioco all'interno alcune di esse funzionano, ma quelle con cui devo accedere al database non funzionano e appunto mi danno nullpointer come nel logcat

sarebbe da postare l'intero codice per far vedere com'è strutturato il gioco però sono circa in tutto almeno un migliaio di righe  :D

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Database nullPointer
« Risposta #5 il: 20 Luglio 2012, 19:01:57 CEST »
0
l'avevo segnata

Codice (Java): [Seleziona]
 notifyMessage(geo.createResult(context.getDatabase(), type)); //riga in cui avviene il nullpointer
ti spiego in poche parole: sto utilizzando un thread con il metodo dell'handler (utilizzo questo perchè mi trovo più a mio agio) e per mandare il messaggio all'handler utilizzo un metodo che l'ho chiamato notifyMessage(). Visto che ho circa 10 varianti di gioco all'interno alcune di esse funzionano, ma quelle con cui devo accedere al database non funzionano e appunto mi danno nullpointer come nel logcat

sarebbe da postare l'intero codice per far vedere com'è strutturato il gioco però sono circa in tutto almeno un migliaio di righe  :D
il fatto è che in questa riga possono essere null:
geo
context
context.getDatabase()
type

sei sicuro di quale di questi sia null? se non lo sei, hai due opzioni:
-vai in debug sul device/emulatore
-spezzi questa chiamata in piu righe e cerchi di capire cosa è null e cosa no
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline ms92ita

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Database nullPointer
« Risposta #6 il: 21 Luglio 2012, 01:11:37 CEST »
0
col debug era la stessa cosa comunque il primo consiglio che mi hai dato è stato utile: non ho proprio smezzato il metodo ma ho fatto tipo così per ogni oggetto presente nel metodo

Codice (Java): [Seleziona]
if(geo==null)
System.out.println("geo null");

e infatti ho provato il problema cioè context.getDatabase era nullo... così visto che avevo la possibilità di richiamare direttamente l'oggetto SQLiteDatabse dall'activity (classe principale) ho risolto il problema, però me ne è sorto un'altro ancora più strano di un altro tipo
dopo aver sistemato questo problema, il thread crea le domande e come avevo detto prima le manda all'handler che si occupa di modificare la grafica: però ora non crea domande in continuo, ma solo alle prime due poi basta non fa più nulla come se si fosse bloccato

ecco il metodo
Codice (Java): [Seleziona]
public void geographyGame() {
                        level = (1000 * level) + 2000;
                        Geography geo=new Geography(context);
                        Messages msg=geo.createResult(context.geo, type);
                        notifyMessage(msg);
                        Messages message = new Messages("Lock buttons");
                        try {
                                Thread.sleep(level);
                                notifyMessage(message);
                        } catch (InterruptedException e) {
                                try {
                                        notifyMessage(message);
                                        Thread.sleep(1000);
                                } catch (InterruptedException e1) {
                                }
                        }
                }

è all'interno del metodo switchtype che controlla il type, cioè il tipo di gioco che deve utilizzare... prima di richiamare questo metodo ho controllato appunto il type con un system.out e resta uguale, ma appuynto si blocca dopo appena due "tentativi" anche se lo sleep è massimo quei 5 secondi su un tempo di gioco di minimo 60 secondi... non è colpa dello switch perchè ho provato con altri type e funziona come dovrebbe fare

ecco il run del thread
Codice (Java): [Seleziona]
public void run() {
                        Messages message = new Messages("Prepare game");
                        notifyMessage(message);
                        try {
                                Thread.sleep(1000);
                        } catch (InterruptedException e2) {
                                e2.printStackTrace();
                        }
                        message = new Messages("Start game");
                        notifyMessage(message);
                        while (!finish) {
                                message = new Messages("Clear layouts");
                                notifyMessage(message);
                                synchronized (lock) {
                                        while (pause) {
                                                try {
                                                        lock.wait();
                                                } catch (InterruptedException e) {
                                                }
                                        }
                                }
                                System.out.println("nuova domanda con type="+type);
                                switchType();
                        }
                        System.out.println("Finish");
                        message = new Messages("Finish game");
                        notifyMessage(message);
                        try {
                                Thread.sleep(3000);
                        } catch (InterruptedException e) {
                        }
                        message = new Messages("Game results");
                        notifyMessage(message);
                }
« Ultima modifica: 21 Luglio 2012, 01:19:09 CEST da ms92ita »

Offline ms92ita

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Database nullPointer
« Risposta #7 il: 21 Luglio 2012, 01:29:18 CEST »
0
scusate cazzata mia  :-o

ho sbagliato una cosa semplice cioè questa

Codice (Java): [Seleziona]
level = (1000 * level) + 2000;
infatti avevo messo Thread.sleep(level); e questo vuol dire incrementare all'iunverosimile ogni volta lo sleep  :-o

infatti ho sistemato in questo modo

Codice (Java): [Seleziona]
long sleep= (1000 * level) + 2000;
e poi ho sistemato lo sleep con Thread.sleep(sleep)

un errore grossolano per la fretta di finire  :-o