2016-06-14 14 views
0

select *クエリで取得する値をメソッドで渡そうとしています。私はNullPointerExceptionを得る。これは私のログです:リストから値を取得するとNullPointerExceptionエラーが発生する

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) 

これは私がselect *データを受信する必要があるクラスです:

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(); 
    } 
} 

これは、データベースを作成し、列を選択する機能である:

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ファイルです:

<?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> 

私は私のJogoActクラスでsorteio()と呼ばれるところである:

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); 
    } 

なぜ私はこのエラーを取得していますか?助言がありますか? ContentProviderのコンストラクタのDocumentationによると

+0

は、コンテンツプロバイダーとして直接代わりにコンテンツプロバイダのメソッドを呼び出すようです。 – njzk2

+0

申し訳ありませんが、どういう意味ですか? –

+0

したがって、sorteio()ではエラーが発生していますが、どのように呼び出されていますか? また、AndroidManifest.xmlファイルを投稿してください。コンテンツプロバイダを追加することを忘れましたか? – iheanyi

答えて

0

ContentProvider() Construct a ContentProvider instance. Content providers must be declared in the manifest, accessed with ContentResolver, and created automatically by the system, so applications usually do not create ContentProvider instances directly. At construction time, the object is uninitialized, and most fields and methods are unavailable. Subclasses should initialize themselves in onCreate(), not the constructor. Content providers are created on the application main thread at application launch time. The constructor must not perform lengthy operations, or application startup will be delayed.

だから私はDBHelperがまだ初期化されていない主な理由は、あなた、それは現在ヌルでいると思います。だからあなたの呼び出しは例外をスローします。

プロバイダにアクセスするには、ContentResolverを試してみてください。

あなたはのContentProviderとそれがどのように役立つホープContentResolverの

Android SQLite database and content provider

を介してアクセスする方法について学ぶために、このチュートリアルに従うことができます!

関連する問題