我在java.lang.NullPointerException
这里遇到错误:
com.mysite.datasources.ArticlesDataSource.open(ArticlesDataSource.java:88)
代码是这样的:
public void open() throws SQLException
{
database = dbHelper.getWritableDatabase(); //this is line 88
}
它是importArticles()
从ArticlesDataSource
.
从我的调用时,这工作正常SplashScreenActivity
:
articlesDataSource = new ArticlesDataSource(context);
try {
articlesDataSource.importArticles(Section.currentSection, false);
...
但是当我尝试从我的ImportArticlesAsync
(within MainActivity
) 调用它时,我得到了NullPointerException
错误。
//This is within my MainActivity class
//...
ImportArticlesAsync importArticlesAsync = new ImportArticlesAsync(this);
importArticlesAsync.execute("");
}
private class ImportArticlesAsync extends AsyncTask<String, Void, String>
{
Context mContext;
//ProgressDialog waitSpinner;
private ArticlesDataSource articlesDataSource;
//ConfigurationContainer configuration = ConfigurationContainer.getInstance();
public ImportArticlesAsync(Context context) {
mContext = context;
//waitSpinner = new ProgressDialog(this.context);
}
@Override
protected String doInBackground(String... params)
{
//IMPORTS THE ARTICLES FROM THE RSS FEED (adds or updates)
//tried just mContext //notice
//tried mContext.getApplicationContext() //ERROR / crash
articlesDataSource = new ArticlesDataSource(mContext);
try {
articlesDataSource.importArticles(Section.currentSection, false);
} catch (Exception e) {
Toast toast = Toast.makeText(
mContext,
"NOTICE: Could not import/update " + Section.currentSection.toString() + " articles.",
Toast.LENGTH_LONG);
toast.show();
}
return null;
}
@Override
protected void onPostExecute(String result) {
//loads article from database to the list
loadArticlesIntoList(Section.currentSection);
}
}
从我读过的内容来看,大多数人认为这一定是不正确的上下文。但是 - 我还没有真正理解上下文,并且已经尝试了我能想到的所有方法(并且阅读了很多关于上下文的内容)。
我尝试对我的“代码”进行图表/更清晰的解释:
//YAY this works!
SplashScreenActivity
-LoadApplication (AsyncTask)
-doInBackground
articlesDataSource = new ArticleDataSource(context);
articlesDataSource.importArticles(Section.currentSection, false);
//BOO, this doesn't work!
MainActivity
-ImportArticlesAsync
-doInBackground (AsyncTask)
articlesDataSource = new ArticlesDataSource(context);
articlesDataSource.importArticles(Section.currentSection, false);
每个请求 - dbHelper 在这里设置:
private SQLiteDatabase database;
private DbHelper dbHelper;
private PhotosDataSource photosdatasource;
private SectionsDataSource sectionsdatasource;
public ArticlesDataSource(Context context)
{
mContext = context;
dbHelper = new DbHelper(mContext);
photosdatasource = new PhotosDataSource(context);
sectionsdatasource = new SectionsDataSource(context);
}
public void open() throws SQLException
{
database = dbHelper.getWritableDatabase();
}
代码:
com.mysite.news
- SplashScreenActivity.java - http://pastebin.com/ZaunrrzY
- MainActivity.java - http://pastebin.com/k08sDLaJ
com.mysite.models
- Article.java - http://pastebin.com/SBEqrCuw
- Photo.java - http://pastebin.com/75DVzK6Z
- Section.java - http://pastebin.com/0YYkk5JQ
com.mysite.datasources
- ArticlesDataSource.java - http://pastebin.com/bFM4G0xT
- SectionsDataSource.java - http://pastebin.com/pKZQHt9U
- PhotosDataSource.java - http://pastebin.com/sZTZd4ZP
com.mysite.utilites
- DbHelper.java - http://pastebin.com/PMCFrVyG
AndroidManifest.xml - http://pastebin.com/hHF86f4d
错误:
07-20 21:33:26.721: W/System.err(8260): java.lang.NullPointerException 07-20 21:33:26.721: W/System.err(8260): 在 android.content.ContextWrapper.openOrCreateDatabase( ContextWrapper.java:203) 07-20 21:33:26.721: W/System.err(8260): 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 07-20 21:33:26.721: W/System.err(8260): 在 com.mysite.datasources.ArticlesDataSource.open(ArticlesDataSource.java:88) 07-20 21:33:26.721: W/System.err(8260): 在 com.mysite.datasources .ArticlesDataSource.importArticles(ArticlesDataSource.java:101) 07-20 21:33:26.721: W/System.err(8260): 在 com.mysite.news.MainActivity$ImportArticlesAsync.doInBackground(MainActivity.java:194) 07- 20 21:33:26.721: W/System.err(8260): 在 com.mysite.news.MainActivity$ImportArticlesAsync.doInBackground(MainActivity.java:1) 07-20 21:33:26.721: W/System.err(8260): 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 07-20 21:33:26.721: W/System.err(8260): 在 java. util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 07-20 21:33:26.721: W/System.err(8260): at java.util.concurrent.FutureTask.run(FutureTask.java:138 ) 07-20 21:33:26.721: W/System.err(8260): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 07-20 21:33:26.721: W/System.err (8260): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 07-20 21:33:26.721: W/System.err(8260): 在 java.lang.Thread.run(线程.java:1019)721: W/System.err(8260): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 07-20 21:33:26.721: W/System.err(8260): 在 java.util .concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 07-20 21:33:26.721: W/System.err(8260): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 07-20 21:33:26.721: W/System.err(8260): 在 java.lang.Thread.run(Thread.java:1019)721: W/System.err(8260): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 07-20 21:33:26.721: W/System.err(8260): 在 java.util .concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 07-20 21:33:26.721: W/System.err(8260): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 07-20 21:33:26.721: W/System.err(8260): 在 java.lang.Thread.run(Thread.java:1019)
SectionSelectedListener.java
package com.mysite.news;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
public class SectionSelectedListener implements OnItemSelectedListener
{
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
{
MainActivity mainActivity = new MainActivity();
mainActivity.sectionSelected();
}
public void onNothingSelected(AdapterView<?> arg0) {
// Do nothing
}
}