2016-12-24 349 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