无法证实的活动ComponentInfo - 空指针异常 [英] Unable to substantiate activity ComponentInfo - Null Pointer Exception

查看:132
本文介绍了无法证实的活动ComponentInfo - 空指针异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经花了一整天试图捉摸这一个(不用说我是一个很长的路下来learnign曲线 - !因此,我需要寻求帮助) - 下面是一个简单的数据库程序(我试图了解他们的工作落实到另一个应用程序我的工作)。

当我点击显示按钮 - 我得到以下运行时错误:

日志猫

  03-14 16:13:39.612:ERROR / AndroidRuntime(341):致命异常:主要
03-14 16:13:39.612:ERROR / AndroidRuntime(341):了java.lang.RuntimeException:无法实例活动ComponentInfo {com.android.dbtest / com.android.dbtest.ShowActivity}:显示java.lang.NullPointerException
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1544)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:928)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.os.Handler.dispatchMessage(Handler.java:99)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.os.Looper.loop(Looper.java:123)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.app.ActivityThread.main(ActivityThread.java:3647)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在java.lang.reflect.Method.invokeNative(本机方法)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在java.lang.reflect.Method.invoke(Method.java:507)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在dalvik.system.NativeStart.main(本机方法)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):致:显示java.lang.NullPointerException
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.app.Activity.findViewById(Activity.java:1647)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在com.android.dbtest.ShowActivity<&初始化GT;(ShowActivity.java:12)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在java.lang.Class.newInstanceImpl(本机方法)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在java.lang.Class.newInstance(Class.java:1409)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1536)
03-14 16:13:39.612:ERROR / AndroidRuntime(341):11 ...更多

我的主要活动:

 包com.android.dbtest;
进口android.app.Activity;
进口android.content.Intent;
进口android.os.Bundle;
进口android.view.View;
公共类DatabaseTestActivity延伸活动{
/ **当第一次创建活动调用。 * /
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);
    }    公共无效handleClick(视图v){
        意向意图=新的Intent();
        intent.setClass(这一点,AddActivity.class);
        startActivity(意向);
    }    公共无效showHandleClick(视图v){
        意向意图=新的Intent();
        intent.setClass(这一点,ShowActivity.class);
        startActivity(意向);
    }
    }

我型我秀活动(这是我认为主要的错误(猜测不止一个)可能在于,因为它是当我preSS显示按钮,即会出现运行错误,我相信这是关系到建设该列表):

 包com.android.dbtest;进口android.database.Cursor;
进口android.os.Bundle;
进口android.widget.ListView;
进口android.widget.SimpleCursorAdapter;
进口android.util.Log;公共类ShowActivity扩展DatabaseTestActivity {私人SQLiteAdapter mySQLiteAdapter;
ListView控件的listContent =(ListView控件)findViewById(R.id.contentlist);// TextView中的listContent =(的TextView)findViewById(R.id.contentlist);SimpleCursorAdapter的CursorAdapter;
字符串指针;公共静态最后弦乐LOG_TAG =dbtest;公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.show);
    // TODO自动生成方法存根    Log.v(LOG_TAG,第1步);
    //output.setText(将String.valueOf(我从数据库中获得));
    mySQLiteAdapter =新SQLiteAdapter(本);
    mySQLiteAdapter.openToRead();    光标光标= mySQLiteAdapter.queueAll();
    startManagingCursor(光标);
    的String [] =由新的String [] {} SQLiteAdapter.KEY_CONTENT;
    INT []为= INT新[] {} R.id.text;    Log.v(LOG_TAG,从值:+的);
    Log.v(LOG_TAG,价值+至);    SimpleCursorAdapter的CursorAdapter =新SimpleCursorAdapter(这一点,R.layout.row,光标,从,到);
    listContent.setAdapter(CursorAdapter的);    mySQLiteAdapter.close();}
}

我SQLiteAdapter:

 包com.android.dbtest;进口android.content.ContentValues​​;
进口android.content.Context;
进口android.database.Cursor;
进口android.database.sqlite.SQLiteDatabase;
进口android.database.sqlite.SQLiteOpenHelper;
进口android.database.sqlite.SQLiteDatabase.CursorFactory;公共类SQLiteAdapter {
公共静态最后弦乐MYDATABASE_NAME =MY_DATABASE;
公共静态最后弦乐MYDATABASE_TABLE =MY_TABLE;
公共静态最终诠释MYDATABASE_VERSION = 1;
公共静态最后弦乐KEY_CONTENT =内容;
公共静态最后弦乐KEY_ID =_id; //首要的关键
//创建表MY_DATABASE(ID整数主键,内容文字NOT NULL);
私有静态最后弦乐SCRIPT_CREATE_DATABASE =CREATE TABLE
+ MYDATABASE_TABLE +(
+ KEY_ID +整数主键自动增量
+ KEY_CONTENT +文本不为空+
        );;私人SQLiteHelper sqLiteHelper;
私人SQLiteDatabase sqLiteDatabase;
私人上下文的背景下;
公共SQLiteAdapter(上下文C)
{
    上下文= C;
}公共SQLiteAdapter openToRead()抛出android.database.SQLException
{
    sqLiteHelper =新SQLiteHelper(背景下,MYDATABASE_NAME,空,MYDATABASE_VERSION);
    sqLiteDatabase = sqLiteHelper.getReadableDatabase();
    返回此;
}
公共SQLiteAdapter openToWrite()抛出android.database.SQLException {
    sqLiteHelper =新SQLiteHelper(背景下,MYDATABASE_NAME,空,MYDATABASE_VERSION);
    sqLiteDatabase = sqLiteHelper.getWritableDatabase();返回此;
    }
公共无效的close(){
    sqLiteHelper.close();
    }
众长插入(字符串内容){
    ContentValues​​ contentValues​​ =新ContentValues​​();
    contentValues​​.put(KEY_CONTENT,内容);
    返回sqLiteDatabase.insert(MYDATABASE_TABLE,空,contentValues​​);
    }公众诠释deleteAll(){
    返回sqLiteDatabase.delete(MYDATABASE_TABLE,NULL,NULL);
    }公共光标queueAll(){
    的String [] =列新的String [] {KEY_ID,KEY_CONTENT};
    光标光标= sqLiteDatabase.query(MYDATABASE_TABLE,列,NULL,NULL,NULL,NULL,NULL);
    返回游标;
}
公共类SQLiteHelper扩展SQLiteOpenHelper
{
    公共SQLiteHelper(上下文的背景下,字符串名称,CursorFactory工厂,INT版)
    {
        超(背景下,名称,厂家,版本);
        }
    @覆盖公共无效的onCreate(SQLiteDatabase DB)
    {
        // TODO自动生成方法存根
        db.execSQL(SCRIPT_CREATE_DATABASE);
        }
    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页)
    {
        // TODO自动生成方法存根}}}
}
}
}

终于为显示XML文件:

 <?XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:方向=垂直
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT
    >
   < TextView的机器人:layout_height =WRAP_CONTENT
   机器人:文字=TextView的
   机器人:textAppearance =机器人:ATTR / textAppearanceLarge
   机器人:layout_width =WRAP_CONTENT
   机器人:ID =@ + ID / textView1>< / TextView的>   < ListView的机器人:ID =@机器人:ID / Android的:清单
     机器人:layout_width =FILL_PARENT
     机器人:layout_height =FILL_PARENT/> < / LinearLayout中>


解决方案

您不能做到像你的活动,作为静态初始化:

 的ListView的listContent =(ListView控件)findViewById(R.id.contentlist);

究其原因是,你有n要没有加载布局为您的活动,因此此调用将会失败 findViewById(R.id.contentlist)。您的错误来源于类静态初始化,因为你不声明你的类的构造函数,仍然得到错误的<初始化方式>

修正:初始化在的onCreate ,之后您调用的setContentView(R.layout.show)列表视图;

I have spent the day trying to fathom this one out (needless to say I am a long way down the learnign curve - hence my need to ask for help!) - below is a simple database program (I'm trying to understand how they work to implement into another app i am working on).

When I click the 'Show' Button - i get the following Run Time Error:

Log Cat

03-14 16:13:39.612: ERROR/AndroidRuntime(341): FATAL EXCEPTION: main
03-14 16:13:39.612: ERROR/AndroidRuntime(341): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.android.dbtest/com.android.dbtest.ShowActivity}: java.lang.NullPointerException
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1544)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.os.Looper.loop(Looper.java:123)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.app.ActivityThread.main(ActivityThread.java:3647)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at java.lang.reflect.Method.invokeNative(Native Method)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at java.lang.reflect.Method.invoke(Method.java:507)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at dalvik.system.NativeStart.main(Native Method)
03-14 16:13:39.612: ERROR/AndroidRuntime(341): Caused by: java.lang.NullPointerException
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.app.Activity.findViewById(Activity.java:1647)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at com.android.dbtest.ShowActivity.<init>(ShowActivity.java:12)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at java.lang.Class.newInstanceImpl(Native Method)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at java.lang.Class.newInstance(Class.java:1409)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1536)
03-14 16:13:39.612: ERROR/AndroidRuntime(341):     ... 11 more

My Main activity:

package com.android.dbtest;




import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;


public class DatabaseTestActivity extends Activity {
/** Called when the activity is first created. */


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    }

    public void handleClick(View v){
        Intent intent = new Intent();
        intent.setClass(this, AddActivity.class);
        startActivity(intent);
    }

    public void showHandleClick(View v){
        Intent intent = new Intent();
        intent.setClass(this, ShowActivity.class);
        startActivity(intent);
    }
    }

My Show Activity (this is where i think the main error (guessing more than one) probably lies, as it is when i press the show button , that the runtime error occurs, i believe it is related to building the List):

package com.android.dbtest;

import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.util.Log;

public class ShowActivity extends DatabaseTestActivity{

private SQLiteAdapter mySQLiteAdapter;
ListView listContent = (ListView)findViewById(R.id.contentlist);

//TextView listContent = (TextView) findViewById(R.id.contentlist);

SimpleCursorAdapter cursorAdapter;
String cursor;

public static final String LOG_TAG = "dbtest";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.show);
    // TODO Auto-generated method stub

    Log.v(LOG_TAG,  "step 1");


    //output.setText(String.valueOf( WHAT I GET FROM DATABASE));


    mySQLiteAdapter = new SQLiteAdapter(this);
    mySQLiteAdapter.openToRead();

    Cursor cursor = mySQLiteAdapter.queueAll();
    startManagingCursor(cursor);
    String[] from = new String[]{SQLiteAdapter.KEY_CONTENT};
    int[] to = new int[] {R.id.text};

    Log.v(LOG_TAG, "from value:" + from );
    Log.v(LOG_TAG, "to value:" + to );

    SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);
    listContent.setAdapter(cursorAdapter);

    mySQLiteAdapter.close();

}
}

My SQLiteAdapter:

package com.android.dbtest;

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

public class SQLiteAdapter { 
public static final String MYDATABASE_NAME = "MY_DATABASE"; 
public static final String MYDATABASE_TABLE = "MY_TABLE";
public static final int MYDATABASE_VERSION = 1; 
public static final String KEY_CONTENT = "Content"; 
public static final String KEY_ID = "_id";          //primary key


//create table MY_DATABASE (ID integer primary key, Content text not null); 
private static final String SCRIPT_CREATE_DATABASE =  "create table " 
+ MYDATABASE_TABLE + " (" 
+ KEY_ID + " integer primary key autoincrement, "           
+ KEY_CONTENT + " text not null "  +
        ");"; 

private SQLiteHelper sqLiteHelper; 
private SQLiteDatabase sqLiteDatabase;
private Context context;  
public SQLiteAdapter(Context c)
{  
    context = c;
}  

public SQLiteAdapter openToRead() throws android.database.SQLException 
{ 
    sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION); 
    sqLiteDatabase = sqLiteHelper.getReadableDatabase();
    return this; 
} 
public SQLiteAdapter openToWrite() throws android.database.SQLException {
    sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
    sqLiteDatabase = sqLiteHelper.getWritableDatabase();  return this;
    }
public void close(){ 
    sqLiteHelper.close();
    } 
public long insert(String content){
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_CONTENT, content); 
    return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues);
    }  

public int deleteAll(){ 
    return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null); 
    } 



public Cursor queueAll(){
    String[] columns = new String[]{KEY_ID, KEY_CONTENT};
    Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns,     null, null, null, null, null); 
    return cursor;
}


public class SQLiteHelper extends SQLiteOpenHelper 
{  
    public SQLiteHelper(Context context, String name,    CursorFactory factory, int version) 
    {  
        super(context, name, factory, version); 
        }
    @Override  public void onCreate(SQLiteDatabase db)
    {   
        // TODO Auto-generated method stub 
        db.execSQL(SCRIPT_CREATE_DATABASE); 
        } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {  
        // TODO Auto-generated method stub  } } }
}
}
}

finally the XML file for Show:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
   <TextView android:layout_height="wrap_content" 
   android:text="TextView" 
   android:textAppearance="?android:attr/textAppearanceLarge" 
   android:layout_width="wrap_content" 
   android:id="@+id/textView1"></TextView>    

   <ListView android:id="@android:id/android:list"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"/>

 </LinearLayout>

解决方案

You can not do like that as static initializer in your activity:

ListView listContent = (ListView)findViewById(R.id.contentlist);

The reason is that you have nto yet loaded the layout for your activity and thus this call will fail findViewById(R.id.contentlist). Your error comes from the class static initializers, since you do not declare constructor of your class, still get error in the <init>.

Fix: Initialize the list view in the onCreate, after you call setContentView(R.layout.show);.

这篇关于无法证实的活动ComponentInfo - 空指针异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆