2012-06-04 55 views
0

可能重複:
nullpointer exception raises when i click on the button得到一個空指針異常

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 大taManipulator.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()壓縮(Bitmap.CompressFormat.PNG,100,出)。

這是我的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 

回答

1

在你的情況......我只能說要麼你certificates變量或certificates.getBitmap() api是返回null。

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

在上面的代碼decodeFile需要圖像的完整路徑。您傳遞的內容不是文件的完整路徑。所以從以上兩種情況下,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(); 

編號:

Images MediaStore

+0

更新了我的整個代碼,一旦檢查出來... – samsun

+0

我從圖庫中選擇圖像,並將其保存到數據庫 – samsun

+0

可能是,但我放在ans中的代碼並不是從圖庫中選擇文件。它只是傳遞了錯誤的路徑值。 – havexz