【问题标题】:Very weird Android NullPointerException [duplicate]非常奇怪的Android NullPointerException [重复]
【发布时间】:2014-04-21 12:33:23
【问题描述】:

我一直在努力使用从我的 sqlite 数据库中检索到的数据填充 ListView, 我的数据库文件DBMainAdapter 中的代码完美运行(sn-p 以节省空间)我知道这一点,因为当我在一个单独的活动中调用我的getAll() 时,我正在使用(不包括在内)我得到我的ArrayList 和我可以很好地使用它来打印出里面的内容但是我注意到,当我尝试在我的ProfileListActivity 中做同样的事情时,我不断收到NullPointerException 抛出。我做错了什么?!

错误日志:

04-21 06:42:31.669: W/dalvikvm(6107): threadid=1: thread exiting with uncaught exception (group=0xb3a8db90)
04-21 06:42:31.749: E/AndroidRuntime(6107): FATAL EXCEPTION: main
04-21 06:42:31.749: E/AndroidRuntime(6107): Process: com.test.profilekeeper, PID: 6107
04-21 06:42:31.749: E/AndroidRuntime(6107): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.profilekeeper/com.test.profilekeeper.ProfileListActivity}: java.lang.NullPointerException
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.app.ActivityThread.access$700(ActivityThread.java:135)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.os.Handler.dispatchMessage(Handler.java:102)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.os.Looper.loop(Looper.java:137)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.app.ActivityThread.main(ActivityThread.java:4998)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at java.lang.reflect.Method.invokeNative(Native Method)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at java.lang.reflect.Method.invoke(Method.java:515)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at dalvik.system.NativeStart.main(Native Method)
04-21 06:42:31.749: E/AndroidRuntime(6107): Caused by: java.lang.NullPointerException
04-21 06:42:31.749: E/AndroidRuntime(6107):     at com.test.profilekeeper.LoadedData.<init>(LoadedData.java:17)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at com.test.profilekeeper.ProfileListActivity.onCreate(ProfileListActivity.java:23)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.app.Activity.performCreate(Activity.java:5243)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-21 06:42:31.749: E/AndroidRuntime(6107):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
04-21 06:42:31.749: E/AndroidRuntime(6107):     ... 11 more

在 com.test.profilekeeper.LoadedData.(LoadedData.java:17) 的位置:ArrayList listdata = dbhelper.getAll(); //构造函数

在 com.test.profilekeeper.ProfileListActivity.onCreate(ProfileListActivity.java:23) 的位置:LoadedData mydata = new LoadedData();

public class DBMainAdapter{
    DBMain dbhelper;

    public DBMainAdapter(Context context){
        dbhelper = new DBMain(context);
    }

    public long insertprofiledata(String fname, String lname, String age, String gender, String username, String password){
        SQLiteDatabase db = dbhelper.getWritableDatabase();
        ContentValues cv = new ContentValues();

        cv.put(DBMain.FIRSTNAME, fname);
        cv.put(DBMain.LASTNAME, lname);
        cv.put(DBMain.AGE, age);
        cv.put(DBMain.GENDER, gender);
        cv.put(DBMain.USERNAME, username);
        cv.put(DBMain.PASSWORD, password);

        long id = db.insert(DBMain.TABLE_NAME, null, cv);
        return id;
    }

    public ArrayList<String[]> getAll(){
        SQLiteDatabase db = dbhelper.getWritableDatabase();
        String[] columns = {DBMain.UID, DBMain.FIRSTNAME, DBMain.LASTNAME, DBMain.AGE, DBMain.GENDER};
        Cursor curs = db.query(DBMain.TABLE_NAME, columns, null, null, null, null, null);

        int index1 = curs.getColumnIndex(DBMain.UID);
        int index2 = curs.getColumnIndex(DBMain.FIRSTNAME);
        int index3 = curs.getColumnIndex(DBMain.LASTNAME);
        int index4 = curs.getColumnIndex(DBMain.AGE);
        int index5 = curs.getColumnIndex(DBMain.GENDER);

        StringBuffer buffer = new StringBuffer();

        while(curs.moveToNext()){
            String uid = curs.getString(index1);
            String fname = curs.getString(index2);
            String lname = curs.getString(index3);
            String age = curs.getString(index4);
            String gender = curs.getString(index5);

            buffer.append(uid+","+fname+","+lname+","+age+","+gender+" ");
        }

        String[] row = buffer.toString().split(" ");
        String profilebuilder[][] = new String[row.length][row[0].length()];

        for(int i = 0; i < row.length; i++){
            String[] profile = row[i].split(",");
            for(int j = 0; j < profile.length; j++){
                profilebuilder[i][j] = profile[j];
            }
        }

        String[] ids = new String[profilebuilder.length];
        String[] firstname = new String[profilebuilder.length];
        String[] ages = new String[profilebuilder.length];
        String[] genders = new String[profilebuilder.length];

        for(int k = 0; k < profilebuilder.length; k++){
            for(int l = 0; l < profilebuilder[0].length; l++){
                ids[k] = profilebuilder[k][0];
                firstname[k] = profilebuilder[k][1];
                ages[k] = profilebuilder[k][3];
                genders[k] = profilebuilder[k][4];
            }
        }

        ArrayList<String[]> alldata = new ArrayList<String[]>();
        alldata.add(ids);
        alldata.add(firstname);
        alldata.add(ages);
        alldata.add(genders);       

        return alldata;
    }
}

    public class LoadedData {
        DBMainAdapter dbhelper;

        String[] ids;
        String[] firstnames;
        String[] ages;
        String[] genders;

        public LoadedData(){
            ArrayList<String[]> listdata = dbhelper.getAll();

            ids =  new String[listdata.get(0).length];
            firstnames = new String[listdata.get(0).length];
            ages = new String[listdata.get(0).length];
            genders  = new String[listdata.get(0).length];

            ids = listdata.get(0);
            firstnames = listdata.get(1);
            ages = listdata.get(2);
            genders = listdata.get(3);
        }

        public String[] getIds() {
            return ids;
        }

        public String[] getFirstnames() {
            return firstnames;
        }

        public String[] getAges() {
            return ages;
        }

        public String[] getGenders() {
            return genders;
        }
    }


public class ProfileListActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LoadedData mydata = new LoadedData();
        populateListView(mydata);   
    }

    private void populateListView(LoadedData mydata) {
        ArrayAdapter<LoadedData> adapter = new MyListAdapter(mydata);
        ListView list = (ListView) findViewById(R.id.listView);
        list.setAdapter(adapter);
    }

    private class MyListAdapter extends ArrayAdapter<LoadedData>{
        LoadedData mdata;
        public MyListAdapter(LoadedData data){
            super(ProfileListActivity.this, R.layout.row);
            this.mdata = data;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View itemView = convertView;
            if(itemView == null){
                itemView = getLayoutInflater().inflate(R.layout.row, parent, false);
            }

            TextView first_name = (TextView) itemView.findViewById(R.id.nameListTextView);
            TextView id = (TextView) itemView.findViewById(R.id.idListTextView);
            TextView age = (TextView) itemView.findViewById(R.id.ageListTextView);
            ImageView img = (ImageView) itemView.findViewById(R.id.imageViewList);

            id.setText(mdata.getIds()[position]);
            first_name.setText(mdata.getFirstnames()[position]);
            age.setText(mdata.getAges()[position]);

            if(mdata.getGenders()[position].equalsIgnoreCase("Male")){
                img.setImageResource(R.raw.man_thumb);
            }else{
                img.setImageResource(R.raw.woman_thumb);
            }   

            return itemView;
        }
    }
}

【问题讨论】:

  • 初始化 DBHelper 伙伴 :)
  • @Nun'eChai 干杯! ^^
  • @CLO - 你真的可以在Public 类中写一个Private 类吗?如果是,那么您将如何实例化 Private 类?在Public 里面写一个Private 类有什么特别的原因吗?
  • @CLO - 我也不确定花括号,包装类,因为正如我现在所看到的,有几个嵌套类可能会搞砸时间。所以我的要求是你再次检查你的格式化代码,如果有任何遗漏,请纠正它。谢谢!
  • 我明白你在说什么,但实际上你可以,私有内部类是我的数组适配器,我在外部类 ProfileListActivity 的 oncreate 方法中对其进行了实例化,它运行良好。但是您的观点得到了应有的注意,我更喜欢保持常规,以避免任何难以跟踪的令人毛骨悚然的错误,尤其是在从事更大的项目时。谢谢你输入的人,我很感激。我想我刚刚成为 stackoverflow 的活跃成员..这项服务很棒!

标签: java android listview arraylist nullpointerexception


【解决方案1】:

您忘记在 LoadedData 类中初始化 dbhelper 对象。在类中创建一个公共构造函数,如下所示,

public DBMainAdapter(Context context)
{
    dbhelper = new DBMain(context);
} 

同样在DBMainAdapter类的getAll()方法中,在while循环之前写下如下语句,

curs.moveToFirst();

【讨论】:

  • 呜呜呜!!非常感谢你,我一直在关注我的数组列表本身,哈哈!我还在学习 :) 不幸的是,我的列表视图仍有问题 :( 我为你拍了一张快照,i(.)imgur(.)com/k5sbzNi(.)png
  • @CLO,对不起,我无法访问快照的链接。
  • 好吧,等一下,我会尝试不同的服务,非常感谢,你非常乐于助人和善良 :D
  • @CLO,欢迎您。由于您是该网站的新手,让我指导您,您应该如何接受答案。只需在最适合您问题的答案旁边打勾。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多