2016-12-24 118 views
-4

我在這個項目中遇到了一個大問題。 在這個項目中,我想讀取一個db數據變成一個SQLite。Android -getFileDir()導致NullPointer異常

但也有一個錯誤發生。

我把db數據(last.db)放在src→main→assets文件夾中。

Process: net.macdidi.lasttest, PID: 4829 
       java.lang.ExceptionInInitializerError 
        at net.macdidi.lasttest.MainActivity.onCreate(MainActivity.java:20) 
        at android.app.Activity.performCreate(Activity.java:6262) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2458) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2565) 
        at android.app.ActivityThread.access$900(ActivityThread.java:150) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1395) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:168) 
        at android.app.ActivityThread.main(ActivityThread.java:5821) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 
       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getFilesDir()' on a null object reference 
        at net.macdidi.lasttest.DatabaseHelper.<clinit>(SQLiteOpenHelper.java:18) 
        at net.macdidi.lasttest.MainActivity.onCreate(MainActivity.java:20)  
        at android.app.Activity.performCreate(Activity.java:6262)  
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125)  
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2458)  
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2565)  
        at android.app.ActivityThread.access$900(ActivityThread.java:150)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1395)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:168)  
        at android.app.ActivityThread.main(ActivityThread.java:5821)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)  

,這是我的代碼

class DatabaseHelper extends SQLiteOpenHelper { 
private static Context context; 
private static String DB_PATH = context.getFilesDir().getAbsolutePath(); 
private static String DB_NAME = "last.db"; 

private final Context mCtx; 
public DatabaseHelper(Context context) { 
    super(context, DB_NAME, null, 1); 
    this.mCtx = context; 
} 
public boolean createDatabase() { 
    boolean dbExist = checkDatabase(); 
    this.getReadableDatabase(); 
    if (dbExist == false) { 
     if (copyDatabase() == false) { 
      return false; 
     } 
    } 
    return true; 
} 
private boolean checkDatabase() { 
    SQLiteDatabase checkDB = null; 
    String dbpath = DB_PATH + DB_NAME; 
    try { 
     checkDB = SQLiteDatabase.openDatabase(dbpath, 
       null, SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 
     return false; 
    } 
    if (checkDB != null) { 
     checkDB.close(); 
     return true; 
    } 
    return false; 
} 
private boolean copyDatabase() { 
    try { 
     InputStream input = mCtx.getAssets().open(DB_NAME); 
     this.getReadableDatabase(); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream output = 
       new FileOutputStream(outFileName); 
     byte [] buffer = new byte[1024]; 
     int length; 
     while ((length = input.read(buffer)) > 0) { 
      output.write(buffer, 0, length); 
     } 
     output.flush(); 
     output.close(); 
     input.close(); 
    } catch (Exception e) { 
     return false; 
    } 
    return true; 
} 
public void onCreate(SQLiteDatabase db) { 
} 
public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { 
} 

}

我深深地希望有人能幫助我解決這個大問題對我來說。

+3

yeah上下文在'字符串DB_PATH = context.getFilesDir()'爲空' – 2016-12-24 19:00:11

回答

0
private static String DB_PATH = context.getFilesDir().getAbsolutePath(); 

首先,contextnull在這一點上。

其次,不要嘗試從字段初始值設定項調用從Activity繼承的方法。推遲這項工作,直到onCreate(),通常在super.onCreate()之後。

因此,與替換該行:

private static String DB_PATH; 

onCreate(),添加:

DB_PATH=getFilesDir().getAbsolutePath(); 

或者,更好的是,刪除所有代碼和use SQLiteAssetHelper

+1

可選答案:使用在onCreate中初始化的'mCtx'並移除其他上下文 –

+0

這種答案(以及你做的事實重新打開這個問題)是什麼讓SO充滿了無用的答案,這是怎麼回事(我的意思是問題和你的答案)應該在未來幫助任何人? – 2016-12-24 21:12:02

+0

@RC .:一個'NullPointerException'可以有任意數量的根本原因。 * immediate *原因(引用尚未初始化的'context'字段)很可能適合您提出的重複。然而,*底層*問題(試圖初始化之前這樣的初始化將工作)不是。在我的回答中,我涉及了兩個方面,因此,恕我直言,這增加了OP和整個網站的價值。如果您覺得您可以提供更好的答案 - 例如對生命週期的深入解釋以及初始化程序在此不起作用的原因,請隨時添加一個答案。 – CommonsWare