【问题标题】:NullPointerException errorNullPointerException 错误
【发布时间】:2010-08-06 02:54:48
【问题描述】:

我的日志猫

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

        }
    };
}

我想知道如何解决这个错误。 谢谢。

【问题讨论】:

    标签: android eclipse sqlite


    【解决方案1】:

    您正在创建与类成员同名的局部变量。这导致成员被本地成员隐藏,这就是您获得 NullPointerExceptions 的原因。您根本没有给成员任何值,这就是它们为空的原因。

    你想做的是:

    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
    
            }
        };
    }
    

    【讨论】:

    • 你在我的onCreate版本中使用过代码吗?我已经移动了 onCreate 的第 7 行和第 8 行,并删除了局部变量的创建。确保您从一开始就理解为什么有空指针,您将能够更快地解决这些问题!
    【解决方案2】:

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

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

    假设您列出了正确的行,它是 txtArrivalBooking.this(我不确定您是否可以在课堂上致电 this。)。

    【讨论】:

    • 抱歉,取消引用空指针是什么意思,我该怎么做?
    • 您从 Booking 的内部类调用 Booking.this 以引用 Booking 对象而不是内部对象。
    • 所以我会改成 Booking.this,而不是 Booking.this?
    • Java 中的每个变量都是对对象(或原语,但我离题了)的引用。如果调用 myObj.foo(),Java 首先查找 myObj 指向的对象。如果你先说“myObj=null”,那么调用 myObj.foo() 肯定会失败。这就是取消引用空指针的原因。
    【解决方案3】:

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

    字符串标题=c.getString(1); txtArrival.setText(title);

    似乎是问题代码,如果 c 为 null,则 c.getString(1) 应该返回 nullpointerexception,或者它可能不返回任何内容,导致 title 为 null,并且将 txtarrival.setText 设置为 null 应该抛出也是一个错误。

    【讨论】:

    • 那我会去解决它吗?因为我已经有了 c = db.getSpinnerData(),它在游标中有数据。
    • 添加一个 if there 检查 c 是否为 null 或 title。
    【解决方案4】:

    第 53 行只有一个地方可以获取 NPR:txtArrival.setText()

    我相信你忘记在布局中将 TextView 的 ID 设置为 R.id.txtArrival 并且 (TextView) findViewById(R.id.txtArrival); 返回 NULL。

    【讨论】:

    • 我已经做了 TextView txtArrival = (TextView) findViewById(R.id.txtArrival);在我的 oncreate 方法中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多