有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android:使用属性时出现空指针异常

我使用一个公共类将两条信息保存到一个数组中(这样我就可以很容易地获得名称和ID)。然而出于某种原因,它似乎不喜欢它

我在线路上遇到以下错误:-

AssetDetails.ID = f.getString(f.getColumnIndex("AssetObsID"));

Null pointer access: The variable details can only be null at this location

出现错误的代码是:

public static List<clsNameID> assetHelperTypes(){
    Log.e("Asset Helper Types:", "Started");
    clsNameID AssetDetails = null;
    List<clsNameID> mHelperNames = new ArrayList<clsNameID>();
    File dbfile = new File(Global.currentDBfull); 

    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
    Cursor f = db.rawQuery("select * from assetobservationtypes", null);  
    Log.e("Asset Helper Types:", "Cursor run");
        if(f.getCount() != 0) {
         f.moveToFirst();
            while(!f.isAfterLast()) {
                Log.e("Asset Helper Types:", "Finding Items");

                AssetDetails.ID = f.getString(f.getColumnIndex("AssetObsID"));
                AssetDetails.Name = f.getString(f.getColumnIndex("Observation"));

                mHelperNames.add(AssetDetails);
                Log.e("Asset Helper Types:", "Added Items");
            }
        }
    f.close();

    return mHelperNames;
}

类别clsNameID:-

package com.directenquiries.assessment.tool;

public class clsNameID {
    public String Name;
    public String ID;

}

我试着用以下方式来称呼它:

 public void addCondition(View view){


        List<clsNameID> mHelperNames = DBFunctions.assetHelperTypes();


        final List<Integer> mSelectedItems = new ArrayList<Integer>();

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("My Title")
                .setMultiChoiceItems(mHelperNames.toArray(new CharSequence[mHelperNames.size()]), null,
                        new DialogInterface.OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which, boolean isChecked) {
                                if (isChecked) {

                                    mSelectedItems.add(which);
                                } else if (mSelectedItems.contains(which)) {

                                    mSelectedItems.remove(Integer
                                            .valueOf(which));
                                }
                            }
                        })

               .setPositiveButton("Save", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int id) {
                        //Create onlcick method
                   }
               })
               .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int id) {
                        //Create onlcick method
                   }
               });
        builder.show();

}

共 (2) 个答案

  1. # 1 楼答案

    您没有通过调用new操作符来创建clsNameID的对象,这就是对象AssetDetails为空的原因。我刚刚添加了线条来创建对象。。查看我的评论“添加此行…”的行

    public static List<clsNameID> assetHelperTypes(){
        Log.e("Asset Helper Types:", "Started");
        clsNameID AssetDetails = null;
        List<clsNameID> mHelperNames = new ArrayList<clsNameID>();
        File dbfile = new File(Global.currentDBfull); 
    
        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
        Cursor f = db.rawQuery("select * from assetobservationtypes", null);  
        Log.e("Asset Helper Types:", "Cursor run");
            if(f.getCount() != 0) {
             f.moveToFirst();
                while(!f.isAfterLast()) {
                              //add this line....
                              AssetDetails     = new clsNameID();
                    Log.e("Asset Helper Types:", "Finding Items");
    
                    AssetDetails.ID = f.getString(f.getColumnIndex("AssetObsID"));
                    AssetDetails.Name = f.getString(f.getColumnIndex("Observation"));
    
                    mHelperNames.add(AssetDetails);
                    Log.e("Asset Helper Types:", "Added Items");
                }
            }
        f.close();
    
        return mHelperNames;
    }
    

    希望对你有帮助

  2. # 2 楼答案

    首先,Java中的类名应该以大写字母开头,因此您的自定义类应该被称为ClsNameID。此外,变量应该以小写字母开头,因此您所调用的AssetDetails引用应该是assetDetails,同样地IDName

    一旦进行了这些更改,那么更明显的是,当您访问IDName字段时,它是在类的实例上执行的,而不是在类的static属性上执行的。比较两段代码:

    clsNameID AssetDetails = null;
    ...
    AssetDetails.ID = f.getString(f.getColumnIndex("AssetObsID"));
    AssetDetails.Name = f.getString(f.getColumnIndex("Observation"));
    

    ClsNameID assetDetails = null;
    ...
    assetDetails.id = f.getString(f.getColumnIndex("AssetObsID"));
    assetDetails.name = f.getString(f.getColumnIndex("Observation"));
    

    更容易看到的是,在编写第二组代码时出现了错误,因为assetDetails显然应该是一个实例,而第一组代码是模糊和混乱的

    要解决您的问题,您应该按照其他海报中的说明进行操作,并在尝试使用之前创建类的实例:

    ClsNameID assetDetails = new ClsNameID();