java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.namecardlistview.MainActivity}:java.lang.NullPointerException

时间:2015-02-20 06:36:04

标签: java android

我正在尝试创建自己的Android应用,但我遇到了错误

logcat的:

02-20 05:51:45.955: I/DB(2527): Database opened
02-20 05:51:46.555: I/DB(2527): Returned 3 rows
02-20 05:51:46.595: D/AndroidRuntime(2527): Shutting down VM
02-20 05:51:46.647: W/dalvikvm(2527): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
02-20 05:51:46.666: E/AndroidRuntime(2527): FATAL EXCEPTION: main
02-20 05:51:46.666: E/AndroidRuntime(2527): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.namecardlistview/com.example.namecardlistview.MainActivity}: java.lang.NullPointerException
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.os.Looper.loop(Looper.java:137)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.app.ActivityThread.main(ActivityThread.java:5041)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at java.lang.reflect.Method.invokeNative(Native Method)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at java.lang.reflect.Method.invoke(Method.java:511)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at dalvik.system.NativeStart.main(Native Method)
02-20 05:51:46.666: E/AndroidRuntime(2527): Caused by: java.lang.NullPointerException
02-20 05:51:46.666: E/AndroidRuntime(2527):     at com.example.namecardlistview.MainActivity.refreshDisplay(MainActivity.java:65)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at com.example.namecardlistview.MainActivity.onCreate(MainActivity.java:46)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.app.Activity.performCreate(Activity.java:5104)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-20 05:51:46.666: E/AndroidRuntime(2527):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
02-20 05:51:46.666: E/AndroidRuntime(2527):     ... 11 more
02-20 05:56:46.835: I/Process(2527): Sending signal. PID: 2527 SIG: 9

MainActivity:

package com.example.namecardlistview;

import java.util.List;

import com.example.namecardlistview.NewActivity;
import com.example.namecardlistview.DetailActivity;
import com.example.namecardlistview.CardDataSource;
import com.example.namecardlistview.R;
import com.example.namecardlistview.NameCard;
import android.widget.ListView;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.app.Activity;
import android.content.Intent;

public class MainActivity extends ListActivity {

     CardDataSource datasource;
     List<NameCard> cards;
     Long cardID;
     String cardName;
     ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); 


        datasource = new CardDataSource(this);
        datasource.open();
        listView = (ListView) findViewById(R.id.listview); //getListView();
        //ViewGroup header = (ViewGroup) getLayoutInflater().inflate(R.layout.header, listView, false);
        //listView.addHeaderView(header, null, false);
        refreshDisplay();
        //setListAdapter(new ArrayAdapter<String>(this, R.layout.list_fruit,FRUITS));

        listView.setTextFilterEnabled(true); 
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    private void refreshDisplay() { 
         cards = datasource.findAll();
         String[] cardArray= new String[cards.size()];
         for (int i=0; i<cards.size();i++)
         {
             cardArray[i]= cards.get(i).getName();
         }
         listView.setAdapter(new ArrayAdapter<String>(this, R.layout.list_card,cardArray));
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
        position-=1;
        cardID=cards.get(position).getId();
        cardName=cards.get(position).getName();
        Intent intent = new Intent(this,DetailActivity.class);
        intent.putExtra("name", cards.get(position).getName());
        intent.putExtra("id", cards.get(position).getId());
        startActivityForResult(intent, 2);

    }
    public void addCard (MenuItem item){

        // Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show();
        /* Fruit myFruit = new Fruit();
         myFruit.setTitle("Apple");
         myFruit.setDescription("apple is good");
         datasource.create(myFruit);*/
         Intent intent = new Intent(this,NewActivity.class);
         startActivityForResult(intent, 1);
     }


    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
    // Toast.makeText(this, "listenered activated", Toast.LENGTH_SHORT).show();
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode==RESULT_OK)
        {
            //String mybenefit =  data.getStringExtra("benefit");
            //fruit.setDescription(mybenefit);

            refreshDisplay();

            Toast.makeText(this, cardName + " is added", Toast.LENGTH_SHORT).show();
        }else if (resultCode==10)
        {
            datasource.removeCard(cardID);
            refreshDisplay();
            Toast.makeText(this, cardName +" is deleted", Toast.LENGTH_SHORT).show();
        }else if (resultCode==11)
        {

            refreshDisplay();
            Toast.makeText(this, cardName +" is updated", Toast.LENGTH_SHORT).show();
        }
    }

}

我刚开始使用stackoverflow,所以我不知道我应该做什么。 所以只需告诉我你需要的任何代码。

此外,除了为所有行添加4个空格之外,是否有更简单的方法来创建代码块?编辑:没关系fount快捷方式-.-我是一个白痴

编辑:

CardDataSource:

package com.example.namecardlistview;

import java.util.ArrayList;
import java.util.List;

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

import com.example.namecardlistview.NameCard;
import com.example.namecardlistview.CardDBOpenHelper;

public class CardDataSource {

public static final String LOGTAG="DB";

    private static final String[] allColumns = {
        CardDBOpenHelper.COLUMN_ID,
        CardDBOpenHelper.COLUMN_NAME,
        CardDBOpenHelper.COLUMN_OCCUPATION,
        CardDBOpenHelper.COLUMN_COMPANY,
        CardDBOpenHelper.COLUMN_EMAIL,
        CardDBOpenHelper.COLUMN_NUMBER,
        CardDBOpenHelper.COLUMN_URL,
        CardDBOpenHelper.COLUMN_SUMMARY,
        CardDBOpenHelper.COLUMN_FAVOURITE};

    SQLiteOpenHelper dbhelper;
    SQLiteDatabase database;

    public CardDataSource(Context context) {
        dbhelper = new CardDBOpenHelper(context);
    }

    public void open() {
        Log.i(LOGTAG, "Database opened");
        database = dbhelper.getWritableDatabase();
    }

    public void close() {
        Log.i(LOGTAG, "Database closed");       
        dbhelper.close();
    }

    public NameCard create(NameCard card) {
        ContentValues values = new ContentValues();
        values.put(CardDBOpenHelper.COLUMN_NAME, card.getName());
        values.put(CardDBOpenHelper.COLUMN_COMPANY, card.getCompany());
        values.put(CardDBOpenHelper.COLUMN_EMAIL, card.getEmail());
        values.put(CardDBOpenHelper.COLUMN_FAVOURITE, card.isFavourite());
        values.put(CardDBOpenHelper.COLUMN_NUMBER, card.getPhone());
        values.put(CardDBOpenHelper.COLUMN_OCCUPATION, card.getOccupation());
        values.put(CardDBOpenHelper.COLUMN_SUMMARY, card.getSummary());
        values.put(CardDBOpenHelper.COLUMN_URL, card.getUrl());
        long insertid = database.insert(CardDBOpenHelper.TABLE_CARDS, null, values);
        card.setId(insertid);
        return card;
    }

    public NameCard update(NameCard card) {
        ContentValues values = new ContentValues();
        values.put(CardDBOpenHelper.COLUMN_NAME, card.getName());
        database.update(CardDBOpenHelper.TABLE_CARDS, values, CardDBOpenHelper.COLUMN_ID+'=' + card.getId(), null);
        return card;
    }

    public List<NameCard> findAll() {
        List<NameCard> cards = new ArrayList<NameCard>();

        Cursor cursor = database.query(CardDBOpenHelper.TABLE_CARDS, allColumns, 
                null, null, null, null, null);

        Log.i(LOGTAG, "Returned " + cursor.getCount() + " rows");
        if (cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                NameCard card = new NameCard();
                card.setId(cursor.getLong(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_ID)));
                card.setName(cursor.getString(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_NAME)));
                card.setCompany(cursor.getString(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_COMPANY)));
                card.setEmail(cursor.getString(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_EMAIL)));
                card.setFavourite(1 == cursor.getInt(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_FAVOURITE)));
                card.setOccupation(cursor.getString(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_OCCUPATION)));
                card.setPhone(cursor.getString(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_NUMBER)));
                card.setUrl(cursor.getString(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_URL)));
                card.setSummary(cursor.getString(cursor.getColumnIndex(CardDBOpenHelper.COLUMN_SUMMARY)));
                cards.add(card);
            }
        }
        Log.i(LOGTAG, "Going to return cards now");
        return cards;
    }

    public boolean removeCard(Long id) {

        String where = CardDBOpenHelper.COLUMN_ID + "=" +id ;
        int result = database.delete(CardDBOpenHelper.TABLE_CARDS, where, null);
        return (result == 1);
    }

}

list_card.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
<Listview
    android:id="@+id/listview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</RelativeLayout>

1 个答案:

答案 0 :(得分:2)

setContentView()中缺少onCreate()方法。