2014-02-04 3 views
0

LogCat NPE ОшибкаNullPointerException Logcat Ошибка Android

02-03 16:19:48.172: D/AndroidRuntime(959): Shutting down VM 
02-03 16:19:48.182: W/dalvikvm(959): threadid=1: thread exiting with uncaught exception (group=0x41465700) 
02-03 16:19:48.322: E/AndroidRuntime(959): FATAL EXCEPTION: main 
02-03 16:19:48.322: E/AndroidRuntime(959): java.lang.IllegalStateException: Could not execute method of the activity 
02-03 16:19:48.322: E/AndroidRuntime(959): at android.view.View$1.onClick(View.java:3633) 
02-03 16:19:48.322: E/AndroidRuntime(959): at android.view.View.performClick(View.java:4240) 
02-03 16:19:48.322: E/AndroidRuntime(959): at android.view.View$PerformClick.run(View.java:17721) 
02-03 16:19:48.322: E/AndroidRuntime(959): at android.os.Handler.handleCallback(Handler.java:730) 
02-03 16:19:48.322: E/AndroidRuntime(959): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-03 16:19:48.322: E/AndroidRuntime(959): at android.os.Looper.loop(Looper.java:137) 
02-03 16:19:48.322: E/AndroidRuntime(959): at android.app.ActivityThread.main(ActivityThread.java:5103) 
02-03 16:19:48.322: E/AndroidRuntime(959): at java.lang.reflect.Method.invokeNative(Native Method) 
02-03 16:19:48.322: E/AndroidRuntime(959): at java.lang.reflect.Method.invoke(Method.java:525) 
02-03 16:19:48.322: E/AndroidRuntime(959): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
02-03 16:19:48.322: E/AndroidRuntime(959): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-03 16:19:48.322: E/AndroidRuntime(959): at dalvik.system.NativeStart.main(Native Method) 
02-03 16:19:48.322: E/AndroidRuntime(959): Caused by: java.lang.reflect.InvocationTargetException 
02-03 16:19:48.322: E/AndroidRuntime(959): at java.lang.reflect.Method.invokeNative(Native Method) 
02-03 16:19:48.322: E/AndroidRuntime(959): at java.lang.reflect.Method.invoke(Method.java:525) 
02-03 16:19:48.322: E/AndroidRuntime(959): at android.view.View$1.onClick(View.java:3628) 
02-03 16:19:48.322: E/AndroidRuntime(959): ... 11 more 
02-03 16:19:48.322: E/AndroidRuntime(959): Caused by: java.lang.NullPointerException 
02-03 16:19:48.322: E/AndroidRuntime(959): at com.example.universitybudgetub.MainMenu.populateListViewFromDB(MainMenu.java:184) 
02-03 16:19:48.322: E/AndroidRuntime(959): at com.example.universitybudgetub.MainMenu.addRecord(MainMenu.java:135) 
02-03 16:19:48.322: E/AndroidRuntime(959): ... 14 more 

Это сообщение об ошибке я получаю, я не могу найти, где ошибка NPE в моем коде. Ниже я приведу как MainMenu.java, так и DBAdpater.java.

MainMenu.java

package com.example.universitybudgetub; 

import java.io.File; 

import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.Menu; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Toast; 


public class MainMenu extends FragmentActivity{ 

    DBAdapter db = new DBAdapter(this); //Initiate DB class methods 
    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 


    //OnCreate 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_menu); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
    } 

    public void onClick(View v){ 
      String destPath = "/data/data/" + getPackageName() + "/databases/ExpensesDB"; 
      @SuppressWarnings("unused") 
      File f = new File(destPath); 
    } 

    //OnCreateOptionsMenu 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main_menu, menu); 
     return true; 
    } 

    //SectionsPagerAdapter Controls which Fragment is retrieved for each page 
    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Fragment fragment; 
      switch (position) { 
       case 0: 
        fragment = new Fragment1(); 
        break; 
       case 1: 
        fragment = new Fragment2(); 
        break; 
       case 2: 
        fragment = new Fragment3(); 
        break; 
       case 3: 
        fragment = new Fragment4(); 
        break; 
       case 4: 
        fragment = new Fragment5(); 
        break; 
       default: 
        fragment = null; 
        break; 
      } 
      return fragment; 
     } 

     //Returns the amount of pages to display 
     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 5; 
     } 

     //Page Title 
     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
      case 0: 
       return getString(R.string.title_section1); 
      case 1: 
       return getString(R.string.title_section2); 
      case 2: 
       return getString(R.string.title_section3); 
      case 3: 
       return getString(R.string.title_section4); 
      case 4: 
       return getString(R.string.title_section5); 
      } 
      return null; 
     } 
    } 

    //Add New Record 
    public void addRecord (View v){ 

     //Get data from form 
     EditText foodTxt = (EditText)findViewById(R.id.editText_food); 
     EditText taxiTxt = (EditText)findViewById(R.id.editText_taxi); 
     EditText clothesTxt = (EditText)findViewById(R.id.editText_clothes); 
     EditText sportsTxt = (EditText)findViewById(R.id.editText_sports); 
     EditText supermarketTxt = (EditText)findViewById(R.id.editText_supermarket); 
     EditText clubs_barsTxt = (EditText)findViewById(R.id.editText_clubs); 
     EditText owed_moneyTxt = (EditText)findViewById(R.id.editText_owed_money); 
     EditText otherTxt = (EditText)findViewById(R.id.editText_other); 
     EditText electric_gasTxt = (EditText)findViewById(R.id.editText_electric_gas); 
     EditText waterbillTxt = (EditText)findViewById(R.id.editText_water); 
     EditText houseTxt = (EditText)findViewById(R.id.editText_house); 
     EditText rentTxt = (EditText)findViewById(R.id.editText_rent); 
     EditText internetTxt = (EditText)findViewById(R.id.editText_internet); 

     db.open(); 
     @SuppressWarnings("unused") 
     long id = db.insertRecord(foodTxt.getText().toString(), clothesTxt.getText().toString(), 
       supermarketTxt.getText().toString(), taxiTxt.getText().toString(), sportsTxt.getText().toString(), 
       clubs_barsTxt.getText().toString(), owed_moneyTxt.getText().toString(), otherTxt.getText().toString(), 
       electric_gasTxt.getText().toString(), waterbillTxt.getText().toString(), rentTxt.getText().toString(), 
       houseTxt.getText().toString(), internetTxt.getText().toString()); 

     populateListViewFromDB(); //Re-populate the list after new record is added 

     db.close(); 

     //Set editText fields to empty 
     foodTxt.setText(""); 
     taxiTxt.setText(""); 
     clothesTxt.setText(""); 
     sportsTxt.setText(""); 
     supermarketTxt.setText(""); 
     clubs_barsTxt.setText(""); 
     owed_moneyTxt.setText(""); 
     otherTxt.setText(""); 
     electric_gasTxt.setText(""); 
     waterbillTxt.setText(""); 
     houseTxt.setText(""); 
     rentTxt.setText(""); 
     internetTxt.setText(""); 
     Toast.makeText(MainMenu.this, "Expenses Added", Toast.LENGTH_LONG).show(); 
    } 

    private void openDB(){ 
     db = new DBAdapter(this); 
     db.open(); 
    } 

    private void populateListViewFromDB() { 
     Cursor cursor = db.getAllRows(); 

     //Allow activity to manage lifetime of the cursor 
     //DEPRECATED! 
     startManagingCursor(cursor); 

     //Setup mapping from cursor to view fields 
     String[] fromFieldNames = new String[] 
       {DBAdapter.KEY_ROWID, DBAdapter.KEY_FOOD, DBAdapter.KEY_CLOTHES, DBAdapter.KEY_SUPERMARKET, DBAdapter.KEY_TAXI, DBAdapter.KEY_SPORTS, 
        DBAdapter.KEY_CLUBS_BARS, DBAdapter.KEY_OWED_MONEY, DBAdapter.KEY_OTHER, DBAdapter.KEY_ELECTRIC_GAS, DBAdapter.KEY_WATERBILL, 
         DBAdapter.KEY_RENT, DBAdapter.KEY_HOUSE, DBAdapter.KEY_INTERNETBILL,}; 
     int[] toViewIDs = new int[] 
       {R.id.textView_itemid, R.id.textView_itemfood, R.id.textView_itemclothes, R.id.textView_itemsupermarket, R.id.textView_itemtaxi, R.id.textView_itemsports, 
        R.id.textView_itemclubs, R.id.textView_itemowed, R.id.textView_itemother, R.id.textView_itemelectric, R.id.textView_itemwater, 
         R.id.textView_itemrent, R.id.textView_itemhouse, R.id.textView_iteminternet,}; 

     //Create Adapter to map columns of the DB into elements in the UI 
     SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
       this, //Context 
       R.layout.history_expenses_layout, //Row layout template 
       cursor, //cursor (set of DB REcords to map) 
       fromFieldNames, //DB Column names 
       toViewIDs // View IDs to put information in 
       ); 

     //Set the adapter for the list view 
     ListView myList = (ListView) findViewById(R.id.listViewFromDB); 
     myList.setAdapter(myCursorAdapter); 
    } 


} 

DBAdapter.java

package com.example.universitybudgetub; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 


public class DBAdapter { 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_FOOD = "food"; 
    public static final String KEY_CLOTHES = "clothes"; 
    public static final String KEY_SUPERMARKET = "supermarket"; 
    public static final String KEY_TAXI= "taxi"; 
    public static final String KEY_SPORTS = "sports"; 
    public static final String KEY_CLUBS_BARS = "clubs_bars"; 
    public static final String KEY_OWED_MONEY = "owed_money"; 
    public static final String KEY_OTHER = "other"; 
    public static final String KEY_ELECTRIC_GAS = "electric_gas"; 
    public static final String KEY_WATERBILL = "waterbill"; 
    public static final String KEY_RENT = "rent"; 
    public static final String KEY_HOUSE = "house"; 
    public static final String KEY_INTERNETBILL = "internetbill"; 
    private static final String TAG = "DBAdapter"; 

    public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_FOOD, KEY_CLOTHES, KEY_SUPERMARKET, KEY_TAXI, KEY_SPORTS, 
    KEY_CLUBS_BARS, KEY_OWED_MONEY, KEY_OTHER, KEY_ELECTRIC_GAS, KEY_WATERBILL, KEY_RENT, KEY_HOUSE, KEY_INTERNETBILL}; 

    private static String DATABASE_NAME = "ExpensesDB"; 
    private static final String DATABASE_TABLE = "expenses"; 
    private static final int DATABASE_VERSION = 4; 

    private static final String DATABASE_CREATE = 
      "create table if not exists expenses (_id integer primary key autoincrement, " + 
    "food VARCHAR, clothes VARCHAR, supermarket VARCHAR, taxi VARCHAR, sports VARCHAR, clubs_bars VARCHAR, owed_money VARCHAR, other VARCHAR, electric_gas VARCHAR, waterbill VARCHAR, rent VARCHAR, house VARCHAR, internetbill VARCHAR);"; 

private final Context context; 

private DatabaseHelper DBHelper; 
private SQLiteDatabase db; 

public DBAdapter(Context ctx){ 
    this.context = ctx; 
    DBHelper = new DatabaseHelper(context); 
} 

//Instantiate's all the database methods 
public static class DatabaseHelper extends SQLiteOpenHelper { 
    DatabaseHelper(Context context){ 
     super (context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db){ 
     try{ 
      db.execSQL(DATABASE_CREATE); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
     Log.w(TAG, "Upgrading data from version " + oldVersion + " to " + newVersion + " , which wll destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS contacts"); 
     onCreate(db); 
    } 
} 

//Opens database 
public DBAdapter open() throws SQLException{ 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 

//Close database 
public void close(){ 
    DBHelper.close(); 
} 

//Insert record to database 
public long insertRecord(String food, String clothes, String supermarket, String taxi, String sports, String clubs_bars, 
     String owed_money, String other, String electric_gas, String waterbill, String rent, String house, String internetbill){ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_FOOD, food); 
    initialValues.put(KEY_CLOTHES, clothes); 
    initialValues.put(KEY_SUPERMARKET, supermarket); 
    initialValues.put(KEY_TAXI, taxi); 
    initialValues.put(KEY_SPORTS, sports); 
    initialValues.put(KEY_CLUBS_BARS, clubs_bars); 
    initialValues.put(KEY_OWED_MONEY, owed_money); 
    initialValues.put(KEY_OTHER, other); 
    initialValues.put(KEY_ELECTRIC_GAS, electric_gas); 
    initialValues.put(KEY_WATERBILL, waterbill); 
    initialValues.put(KEY_RENT, rent); 
    initialValues.put(KEY_HOUSE, house); 
    initialValues.put(KEY_INTERNETBILL, internetbill); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

//Delete particular record 
public boolean deleteRecord(long rowId) 
{ 
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
} 

//Retrieve particular record 
public Cursor getRecord(long rowId) throws SQLException 
{ 
    Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_FOOD, KEY_CLOTHES, KEY_TAXI, KEY_SPORTS, 
      KEY_CLUBS_BARS, KEY_OWED_MONEY, KEY_OTHER, KEY_ELECTRIC_GAS, KEY_WATERBILL, KEY_RENT, KEY_HOUSE, KEY_INTERNETBILL}, 
      KEY_ROWID + "=" + rowId, null, null, null, null, null); 
    if (mCursor != null) { 
      mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

//Update particular record 
public boolean updateRecord(long rowId, int food, int clothes, int taxi, int sports, int clubs_bars, int owed_money, int other, 
     int electric_gas, int waterbill, int rent, int house, int internetbill){ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_FOOD, food); 
    args.put(KEY_CLOTHES, clothes); 
    args.put(KEY_TAXI, taxi); 
    args.put(KEY_SPORTS, sports); 
    args.put(KEY_CLUBS_BARS, clubs_bars); 
    args.put(KEY_OWED_MONEY, owed_money); 
    args.put(KEY_OTHER, other); 
    args.put(KEY_ELECTRIC_GAS, electric_gas); 
    args.put(KEY_WATERBILL, waterbill); 
    args.put(KEY_RENT, rent); 
    args.put(KEY_HOUSE, house); 
    args.put(KEY_INTERNETBILL, internetbill); 
    return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
} 

// Return all data in the database. 
public Cursor getAllRows() { 
    String where = null; 
    Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
         where, null, null, null, null, null); 
    if (c != null) { 
     c.moveToFirst(); 
    } 
    return c; 
} 


} 

Я поместил представление списка в Java класс под названием fragment5 и назвал его с идентификатором listViewFromDB. То, что я пытаюсь сделать, - отобразить информацию БД в списке на фрагменте5. Я не уверен, повлияет ли фрагмент на то, как MainMenu.java может найти идентификатор ListViewFromDB, поскольку это может вызвать NPE.

Любая помощь будет замечательной!

+0

Кажется, что ошибка исходит из 'addRecord' /' populateListViewFromDB'. Я вижу, что вы открываете БД и пытаетесь что-то с этим сделать. Я вижу, что он инициализирован, но я не думаю, что вы должны добавить 'новый DBAdapter (this)' out onCreate. Можете ли вы поместить его внутрь и попробовать? –

ответ

3
private void openDB(){ 
    db = new DBAdapter(this); 
    db.open(); 
} 

Этот метод не вызывался так, когда вы пытаетесь получить доступ к db экземпляр это метание исключения нулевого указателя.

+0

Существует (немного некорректная) инициализация переменных элемента: 'DBAdapter db = new DBAdapter (this);' – laalto

+0

Не заметил моей ошибки. – Triode

+0

Я полностью избавился от метода 'openDB' и просто назвал' db.open() 'в моей' onCreate', поскольку я заметил, что уже начал инициализировать DBAdapter db = new DBAdapter (this); 'в начале. Он по-прежнему дает мне NPE – user3197786

1

Ряд 184 видели в StackTrace достаточно близко к этим линиям:

ListView myList = (ListView) findViewById(R.id.listViewFromDB); 
myList.setAdapter(myCursorAdapter); 

Убедитесь, что ваш макет установлен в setContentView() фактически содержит ListView с идентификатором listViewFromDB.

+0

Я могу сказать, вместо использования 'ListView' я должен использовать' ListFragment'? Поскольку мое приложение расширяет 'MainMenu' до' FragmentActivity' и, следовательно, почему оно не может найти id 'listViewFromDB' – user3197786

+0

Вы можете использовать' ListView' в любом действии/фрагменте. 'ListActivity' /' ListFragment' просто поставляется с опциями 'ListView' и вспомогательными методами для его использования. – laalto

+0

Хм, тогда я вернусь к квадрату, его все еще бросая NPE, даже подумал, что я убедился, что 'listViewFromDB' существует как id. – user3197786

Смежные вопросы