无法证实的活动ComponentInfo - 空指针异常 [英] Unable to substantiate activity ComponentInfo - Null Pointer Exception
问题描述
我已经花了一整天试图捉摸这一个(不用说我是一个很长的路下来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:机器人=http://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屋!