2012-05-29 45 views
2

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

當我點擊Checkdata按鈕我得到空指針異常的CheckData.java DataManipulator.createCertificatesEntry((證書)testCertificates);

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; 
    }  
} 

這是DataManipulator.java certificates.getBitmap()的行60壓縮(Bitmap.CompressFormat.PNG,100,出)。

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(); 

     DataManipulator.close(); 

     testCertificates = null; 

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

     image.setImageBitmap(((Certificates) testCertificates).getBitmap()); 
     setContentView(layout); 
    } 
} 

這是我的CheckData.java DataManipulator.createCertificatesEntry((證書)testCertificates)的線29;

這是我的logcat

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

您可以提供createCertificatesEntry函數的代碼,因爲testCertificates在此處爲null。 –

+0

哪裏是行號28? – Akram

+0

public void createCertificatesEntry(Certificates certificates){ \t ByteArrayOutputStream out = new ByteArrayOutputStream(); \t certificates.getBitmap()。compress(Bitmap.CompressFormat.PNG,100,out); \t ContentValues cv = new ContentValues(); \t cv.put(KEY_IMG,out.toByteArray()); \t mDb.insert(CERTIFICATES_TABLE,null,cv); \t} – samsun

回答

0

爲你傳遞 「對象testCertificates」,這是空在活動在行DataManipulator.createCertificatesEntry((證書)testCertificates);

在DataManipulator.createCertificatesEntry方法證書

是空,因此certificates.getBitmap()將thorugh這裏空指針excption

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); 
    } 

所以無論置於createCertificatesEntry方法檢查

通不DataManipulator.createCertificatesEntry中的空值使用此行從活動

Certif icates testCertificates =新證書(BitmapFactory.decodeFile(Context.STORAGE_SERVICE));

上述

DataManipulator.createCertificatesEntry((證書)testCertificates);

+0

好像我傳遞不爲空異常提出 – samsun

+0

因此您現在正在syaing中傳遞的證書createCertificatesEntry中不爲空? –

+1

我同意@DheereshSingh,嘗試使'Certificates testCertificates =新證書(BitmapFactory.decodeFile(Context.STORAGE_SERVICE));'DataManipulator.createCertificatesEntry((Certificates)testCertificates)';' – idiottiger