NullPointerException异常的android.widget.ArrayAdapter.createViewFromResource异常、android、NullPointerExcep

2023-09-06 04:00:32 作者:心不饶人嘴上甜,

我创造与preference活性的应用程序所在的目录preference项问题地分配。此应用程序工作正常,在我的仿真器,但同时我测试我的应用程序在移动它显示了这样的错误

 致命异常:主要
显示java.lang.NullPointerException
在android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
在android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
在android.widget.AbsListView.obtainView(AbsListView.java:2033)
 

这个问题就出现了,当我点击该列表preference在我的手机。在这里,这是我的code

prference.xml

 < preferenceScreen
        的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android>
    < preferenceCategory
            机器人:标题=@字符串/设置>
        <表preference
                机器人:关键=@字符串/分辨率
                机器人:标题=@字符串/ imageres
                机器人:总结=@字符串/ summaryres
                机器人:dialogTitle =@字符串/ resFormat
                />
    < / preferenceCategory>
< / preferenceScreen>
 

settings.java

 包com.example;

进口android.database.Cursor;
进口android.os.Bundle;
进口的Andr​​oid preference.List preference。
。进口的Andr​​oid preference preferenceActivity;

公共类设置来延长preferenceActivity {
    私人SQLiteoperations SQLiteAdapter;
    DTO获得;
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        得到=(DTO)getIntent()getExtras()获得(目标文件)。;
        SQLiteAdapter =新SQLiteoperations(本);
        SQLiteAdapter.openToWrite();
        加preferencesFromResource(R.xml preferences。);
        名单preference preF =(名单preference)找到preference(「决议案」);
        pref.setEntries(getEntries());
        pref.setEntryValues​​(getEntries());
        的System.out.println(设置项后);
        的System.out.println(get.getDefaultvalues​​());
        pref.setDefaultValue(get.getDefaultvalues​​());

    }
    私人的CharSequence [] getEntries(){
        光标光标= SQLiteAdapter.queueAll();
        INT NUM = cursor.getCount();
        的String []大小=新的String [数字]
        的System.out.println(cursor.getCount());
        如果(cursor.moveToFirst()){
            INT I = 0;
               做{
                   大小[I] =新字符串(cursor.getString(1)+X+ cursor.getString(2));
                   的System.out.println(cursor.getString(1)+X+ cursor.getString(2));
               }而(cursor.moveToNext());
            }
            cursor.close();

        返回的大小;
    }

}
 
Java中NullPointerException异常

camerademo.java

 包com.example;

进口java.io.ByteArrayInputStream中;
进口的java.io.InputStream;
进口java.sql.Connection中;
进口java.sql.ResultSet中;
进口java.sql.Statement中;
进口java.util.Iterator的;
进口的java.util.List;

进口oracle.jdbc.OracleResultSet;
进口oracle.sql.BLOB;

进口android.app.Activity;
进口android.app.AlertDialog;
进口android.app.Dialog;
进口android.content.DialogInterface;
进口android.content.Intent;
进口android.content.Shared preferences;
进口android.hardware.Camera;
进口android.hardware.Camera.Parameters;
进口android.hardware.Camera.PictureCallback;
进口android.hardware.Camera.ShutterCallback;
进口android.hardware.Camera.Size;
进口android.os.Bundle;
。进口的Andr​​oid preference preferenceManager。
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.FrameLayout;
进口android.widget.LinearLayout;
进口android.widget.TableRow.LayoutParams;
进口android.widget.TextView;

公共类CameraDemo延伸活动{
    私人最终诠释DIALOG_LICENSE = 5;
    私人最终诠释MENU_SETTINGS = 2;
    私人共享preferences设置;
    私有静态最后字符串变量=CameraDemo;
    摄像头摄像头;
    preVIEW preVIEW;
    按钮buttonClick,buttonSave,buttonBack;
    byte []的图像;
    私有静态SQLiteoperations placeData;
    最后DTO组=新的DTO();
    字符串defsize;
    //第一次创建活动时调用。
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);
        placeData =新SQLiteoperations(本);
        placeData.openToWrite();

        preVIEW =新的preVIEW(本);
        ((的FrameLayout)findViewById(R.id. preVIEW))addView(preVIEW)。
        buttonSave =(按钮)findViewById(R.id.Save);
        buttonBack =(按钮)findViewById(R.id.back);
        buttonBack.setVisibility(View.INVISIBLE);
        buttonSave.setVisibility(View.INVISIBLE);
        buttonClick =(按钮)findViewById(R.id.buttonClick);
        设置= preferenceManager.getDefaultShared preferences(本);
        共享preferences授予许可preF = getShared preferences(preFS,0);
        布尔licenseShown =授予许可pref.getBoolean(LicenseShown,假);
        如果(!licenseShown)
            的ShowDialog(DIALOG_LICENSE);

        buttonClick.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图v){
                preview.camera.takePicture(shutterCallback,rawCallback,
                        jpegCallback);
                buttonClick.setVisibility(View.INVISIBLE);
                buttonSave.setVisibility(View.VISIBLE);
                buttonBack.setVisibility(View.VISIBLE);
            }
        });
        buttonBack.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图v){
                背部();
            }
        });
        buttonSave.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图v){
                保存();
                }
        });

        Log.d(TAG,onCreate'd);
    }

    ShutterCallback shutterCallback =新ShutterCallback(){
        公共无效onShutter(){
            Log.d(TAG,onShutter'd);
        }
    };

    //处理对原始图像数据
    PictureCallback rawCallback =新PictureCallback(){
        公共无效onPictureTaken(byte []的数据,摄像头摄像头){
            Log.d(TAG,onPictureTaken  - 生);
        }
    };

    //处理数据的JPEG图片
    PictureCallback jpegCallback =新PictureCallback(){
        公共无效onPictureTaken(byte []的数据,摄像头摄像头){
            图像=数据;
        }
    };

    @覆盖
    在prepareDialog(INT ID,对话对话框){保护无效
        super.on prepareDialog(ID,对话);
        }
    @覆盖
    受保护的对话框onCreateDialog(INT ID){
        开关(ID){
        案例DIALOG_LICENSE:
            返回新AlertDialog.Builder(本)
            .setTitle(R.string.welcome)
            .setMessage(R.string.welcome_text)
            .setPositiveButton(R.string.accept,新DialogInterface.OnClickListener(){
                公共无效的onClick(DialogInterface对话,诠释whichButton){
                    设置= getShared preferences(preFS,0);
                    参数参数= preview.camera.getParameters();
                    大小defaultsize = parameters.getPictureSize();
                    defsize =(新的String(defaultsize.width +X+ defaultsize.height));
                    名单< Camera.Size>大小= parameters.getSupportedPictureSizes();
                    INT NUM = size.size();
                    的String [] sizeArray =新的String [数字]
                    INT I = 0;
                    迭代器<大小> SI = size.iterator();
                    而(si.hasNext()){
                        Camera.Size sizeObj =(尺寸)si.next();
                        sizeArray [我] =新的String(sizeObj.width +X+ sizeObj.height);
                        Log.e(许可证对话框大小,sizeObj.height +X+ sizeObj.width);
                        我++;
                        placeData.insert(将String.valueOf(sizeObj.width),将String.valueOf(sizeObj.height));
                    }
                    共享preferences.Editor编辑器= settings.edit();
                    editor.putBoolean(LicenseShown,真正的);
                    editor.commit();
                }
            })
            .setNegativeButton(R.string.cancel,新DialogInterface.OnClickListener(){
                公共无效的onClick(DialogInterface对话,诠释whichButton){
                    完();
                }
            })
            .setCancelable(假)
            。创建();
        }
        返回null;
    }
    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        菜单项英里;
        MI = menu.add(0,MENU_SETTINGS,0,R.string.settings);
        mi.setIcon(android.R.drawable.ic_menu_ preferences);
        返回super.onCreateOptionsMenu(菜单);
    }
    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        开关(item.getItemId()){
        案例MENU_SETTINGS:
            set.setDefaultvalues​​(defsize);
            意向意图=新的意图(getApplicationContext(),Settings.class);
            intent.putExtra(目标文件,设置);
            startActivity(意向);
            返回true;
        }
        返回super.onOptionsItemSelected(项目);
    }
公共无效回(){
    preview.camera.start preVIEW();
    buttonBack.setVisibility(View.INVISIBLE);
    buttonSave.setVisibility(View.INVISIBLE);
    buttonClick.setVisibility(View.VISIBLE);
}
@覆盖
公共无效的onDestroy(){
    super.onDestroy();
    如果(preview.camera!= NULL){
        preview.camera.stop preVIEW();
        preview.camera = NULL;
    }
}
公共无效保存(){
           背部();
            }
}
 

谁能告诉我在哪里错了?

解决方案   

谁能告诉我在哪里错了?

您没看错你的code关键是你初始化的CharSequence 数组中的 getEntries 方法。您的code:

 如果(cursor.moveToFirst()){
    INT I = 0;
    做{
       大小[I] =新字符串(cursor.getString(1)+X+ cursor.getString(2));
       的System.out.println(cursor.getString(1)+X+ cursor.getString(2));
    }而(cursor.moveToNext());
}
 

您初始化尺寸阵列与光标的大小,然后你去到while循环以上。问题是,你的while循环只设置值 I = 0 因为你不加的在这个循环的价值。出于这个原因,你的尺寸的数组将只对位置的值 0 上的所有其他职务。这将使 ArrayAdapter 抛出 NullPointerException异常

正确的循环是:

 如果(cursor.moveToFirst()){
    INT I = 0;
    做{
       大小[I] =新字符串(cursor.getString(1)+X+ cursor.getString(2));
       的System.out.println(cursor.getString(1)+X+ cursor.getString(2));
       我++;
    }而(cursor.moveToNext());
}
 

getEntries 的方法是:

 私人的CharSequence [] getEntries(){
    光标光标= SQLiteAdapter.queueAll();
    INT NUM = cursor.getCount();
    的String []大小=新的String [数字]
    的System.out.println(cursor.getCount());
    如果(cursor.moveToFirst()){
        INT I = 0;
        做 {
            大小[I] =新字符串(cursor.getString(1)+X的
                    + cursor.getString(2));
            我++;
        }而(cursor.moveToNext());
    }
    cursor.close();
    返回的大小;
}
 

I am creating a application with preference activity where the listpreference entries are problematically assigned. This application works fine on my emulator but while i test my application in mobile it shows error like this

FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
at android.widget.AbsListView.obtainView(AbsListView.java:2033)

This problem arises when i click that listpreference in my mobile. here this is my code

prference.xml

<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
            android:title="@string/settings">            
        <ListPreference
                android:key="@string/resolution"
                android:title="@string/imageres"
                android:summary="@string/summaryres"
                android:dialogTitle="@string/resFormat" 
                />
    </PreferenceCategory>
</PreferenceScreen>

settings.java

package com.example;

import android.database.Cursor;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.PreferenceActivity;

public class Settings extends PreferenceActivity {
    private SQLiteoperations SQLiteAdapter;
    DTO get;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        get = (DTO) getIntent().getExtras().get("obj");
        SQLiteAdapter = new SQLiteoperations(this);
        SQLiteAdapter.openToWrite();
        addPreferencesFromResource(R.xml.preferences);
        ListPreference pref = (ListPreference) findPreference("resolution");
        pref.setEntries(getEntries());
        pref.setEntryValues(getEntries());
        System.out.println("after set entries");
        System.out.println(get.getDefaultvalues());
        pref.setDefaultValue(get.getDefaultvalues());

    }
    private CharSequence[] getEntries() {
        Cursor cursor = SQLiteAdapter.queueAll();
        int num = cursor.getCount();
        String[] size = new String[num];
        System.out.println(cursor.getCount());
        if (cursor.moveToFirst()){
            int i=0;
               do{
                   size[i]=new String(cursor.getString(1)+"X"+cursor.getString(2));
                   System.out.println(cursor.getString(1)+"X"+cursor.getString(2));
               }while(cursor.moveToNext());
            }
            cursor.close();

        return size;
    }

}

camerademo.java

package com.example;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Iterator;
import java.util.List;

import oracle.jdbc.OracleResultSet;
import oracle.sql.BLOB;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TableRow.LayoutParams;
import android.widget.TextView;

public class CameraDemo extends Activity {
    private final int DIALOG_LICENSE=5;
    private final int MENU_SETTINGS=2;
    private SharedPreferences settings;
    private static final String TAG = "CameraDemo";
    Camera camera;
    Preview preview;
    Button buttonClick,buttonSave,buttonBack;
    byte[] image;
    private static SQLiteoperations placeData;
    final DTO set = new DTO();
    String defsize;
    // Called when the activity is first created. 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        placeData = new SQLiteoperations(this);
        placeData.openToWrite();

        preview = new Preview(this);
        ((FrameLayout) findViewById(R.id.preview)).addView(preview);
        buttonSave = (Button) findViewById(R.id.Save);
        buttonBack = (Button) findViewById(R.id.back);
        buttonBack.setVisibility(View.INVISIBLE);
        buttonSave.setVisibility(View.INVISIBLE);
        buttonClick = (Button) findViewById(R.id.buttonClick);
        settings = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences licensPref = getSharedPreferences("PREFS", 0);
        boolean licenseShown = licensPref.getBoolean("LicenseShown", false);
        if(!licenseShown)
            showDialog(DIALOG_LICENSE);

        buttonClick.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                preview.camera.takePicture(shutterCallback, rawCallback,
                        jpegCallback);
                buttonClick.setVisibility(View.INVISIBLE);
                buttonSave.setVisibility(View.VISIBLE);
                buttonBack.setVisibility(View.VISIBLE);
            }
        });
        buttonBack.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                back();
            }
        });
        buttonSave.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                save();
                }
        });

        Log.d(TAG, "onCreate'd");
    }

    ShutterCallback shutterCallback = new ShutterCallback() {
        public void onShutter() {
            Log.d(TAG, "onShutter'd");
        }
    };

    // Handles data for raw picture 
    PictureCallback rawCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            Log.d(TAG, "onPictureTaken - raw");
        }
    };

    // Handles data for jpeg picture 
    PictureCallback jpegCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            image = data;
        }
    };

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {     
        super.onPrepareDialog(id, dialog);
        }
    @Override
    protected Dialog onCreateDialog(int id) {
        switch(id){
        case DIALOG_LICENSE:
            return new AlertDialog.Builder(this)
            .setTitle(R.string.welcome)
            .setMessage(R.string.welcome_text)
            .setPositiveButton(R.string.accept, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    settings = getSharedPreferences("PREFS", 0);
                    Parameters parameters = preview.camera.getParameters();
                    Size defaultsize = parameters.getPictureSize();
                    defsize = (new String(defaultsize.width+"X"+defaultsize.height));
                    List<Camera.Size> size = parameters.getSupportedPictureSizes();
                    int num = size.size();
                    String[] sizeArray = new String[num];
                    int i=0;
                    Iterator<Size> si = size.iterator();
                    while (si.hasNext()) {
                        Camera.Size sizeObj = (Size) si.next();
                        sizeArray[i]=new String(sizeObj.width+ "X" +sizeObj.height);
                        Log.e("size in licence dialog", sizeObj.height+"x"+sizeObj.width);
                        i++;
                        placeData.insert(String.valueOf(sizeObj.width),String.valueOf(sizeObj.height));
                    }
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putBoolean("LicenseShown", true);
                    editor.commit();
                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    finish();
                }              
            })
            .setCancelable(false)
            .create();
        }
        return null;
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuItem mi;
        mi = menu.add(0, MENU_SETTINGS, 0, R.string.settings);
        mi.setIcon(android.R.drawable.ic_menu_preferences);
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case MENU_SETTINGS:
            set.setDefaultvalues(defsize);
            Intent intent = new Intent(getApplicationContext(), Settings.class);
            intent.putExtra("obj", set);
            startActivity(intent);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
public void back(){
    preview.camera.startPreview();
    buttonBack.setVisibility(View.INVISIBLE);
    buttonSave.setVisibility(View.INVISIBLE);
    buttonClick.setVisibility(View.VISIBLE);
}
@Override
public void onDestroy(){
    super.onDestroy();
    if(preview.camera != null){
        preview.camera.stopPreview();
        preview.camera = null;
    }
}
public void save(){
           back();
            }
}

Anyone please tell where i am wrong?

解决方案

Anyone please tell where i am wrong?

The thing you did wrong in your code is the way you initialize the CharSequence array in the getEntries method. Your code:

if (cursor.moveToFirst()){
    int i=0;
    do{
       size[i]=new String(cursor.getString(1)+"X"+cursor.getString(2));
       System.out.println(cursor.getString(1)+"X"+cursor.getString(2));
    }while(cursor.moveToNext());
}

You initialize the size array with the size of the Cursor and then you go in to the while loop above. The problem is that your while loop only sets the value for i = 0 as you don't increase i's value in that loop. For this reason your size array will have a value only for position 0 and null on all other positions. This will make the ArrayAdapter throw that NullPointerException.

The correct loop would be:

if (cursor.moveToFirst()){
    int i=0;
    do{
       size[i]=new String(cursor.getString(1)+"X"+cursor.getString(2));
       System.out.println(cursor.getString(1)+"X"+cursor.getString(2));
       i++;
    }while(cursor.moveToNext());
}

The full getEntries method would be:

private CharSequence[] getEntries() {
    Cursor cursor = SQLiteAdapter.queueAll();
    int num = cursor.getCount();        
    String[] size = new String[num];
    System.out.println(cursor.getCount());
    if (cursor.moveToFirst()) {         
        int i = 0;
        do {
            size[i] = new String(cursor.getString(1) + "X"
                    + cursor.getString(2));             
            i++;
        } while (cursor.moveToNext());
    }
    cursor.close();
    return size;
}