2011-09-21 32 views
0

如果我嘗試實例化並在我的活動外使用我的應用程序DBAdapter,則會得到拋出的異常。我想在一個簡單的工具/輔助類,我做了使用它:Android - DBAdapter外活動拋出異常

public class MyClass 
{ 
    Context context; 
    DBAdapter db; 

    public MyClass(Context c) 
    { 
    // Get the application context that is passed to the class 
    context = c; 

    // Instantiate the database using the application context 
    db = new DBAdapter(context); 

    // Open the database and do something 
    db.open(); // <---- Exception thrown here 
    db.dosomething(); 
    db.close(); 
    } 
} 

我這樣調用

public class MainActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    MyClass whatever = new MyClass(this); 
    } 
} 

這裏MyClass的是我將對DBAdapter,非常簡單,典型的任何Android的SQLite教程:

public class DBAdapter 
{ 
    private final Context context; 
    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    public DBAdapter(Context c) 
    { 
    context = c; 
    DBHelper = new DatabaseHelper(context); 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
    public DatabaseHelper(Context context) 
    { 
     super(context, MY_DATABASE_NAME_HERE, null, 1); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     try 
     { 
     db.execSQL(/*CREATE TABLE CODE HERE*/); 
     } 
     catch (Exception e) 
     { 
     e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     /* UPDATE CODE HERE */ 
    } 
    } 

    public DBAdapter open() throws SQLException 
    { 
    db = DBHelper.getWritableDatabase(); 
    return this; 
    } 

    public void close() 
    { 
    DBHelper.close(); 
    } 

    public void dosomething() 
    { 
    // code here 
    } 

    // Other database abstraction layer methods down here... 
} 

最後,例外。在我看來,db對象是空或無效的或什麼時候我創建它。但似乎我做得對。我正在傳遞正確的應用程序/活動上下文。

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.whatever.mysqltest/com.whatever.mysqltest.MainActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at com.whatever.whatever.DBAdapter.open(DBAdapter.java:71) 
    at com.whatever.whatever.whatever.<init>(whatever.java:56) 
    at com.whatever.mysqltest.MainActivity.onCreate(MainActivity.java:22) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
    ... 11 more 

或者,如果我叫了db對象從活動中,一切都很好...

public class MainActivity extends Activity 
{ 
    DBAdapter db; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    db = new DBAdapter(this); 
    db.open(); // <--- does NOT thrown an exception. 
    db.dosomething(); 
    db.close(); 
    } 
} 

這裏什麼是我的問題嗎?

+0

也許您的上下文爲空? –

回答

1

您的'MyClass'正在等待上下文,但您正在傳遞一個活動。嘗試將上下文傳遞給構造函數,如下所示:

MyClass whatever = new MyClass(getContext()); 
+1

活動從Context繼承,所以@Jakobud具有的是正確的。 – WindsurferOak