Android NullPointerException错误

Android NullPointerException错误,android,eclipse,sqlite,Android,Eclipse,Sqlite,我的日志 08-06 01:27:34.874: ERROR/AndroidRuntime(721): Uncaught handler: thread main exiting due to uncaught exception 08-06 01:27:34.893: ERROR/AndroidRuntime(721): java.lang.NullPointerException 08-06 01:27:34.893: ERROR/AndroidRuntime(721): at on

我的日志

08-06 01:27:34.874: ERROR/AndroidRuntime(721): Uncaught handler: thread main exiting due to uncaught exception
08-06 01:27:34.893: ERROR/AndroidRuntime(721): java.lang.NullPointerException
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at one.two.Booking$MyOnItemSelectedListener.onItemSelected(Booking.java:53)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.widget.AdapterView.fireOnSelected(AdapterView.java:856)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.widget.AdapterView.access$200(AdapterView.java:41)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:827)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.os.Handler.handleCallback(Handler.java:587)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.os.Looper.loop(Looper.java:123)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.app.ActivityThread.main(ActivityThread.java:3948)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at java.lang.reflect.Method.invokeNative(Native Method)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at java.lang.reflect.Method.invoke(Method.java:521)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at dalvik.system.NativeStart.main(Native Method)
Booking.java

package one.two;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;


public class Booking extends Activity
{
    private DBAdapter db; 
    private Spinner colourSpinner;
    public Cursor c;
    public TextView txtArrival;
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        db = new DBAdapter(this);
        this.setContentView(R.layout.booking);
        db.open();
        fillData();
        db.close();
        TextView txtArrival = (TextView) findViewById(R.id.txtArrival);
        Spinner colourSpinner = (Spinner) findViewById(R.id.myspinner);
        colourSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
    }

    private void fillData()
    {
        c = db.getSpinnerData();
        startManagingCursor(c);
        String[] from = new String[]{DBAdapter.KEY_ARRIVAL};
        int[] to = new int[]{android.R.id.text1};
        SimpleCursorAdapter adapter =
        new SimpleCursorAdapter(this,R.layout.booking, c, from, to );
        adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
        Spinner colourSpinner = (Spinner) findViewById(R.id.myspinner);
        colourSpinner.setAdapter(adapter);
    }
    public class MyOnItemSelectedListener implements OnItemSelectedListener
    {
        public void onItemSelected(AdapterView<?> arg0, View v,int position, long id)
        {
            boolean result = Booking.this.c.moveToPosition(position);
            if (result) {
                String title=Booking.this.c.getString(1);
                Booking.this.txtArrival.setText(title);
            }

        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0)
        {
            // TODO Auto-generated method stub

        }
    };
}
packageone.two;
导入android.app.Activity;
导入android.database.Cursor;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.SimpleCursorAdapter;
导入android.widget.Spinner;
导入android.widget.TextView;
导入android.widget.AdapterView.OnItemSelectedListener;
公共课堂预订延长活动时间
{
专用数据库适配器数据库;
私人纺纱机;
公共图书馆c;
公共文本视图txtArrival;
/**在首次创建活动时调用*/
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
db=新的DBAdapter(本);
这个.setContentView(R.layout.booking);
db.open();
fillData();
db.close();
TextView txtArrival=(TextView)findViewById(R.id.txtArrival);
微调器颜色微调器=(微调器)findViewById(R.id.myspinner);
setOnItemSelectedListener(新的MyOnItemSelectedListener());
}
私有void fillData()
{
c=db.getSpinnerData();
开始管理光标(c);
String[]from=新字符串[]{DBAdapter.KEY_ARRIVAL};
int[]to=newint[]{android.R.id.text1};
SimpleCorsorAdapter适配器=
新的SimpleCursorAdapter(this,R.layout.booking,c,from,to);
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
微调器颜色微调器=(微调器)findViewById(R.id.myspinner);
颜色微调器。设置适配器(适配器);
}
公共类MyOnItemSelectedListener实现OnItemSelectedListener
{
已选择公共位置(AdapterView arg0,视图v,内部位置,长id)
{
布尔结果=Booking.this.c.moveToPosition(位置);
如果(结果){
String title=Booking.this.c.getString(1);
Booking.this.txtArrival.setText(title);
}
}
@凌驾
未选择公共无效(AdapterView arg0)
{
//TODO自动生成的方法存根
}
};
}
我想知道如何解决这个错误。
谢谢。

看起来错误在第53行,而不是第54行

在任何情况下,您都取消了对空指针的引用。只需检查并查看哪个变量未定义,避免调用它(或确保它已正确初始化)


假设您列出了正确的行,它可能是
txtArrival
Booking。此
(我不确定您是否可以在课堂上调用

我相信您需要确保变量“C”不为空

String title=c.getString(1); txtArrival.setText(标题)


似乎是故障代码,如果c为null,那么c.getString(1)应该返回nullpointerexception,或者它可能什么也不返回,导致title为null,将txtarrival.setText设置为null也会引发错误。

第53行只有一个地方可以得到NPR:
txtarrival.setText()


我相信您忘了在布局中将TextView的ID设置为
R.ID.txtArrival
,而
(TextView)findViewById(R.ID.txtArrival)返回NULL。

您正在创建与类成员同名的局部变量。这会导致成员被本地成员隐藏,这就是为什么会出现NullPointerException。您只是没有给成员任何值,这就是它们为空的原因

您要做的是:

package one.two;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;


public class Booking extends Activity
{
    private DBAdapter db; 
    private Spinner colourSpinner;
    public Cursor c;
    public TextView txtArrival;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        db = new DBAdapter(this);
        this.setContentView(R.layout.booking);
        txtArrival = (TextView) findViewById(R.id.txtArrival); // Member assignment
        colourSpinner = (Spinner) findViewById(R.id.myspinner); // Member assignment
        db.open();
        fillData();
        db.close();
        colourSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
    }

    private void fillData()
    {
        c = db.getSpinnerData();
        startManagingCursor(c);
        String[] from = new String[]{DBAdapter.KEY_ARRIVAL};
        int[] to = new int[]{android.R.id.text1};
        SimpleCursorAdapter adapter =
        new SimpleCursorAdapter(this,R.layout.booking, c, from, to );
        adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
        // Removed this line, since members is set in onCreate
        colourSpinner.setAdapter(adapter);
    }
    public class MyOnItemSelectedListener implements OnItemSelectedListener
    {
        public void onItemSelected(AdapterView<?> arg0, View v,int position, long id)
        {
            boolean result = Booking.this.c.moveToPosition(position);
            if (result) {
                String title=Booking.this.c.getString(1);
                Booking.this.txtArrival.setText(title);
            }

        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0)
        {
            // TODO Auto-generated method stub

        }
    };
}
packageone.two;
导入android.app.Activity;
导入android.database.Cursor;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.SimpleCursorAdapter;
导入android.widget.Spinner;
导入android.widget.TextView;
导入android.widget.AdapterView.OnItemSelectedListener;
公共课堂预订延长活动时间
{
专用数据库适配器数据库;
私人纺纱机;
公共图书馆c;
公共文本视图txtArrival;
/**在首次创建活动时调用*/
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
db=新的DBAdapter(本);
这个.setContentView(R.layout.booking);
txtArrival=(TextView)findViewById(R.id.txtArrival);//成员分配
colorSpinner=(Spinner)findViewById(R.id.myspinner);//成员分配
db.open();
fillData();
db.close();
setOnItemSelectedListener(新的MyOnItemSelectedListener());
}
私有void fillData()
{
c=db.getSpinnerData();
开始管理光标(c);
String[]from=新字符串[]{DBAdapter.KEY_ARRIVAL};
int[]to=newint[]{android.R.id.text1};
SimpleCorsorAdapter适配器=
新的SimpleCursorAdapter(this,R.layout.booking,c,from,to);
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
//删除了此行,因为成员是在onCreate中设置的
颜色微调器。设置适配器(适配器);
}
公共类MyOnItemSelectedListener实现OnItemSelectedListener
{
已选择公共位置(AdapterView arg0,视图v,内部位置,长id)
{
布尔结果=Booking.this.c.moveToPosition(位置);
如果(结果){
String title=Booking.this.c.getString(1);
Booking.this.txtArrival.setText(title);
}
}
@凌驾
未选择公共无效(AdapterView arg0)
{
//TODO自动生成的方法存根
}
};
}

对不起,取消对空指针的引用是什么意思?我该怎么做?您将Booking.this从Booking的内部类调用,以引用Booking对象而不是内部对象。因此,我将其更改为?Java中的每个变量都是对