2013-09-27 3 views
0

Je reçois une erreur java.lang.NullPointerException et je ne sais pas pourquoi. Je pense que cela pourrait avoir quelque chose à voir avec la façon dont il n'y a pas de données dans ma base de données, mais je ne sais pas avec certitude. Quelqu'un at-il des suggestions sur la façon de rendre ma base de données accepter qu'il n'y ait pas de données? J'ai pris le code & recherché sur plusieurs sites/livres, mais c'est le plus proche que j'ai eu et je reçois encore des erreurs! L'aide est grandement appréciée! Merci d'avance!Impossible de démarrer ComponentInfo java.lang.NullPointerException

Logcat:

09-27 01:17:14.656: E/AndroidRuntime(3331): FATAL EXCEPTION: main 
09-27 01:17:14.656: E/AndroidRuntime(3331): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pocketbotanist/com.pocketbotanist.HomeScreen}: java.lang.NullPointerException 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.access$700(ActivityThread.java:152) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.os.Looper.loop(Looper.java:137) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.main(ActivityThread.java:5328) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at dalvik.system.NativeStart.main(Native Method) 
09-27 01:17:14.656: E/AndroidRuntime(3331): Caused by: java.lang.NullPointerException 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at com.pocketbotanist.HomeScreen.onCreate(HomeScreen.java:69) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.Activity.performCreate(Activity.java:5250) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
09-27 01:17:14.656: E/AndroidRuntime(3331):  ... 11 more 

code:

package com.pocketbotanist; 

import java.io.File; 

import android.app.ListActivity; 
import android.app.LoaderManager; 
import android.content.CursorLoader; 
import android.content.Intent; 
import android.content.Loader; 
import android.content.pm.ActivityInfo; 
import android.content.res.Configuration; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.ContextMenu; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView.AdapterContextMenuInfo; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Spinner; 

import com.pocketbotanist.contentprovider.MyEntryContentProvider; 
import com.pocketbotanist.database.EntryTable; 



public class HomeScreen extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> { 

    private static final int DELETE_ID = Menu.FIRST + 1; 
    // private Cursor cursor; 
    private SimpleCursorAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home_screen); 
     this.getListView().setDividerHeight(2); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     //Initial folder creation code 
     File appDirectory = new File(Environment.getExternalStorageDirectory().toString()+"/Pocket Botanist/"); 
     if (!appDirectory.exists()){ 
      appDirectory.mkdir(); 
     } 

     //Drop down list code 
     Spinner spinner = (Spinner) findViewById(R.id.action_spinner); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 


     fillData(); 
     @SuppressWarnings("unused") 
     View view = (View) getListView().getItemAtPosition(0); 
     registerForContextMenu(getListView()); 
     if (adapter.isEmpty()) 
      System.out.println("IT'S EMPTY"); 
     String[] projection = { EntryTable.COLUMN_CUSTOMID }; 
     long info = adapter.getItemId(0); 
     Uri uri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/" 
       + info); 
     Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
     cursor.moveToFirst(); 
     System.out.println((cursor.getString(cursor 
        .getColumnIndexOrThrow(EntryTable.COLUMN_CUSTOMID)))); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 


    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case DELETE_ID: 
      String[] projection = { EntryTable.COLUMN_PHOTOS }; 
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item 
      .getMenuInfo(); 
      Uri uri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/" 
        + info.id); 
      Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
      cursor.moveToFirst(); 
      File temp = new File(cursor.getString(cursor 
        .getColumnIndexOrThrow(EntryTable.COLUMN_PHOTOS))); 
      if(temp.exists()){ 
       File[] files = temp.listFiles(); 
       for(int i = 0; i < files.length; i++){ 
        files[i].delete(); 
       } 
       temp.delete(); 
      } 
      getContentResolver().delete(uri, null, null); 
      fillData(); 
      return true; 
     } 

     return super.onContextItemSelected(item); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_home_screen, menu); 
     //SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
     case R.id.menu_settings: 
      settCall(); 
      return true; 
     case R.id.menu_map: 
      map1_3(); 
      return true; 
     case R.id.menu_edit: 
      entryScreen("New Entry"); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    public void entryScreen(String t){ 
     Intent intent = new Intent(this, EntryScreen.class); 
     intent.putExtra("passer", t); 
     startActivity(intent); 
    } 

    public void settCall(){ 
     Intent sett = new Intent(this,SettingsActivity.class); 
     startActivity(sett); 
    } 

    public void map1_3(){ 

     Intent map13 = new Intent(this,Entrymap_1_3.class); 
     startActivity(map13); 
    } 


    // Opens the second activity if an entry is clicked 
    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Intent i = new Intent(this, EntryScreen.class); 
     Uri itemUri = Uri.parse(MyEntryContentProvider.CONTENT_URI + "/" + id); 
     i.putExtra(MyEntryContentProvider.CONTENT_ITEM_TYPE, itemUri); 

     startActivity(i); 
    } 

    //@Override 
    //When we create the loader we're going to get the projection for the ID, customID, species name, and time columns 
    //(insures that these exist within the database) 
    //then we create our cursor loader which will be responsible for loading data from the database 
    //using the projection and our content provider 
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 
     String[] projection = { EntryTable.COLUMN_ID, EntryTable.COLUMN_CUSTOMID, EntryTable.COLUMN_SPECIES, EntryTable.COLUMN_TIME, EntryTable.COLUMN_PHOTOS, EntryTable.COLUMN_PHOTO }; 
     CursorLoader cursorLoader = new CursorLoader(this, 
       MyEntryContentProvider.CONTENT_URI, projection, null, null, null); 
     return cursorLoader; 
    } 

    private void fillData() { 

     // Fields from the database (projection) 
     String[] from = new String[] { EntryTable.COLUMN_CUSTOMID, EntryTable.COLUMN_SPECIES , EntryTable.COLUMN_TIME, EntryTable.COLUMN_PHOTO}; 
     // Fields on the UI to which we map 
     int[] to = new int[] { R.id.customidlabel, R.id.namelabel, R.id.timelabel, R.id.imageView }; 

     getLoaderManager().initLoader(1, null, this);  //changed to 1 
     adapter = new SimpleCursorAdapter(this, R.layout.list_row, null, from, to, 0); 

     setListAdapter(adapter); 
    } 

    @Override 
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.add(0, DELETE_ID, 0, R.string.menu_delete); 
     } 


    @Override 
    public void onLoadFinished(Loader<Cursor> arg0, Cursor data) { 
     adapter.swapCursor(data);  
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
     adapter.swapCursor(null); 
    } 

} 

Répondre

1

Il est la méthode de requête qui renvoie la valeur null, votre curseur est nulle:

Cursor cursor = getContentResolver().query(uri, projection, null, null, null);// check why your query is returning null 
     cursor.moveToFirst(); // cursor is null 
+0

Y at-il un moyen pour que le curseur soit nul/ne renvoie rien? – adamtw1

+0

faire une instruction if, if (curseur! = Null) {cursor.moveToFirst(); System.out.println (...)} – Turkish

0

À la ligne 69, il y a des problèmes avec votre curseur. Assurez-vous que les valeurs existent.

+0

Je n'ai pas de valeur. Y a-t-il un moyen pour le curseur d'accepter aucune valeur? – adamtw1

+0

@ adamtw1 cela signifiait que le curseur était nul et que vous le traversiez pour obtenir les valeurs requises. qui n'existe pas réellement. Imaginez un cas d'un tableau dynamique, et vous remplissez votre tableau avec une requête, et il obtient quatre enregistrements (et devient donc de taille = 4). mais lorsque vous essayez d'accéder à array [5], cela vous donne une exception de sortie. – Zeeshan

Questions connexes