mercredi 15 juin 2016

NullPointerException error when get value from a list

I am trying to pass some values that I get with a select through a method then a NullException appears. What can I do? Or I did something wrong?

Log:

FATAL EXCEPTION: main
    Process: dominio.android.forca, PID: 32241
    java.lang.RuntimeException: Unable to start activity ComponentInfo{dominio.android.forca/dominio.android.forca.JogoAct}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List dominio.android.forca.data.AddressBookDatabaseHelper.Exemplo()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5443)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List dominio.android.forca.data.AddressBookDatabaseHelper.Exemplo()' on a null object reference
        at dominio.android.forca.data.Palavras.sorteio(Palavras.java:67)
        at dominio.android.forca.JogoAct.iniciarJogo(JogoAct.java:195)
        at dominio.android.forca.JogoAct.onCreate(JogoAct.java:39)
        at android.app.Activity.performCreate(Activity.java:6245)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5443) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

Class that I need to receive the select data:

public class Palavras extends ContentProvider {
    private String[] palavras;

    private List<String> lista_palavras;

    public Palavras() {

    }

    // used to access the database
    private AddressBookDatabaseHelper dbHelper;


    @Override
    public boolean onCreate() {
        // create the AddressBookDatabaseHelper
        dbHelper = new AddressBookDatabaseHelper(getContext());
        return true; // ContentProvider successfully created
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection,
                        String selection, String[] selectionArgs, String sortOrder) {

        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }

    public String sorteio() {


        //lista_palavras = dbHelper.Exemplo();
        //String palavraSorteada = lista_palavras.get((int)(random()*lista_palavras.size()));

        palavras = dbHelper.Exemplo2();

        String palavraSorteada = palavras[(int)(random()*palavras.length)];

        return palavraSorteada;
    }

    public static double random() {
        Random r = new Random();

        return r.nextDouble();
    }
}

Method that create the database and select a column:

class AddressBookDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "Forca.db";
    private static final int DATABASE_VERSION = 1;

    // constructor
    public AddressBookDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }


    // creates the contacts table when the database is created
    @Override
    public void onCreate(SQLiteDatabase db) {
        // SQL for creating the contacts table
        final String CREATE_CONTACTS_TABLE =
                "CREATE TABLE " + Contact.TABLE_NAME + "(" +
                        Contact._ID + " integer primary key, " +
                        Contact.COLUMN_WORD + " TEXT, " +
                        Contact.COLUMN_TIP + " TEXT);";
        db.execSQL(CREATE_CONTACTS_TABLE); // create the contacts table
    }

    // normally defines how to upgrade the database when the schema changes
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

    // SELECT COLUMN_WORD through a list
    public List<String> Exemplo(){
        List<String> dados = new ArrayList();
        SQLiteDatabase db = getReadableDatabase();
        String selectQuery = "SELECT palavra FROM palavrasforca";
        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor.moveToFirst()) {
            do{
                String palavra = cursor.getString(cursor.getColumnIndex("palavra"));
                dados.add(palavra);
            }while (cursor.moveToNext());
        }

        return dados;
        //aqui dados terá todos os valores do banco
    }

}

AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dominio.android.forca">

    <application
        android:allowBackup="true"
        android:icon="@drawable/clown"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar">
        <activity android:name=".PlayerAct">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".JogoAct" />
        <activity android:name=".InserirPalavraAct" />
        <activity android:name=".MainActivity" />

        <provider
            android:name=".data.AddressBookContentProvider"
            android:authorities="dominio.android.forca.data"
            android:enabled="true"
            android:exported="false"></provider>

        <activity android:name=".Autores"></activity>
    </application>

</manifest>

I called sorteio() in my JogoAct here:

import dominio.android.forca.data.Palavras;
import dominio.android.forca.data.Replace;

public class JogoAct extends AppCompatActivity implements View.OnClickListener {


    Palavras palavras = new Palavras();

    private String palavraSecreta, tracos;
    private int nTentativas;
    private char letra;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jogo);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        txtDica = (TextView)findViewById(R.id.txtDica);
        iniciarObjetos();
        iniciarJogo();

    }

   public void iniciarJogo() {
        palavraSecreta = palavras.sorteio(); // <<<<< HERE
        nTentativas = 6;
        tracos = "";
        letra = ' ';
        for (int x = 0; x < palavraSecreta.length(); x++) {
            if (palavraSecreta.charAt(x) == '-') {
                tracos += " - ";
            }
            else if(palavraSecreta.charAt(x) == ' '){
                tracos += "   ";
            }
            else {
                tracos += " _ ";
            }
        }

        habilitarBotoes();
        tvPalavra.setText(tracos);
        forca.setImageResource(R.drawable.forca_6);
    }

Any ideia?

Aucun commentaire:

Enregistrer un commentaire