0

I get FATAL EXCEPTION: AsyncTask #2in my :この投稿を削除したため、doInBackground考慮しないでくださいString... urlActus

protected Void doInBackground(String... urlActus) {         

    try {

        myDbHelper.createDataBase();

    } catch (IOException ioe) {

        throw new Error("Unable to create database");

    }
} 

public void createDataBase() throws IOException{

    boolean dbExist = checkDataBase();

    if(dbExist){
        this.getWritableDatabase();
    }
    dbExist = checkDataBase();
    if (!dbExist) {
        this.getReadableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }

}

private static String DB_NAME = "externalDB";
DB_PATH="/data/data"+context.getPackageName()+"/databases/";


private void copyDataBase() throws IOException{


    InputStream myInput = myContext.getAssets().open(DB_NAME);

    String outFileName = DB_PATH + DB_NAME;

    OutputStream myOutput = new FileOutputStream(outFileName); //EROR LINE

    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    myOutput.flush();
    myOutput.close();
    myInput.close();

}

ビルドしようとしたときになぜ理解できないdoInBackground->OutputStream myOutput = new FileOutputStream(outFileName);

それは私のLogCat出力です:

05-22 14:51:22.078: E/AndroidRuntime(8400): FATAL EXCEPTION: AsyncTask #2
05-22 14:51:22.078: E/AndroidRuntime(8400): java.lang.RuntimeException: An error occured while executing doInBackground()
05-22 14:51:22.078: E/AndroidRuntime(8400):     at android.os.AsyncTask$3.done(AsyncTask.java:278)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at java.lang.Thread.run(Thread.java:856)
05-22 14:51:22.078: E/AndroidRuntime(8400): Caused by: java.lang.Error: Error copying database
05-22 14:51:22.078: E/AndroidRuntime(8400):     at com.example.savingfiles.DatabaseHelper.createDataBase(DatabaseHelper.java:67)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at com.example.savingfiles.SplashActivity$Traitement.doInBackground(SplashActivity.java:81)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at com.example.savingfiles.SplashActivity$Traitement.doInBackground(SplashActivity.java:1)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-22 14:51:22.078: E/AndroidRuntime(8400):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-22 14:51:22.078: E/AndroidRuntime(8400):     ... 5 more

この例外があります。これを回避するためにどのような解決策を講じることができますか?

4

2 に答える 2

0

(ロギングまたはデバッグ)の値を確認してみてくださいoutFileName。間違っていることがわかります。

別の推奨事項は、元の例外を非表示にしないことです。エラーに関する実際の情報を含む IOException をキャプチャしていて、それを Error クラスに渡していないため、失敗の本当の理由 (FileNotFound、権限の問題など) に関する情報が失われます。

これを使用するだけです:

       try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database",e);
        }

元の例外はネストされた例外として記録され、実際の問題を確認できます。

それが役に立てば幸い

于 2013-05-22T13:29:02.050 に答える
0

おそらく、あなたの問題は、ファイル名が正しく構成されていないように見えるという事実と同じくらい単純かもしれないと思います:

DB_PATH="/data/data"+context.getPackageName()+"/databases/";

「データ」とパッケージ名の間にスラッシュがないようです:

DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";

しかし、実際には、パスをまったくハードコーディングしないほうがよいでしょう。代わりに、これを使用します。

DB_PATH = context.getFilesDir().getAbsolutePath() + "/databases/";

パスをハードコーディングするのではなく、このようにすることが重要である理由については、私のブログ投稿をご覧ください。

最後の提案は、catchブロック内で、キャッチしているオリジナルを上書きしないIOExceptionことです。コンテキストを追加したい場合は、それで問題ありません。ただしthrow new Error("Error copying database.")、デバッグが非常に難しいものだけでなくthrow new IOException("Error copying database.", e)、元の例外も渡すものを試してください。これにより、デバッグがはるかに簡単になります。

于 2013-05-22T13:23:10.377 に答える