2012-06-04 77 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