Android 获取空指针异常
可能重复:Android 获取空指针异常,android,Android,可能重复: 这是我的CheckData.java public class CheckData extends ListActivity { TextView selection; DataManipulator dm; private DataManipulator DataManipulator; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceS
这是我的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行DataManipular.createCertificatesEntry((证书)testCertificates)强>
这是我的DataManipular.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
在您的情况下…我只能说您的
certificates
变量或certificates.getBitmap()
api返回null
Certificates testCertificates = new Certificates(BitmapFactory.decodeFile(Context.STORAGE_SERVICE));
在上面的代码中,需要图像的完整路径。您传递的不是文件的完整路径。因此,从上述两种情况来看,certificates.getBitmap()
是异常的最可能原因。不是图像的完整路径
一旦你有了图像的Uri。使用以下代码获取图像:
Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
Certificates testCertificates = new Certificates(bmp);
DataManipulator.open();
DataManipulator.createCertificatesEntry( (Certificates) testCertificates);
DataManipulator.close();
参考:
签出后更新了我的全部代码…我正在从库中选择图像并将其保存到数据库,可能是,但我放在ans中的代码没有从库中拾取文件。它只是传递了错误的路径值。好的,但是还有其他方法吗?在屏幕上添加一个按钮,用户将单击该按钮浏览图像。将上面的代码移动到图像浏览按钮的处理程序。一旦你有了文件名,就使用它。这就是我所能说的,没有简短的回答。
Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
Certificates testCertificates = new Certificates(bmp);
DataManipulator.open();
DataManipulator.createCertificatesEntry( (Certificates) testCertificates);
DataManipulator.close();