0

重複の可能性:
ボタンをクリックするとnullpointer例外が発生します

case R.id.Button01check:
            startActivity(new Intent (SaveData.this,CheckData.class));
            break;  

これは私のCheckData.javaです

 public class CheckData extends ListActivity  {     
TextView selection;
DataManipulator dm;
private DataManipulator DataManipulator;

    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.check);
    dm = new DataManipulator(this);

    LinearLayout layout = new LinearLayout(this);
    ImageView image = new ImageView(this);
    DataManipulator = new DataManipulator(this);

    Certificates testCertificates = new Certificates(BitmapFactory.decodeFile(Context.STORAGE_SERVICE));

    DataManipulator.open();
    DataManipulator.createCertificatesEntry( (Certificates) testCertificates);
    DataManipulator.close(); 

    testCertificates = null;

    DataManipulator.open();
    testCertificates = DataManipulator.getFirstCertificatesFromDB();
    DataManipulator.close();

    image.setImageBitmap(((Certificates) testCertificates).getBitmap());

    setContentView(layout);
}

}これは29行目ですDataManipulator.createCertificatesEntry((Certificates)testCertificates);

これは私のDataManipulator.javaです

    public class DataManipulator {
public static final String KEY_IMG = "image";

 private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private static final String DATABASE_NAME = "DBtest";
    private static final int DATABASE_VERSION = 1;

    private static final String CERTIFICATES_TABLE = "certificates";

    private static final String CREATE_CERTIFICATES_TABLE = "create table "+CERTIFICATES_TABLE+" (" +KEY_IMG+" blob not null) ";

    private final Context mCtx;
    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_CERTIFICATES_TABLE);
        }

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS "+CERTIFICATES_TABLE);
            onCreate(db);
        }
    }
    public void Reset() { mDbHelper.onUpgrade(this.mDb, 1, 1); }

    public DataManipulator(Context ctx) {
        mCtx = ctx;
        mDbHelper = new DatabaseHelper(mCtx);
    }

    public DataManipulator open() throws SQLException {
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() { mDbHelper.close(); }

    public void createCertificatesEntry(Certificates certificates) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        certificates.getBitmap().compress(Bitmap.CompressFormat.PNG, 100, out);
        ContentValues cv = new ContentValues();
        cv.put(KEY_IMG, out.toByteArray());
        mDb.insert(CERTIFICATES_TABLE,  null, cv);
    }
    public Certificates getFirstCertificatesFromDB() throws SQLException {
        Cursor cur = mDb.query(true, CERTIFICATES_TABLE,  new String[] {KEY_IMG}, null, null, null, null, null, null);
        if(cur.moveToFirst()) {
            byte[] blob = cur.getBlob(cur.getColumnIndex(KEY_IMG));
            ByteArrayInputStream inputStream = new ByteArrayInputStream(blob);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            cur.close();
            return new Certificates(bitmap);
        }
        cur.close();
        return null;
    }    
}

これは60行 目のcertificates.getBitmap()。compress(Bitmap.CompressFormat.PNG、100、out);です。

これは私のlogcat出力です

06-04 11:09:41.824: E/AndroidRuntime(693): FATAL EXCEPTION: main
06-04 11:09:41.824: E/AndroidRuntime(693): java.lang.RuntimeException: Unable to start activity ComponentInfo{list.certificates/list.certificates.CheckData}: java.lang.NullPointerException
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.os.Looper.loop(Looper.java:137)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.main(ActivityThread.java:4340)
06-04 11:09:41.824: E/AndroidRuntime(693):  at java.lang.reflect.Method.invokeNative(Native Method)
06-04 11:09:41.824: E/AndroidRuntime(693):  at java.lang.reflect.Method.invoke(Method.java:511)
06-04 11:09:41.824: E/AndroidRuntime(693):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-04 11:09:41.824: E/AndroidRuntime(693):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-04 11:09:41.824: E/AndroidRuntime(693):  at dalvik.system.NativeStart.main(Native Method)
06-04 11:09:41.824: E/AndroidRuntime(693): Caused by: java.lang.NullPointerException
06-04 11:09:41.824: E/AndroidRuntime(693):  at list.certificates.DataManipulator.createCertificatesEntry(DataManipulator.java:60)
06-04 11:09:41.824: E/AndroidRuntime(693):  at list.certificates.CheckData.onCreate(CheckData.java:29)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.Activity.performCreate(Activity.java:4465)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
06-04 11:09:41.824: E/AndroidRuntime(693):  ... 11 more
4

1 に答える 1

1

certificatesあなたの場合...あなたの変数またはcertificates.getBitmap()APIのいずれかがnullを返していると言えます。

Certificates testCertificates = new Certificates(BitmapFactory.decodeFile(Context.STORAGE_SERVICE));

上記のコードdecodeFileでは、画像への完全なパスが必要です。渡すものは、ファイルへの完全なパスではありません。したがって、上記の2つのケースからcertificates.getBitmap()、例外の最も可能性の高い原因があります。Context.STORAGE_SERVICEは画像へのフルパスではありません。

画像のURIを取得したら。以下のコードを使用して画像を取得します。

Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);

Certificates testCertificates = new Certificates(bmp);

DataManipulator.open();
DataManipulator.createCertificatesEntry( (Certificates) testCertificates);
DataManipulator.close(); 

参照:

画像MediaStore

于 2012-06-04T06:07:09.553 に答える