使用getAssets()从资产获取文件始终失败

时间:2014-01-03 12:43:46

标签: java android sql assets android-context

在我下面列出的代码中,方法getPieceTextFile()应返回InputStream以从指定文件中读取数据。但是,该方法总是回退到catch,因此返回null,从而导致NPE。

我已经列出了LogCat输出和下面类的代码。任何对潜在问题根源的识别都将不胜感激。

logcat的:

01-03 12:17:51.331: I/dalvikvm(589): threadid=3: reacting to signal 3
01-03 12:17:51.590: I/dalvikvm(589): Wrote stack traces to '/data/anr/traces.txt'
01-03 12:17:51.831: I/dalvikvm(589): threadid=3: reacting to signal 3
01-03 12:17:51.871: I/dalvikvm(589): Wrote stack traces to '/data/anr/traces.txt'
01-03 12:17:55.081: I/System.out(589): Asset Manager/IS not work.
01-03 12:17:55.081: W/System.err(589): java.lang.NullPointerException
01-03 12:17:55.091: W/System.err(589):  at com.lawson.englishlitrevision.ManipulateDatabase.getPieceTextFile(ManipulateDatabase.java:387)
01-03 12:17:55.091: W/System.err(589):  at com.lawson.englishlitrevision.ManipulateDatabase.<init>(ManipulateDatabase.java:398)
01-03 12:17:55.091: W/System.err(589):  at com.lawson.englishlitrevision.Novel.onCreate(Novel.java:22)
01-03 12:17:55.091: W/System.err(589):  at android.app.Activity.performCreate(Activity.java:4465)
01-03 12:17:55.091: W/System.err(589):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
01-03 12:17:55.091: W/System.err(589):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
01-03 12:17:55.091: W/System.err(589):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
01-03 12:17:55.091: W/System.err(589):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
01-03 12:17:55.091: W/System.err(589):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
01-03 12:17:55.091: W/System.err(589):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-03 12:17:55.091: W/System.err(589):  at android.os.Looper.loop(Looper.java:137)
01-03 12:17:55.101: W/System.err(589):  at android.app.ActivityThread.main(ActivityThread.java:4424)
01-03 12:17:55.101: W/System.err(589):  at java.lang.reflect.Method.invokeNative(Native Method)
01-03 12:17:55.101: W/System.err(589):  at java.lang.reflect.Method.invoke(Method.java:511)
01-03 12:17:55.101: W/System.err(589):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-03 12:17:55.101: W/System.err(589):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-03 12:17:55.101: W/System.err(589):  at dalvik.system.NativeStart.main(Native Method)
01-03 12:17:55.101: W/dalvikvm(589): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
01-03 12:17:55.121: E/AndroidRuntime(589): FATAL EXCEPTION: main
01-03 12:17:55.121: E/AndroidRuntime(589): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lawson.englishlitrevision/com.lawson.englishlitrevision.Novel}: java.lang.NullPointerException
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.os.Looper.loop(Looper.java:137)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.app.ActivityThread.main(ActivityThread.java:4424)
01-03 12:17:55.121: E/AndroidRuntime(589):  at java.lang.reflect.Method.invokeNative(Native Method)
01-03 12:17:55.121: E/AndroidRuntime(589):  at java.lang.reflect.Method.invoke(Method.java:511)
01-03 12:17:55.121: E/AndroidRuntime(589):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-03 12:17:55.121: E/AndroidRuntime(589):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-03 12:17:55.121: E/AndroidRuntime(589):  at dalvik.system.NativeStart.main(Native Method)
01-03 12:17:55.121: E/AndroidRuntime(589): Caused by: java.lang.NullPointerException
01-03 12:17:55.121: E/AndroidRuntime(589):  at java.io.Reader.<init>(Reader.java:64)
01-03 12:17:55.121: E/AndroidRuntime(589):  at java.io.InputStreamReader.<init>(InputStreamReader.java:79)
01-03 12:17:55.121: E/AndroidRuntime(589):  at com.lawson.englishlitrevision.ManipulateDatabase.<init>(ManipulateDatabase.java:398)
01-03 12:17:55.121: E/AndroidRuntime(589):  at com.lawson.englishlitrevision.Novel.onCreate(Novel.java:22)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.app.Activity.performCreate(Activity.java:4465)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
01-03 12:17:55.121: E/AndroidRuntime(589):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
01-03 12:17:55.121: E/AndroidRuntime(589):  ... 11 more
01-03 12:17:55.572: I/dalvikvm(589): threadid=3: reacting to signal 3
01-03 12:17:55.580: I/dalvikvm(589): Wrote stack traces to '/data/anr/traces.txt'
01-03 12:17:55.681: I/dalvikvm(589): threadid=3: reacting to signal 3
01-03 12:17:55.690: I/dalvikvm(589): Wrote stack traces to '/data/anr/traces.txt'

课程代码:

/**
 * Contains SQL statements and manages connections
 * 
 * @author Daniel Lawson
 * @version 29/12/13
 */
package com.lawson.englishlitrevision;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetManager;

import java.util.ArrayList;
import java.util.Scanner;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class ManipulateDatabase {

    /** String representing the name of the database */
    private static final String databaseName = "EnglishDatabase.db";

    /** Int representing the current version of the database */
    private static final int databaseVersion = 1;

    // ----------------------------------------------------------------------------------

    /**
     * String representing the table that stores the name of the piece and
     * whether it is a play or not.
     */
    private static final String pieceTable = "pieceTable";

    /**
     * String representing the table that stores the name of the point made,
     * which piece it belongs to, and which element it pertains to.
     */

    private static final String specificTable = "specificTable";

    /**
     * String representing the table that stores the element, the piece it
     * belongs to, and whether or not it is a character.
     */

    private static final String elementTable = "elementTable";

    /**
     * String representing the table that stores the quote and the point it
     * links to.
     */

    private static final String quoteTable = "quoteTable";

    /**
     * String representing the table that stores the piece and the
     * correct/incorrect responses on various dates
     */

    private static final String statsTable = "statsTable";

    // ----------------------------------------------------------------------------------

    /** String representing the piece field of the piece table */

    private static final String pieceField = "piece";

    /** String representing the type field of the piece table */

    private static final String typeField = "isPlay";

    /** String representing the point field of the specific table */

    private static final String pointField = "point";

    /** String representing the element field of the element table */

    private static final String elementField = "element";

    /** String representing the elType field of the element table */

    private static final String elTypeField = "isCharacter";

    /** String representing the quote field of the quote table */

    private static final String quoteField = "quote";

    /** String representing the ID field of the stats table */

    private static final String idField = "statId";

    /** String representing the correct field of the stats table */

    private static final String correctField = "correct";

    /** String representing the incorrect field of the stats table */

    private static final String incorrectField = "incorrect";

    /** String representing the date field of the stats table */

    private static final String dateField = "date";

    // ----------------------------------------------------------------------------------

    /** String array representing all the fields of the piece table */

    private static final String[] pieceTableFields = { pieceField, typeField };

    /** String array representing all the fields of the specific table */

    private static final String[] specificTableFields = { pointField,
            pieceField, elementField };

    /** String array representing all the fields of the quote table */

    private static final String[] quoteTableFields = { quoteField, pointField };

    /** String array representing all the fields of the element table */

    private static final String[] elementTableFields = { elementField,
            pieceField, elTypeField };

    /** String array representing all the fields of the stats table */

    private static final String[] statsTableFields = { idField, pieceField,
            correctField, incorrectField, dateField };

    // ----------------------------------------------------------------------------------

    /** SQL statement to create the piece table. */

    private static final String createPieceTable = "CREATE TABLE " + pieceTable
            + " (" + pieceField + " TEXT NOT NULL PRIMARY KEY, " + typeField
            + " INTEGER);";

    /** SQL statement to create the specific table. */

    private static final String createSpecificTable = "CREATE TABLE "
            + specificTable + "(" + pointField + " TEXT NOT NULL PRIMARY KEY,"
            + pieceField + " TEXT NOT NULL," + elementField + " TEXT NOT NULL)";

    /** SQL statement to create the quotes table. */

    private static final String createQuoteTable = "CREATE TABLE " + quoteTable
            + "(" + quoteField + " TEXT NOT NULL PRIMARY KEY," + pointField
            + " TEXT NOT NULL PRIMARY KEY)";

    /** SQL statement to create the element table. */

    private static final String createElementTable = "CREATE TABLE "
            + elementTable + "(" + elementField + " TEXT NOT NULL PRIMARY KEY,"
            + pieceField + " TEXT NOT NULL," + elTypeField + " INTEGER)";

    /** SQL statement to create the stats table. */

    private static final String createStatsTable = "CREATE TABLE " + statsTable
            + "(" + idField + " INTEGER PRIMARY KEY," + pieceField
            + " TEXT NOT NULL," + correctField + " INTEGER," + incorrectField
            + " INTEGER," + dateField + " DATE)";

    // ----------------------------------------------------------------------------------

    /**
     * SQL statement to search the piece table - replace [columnName] and
     * [value] with field to be searched and what value to look for.
     */

    private static final String searchPieceTable = "SELECT * FROM "
            + pieceTable + " WHERE [columnName] = '[value]';";

    /**
     * SQL statement to search the specific table - replace [columnName] and
     * [value] with field to be searched and what value to look for.
     */

    private static final String searchSpecificTable = "SELECT * FROM "
            + specificTable + " WHERE [columnName] = '[value]'";

    /**
     * SQL statement to search the quote table - replace [columnName] and
     * [value] with field to be searched and what value to look for.
     */

    private static final String searchQuoteTable = "SELECT * FROM "
            + quoteTable + " WHERE [columnName] = '[value]'";

    /**
     * SQL statement to search the element table - replace [columnName] and
     * [value] with field to be searched and what value to look for.
     */

    private static final String searchElementTable = "SELECT * FROM "
            + elementTable + " WHERE [columnName] = '[value]'";

    /**
     * SQL statement to search the stats table - replace [columnName] and
     * [value] with field to be searched and what value to look for.
     */

    private static final String searchStatsTable = "SELECT * FROM "
            + statsTable + " WHERE [columnName] = '[value]'";

    // ----------------------------------------------------------------------------------

    /**
     * SQL statement to update the piece table - replace [assignValues] and
     * [condition] with items to be altered + their new values and the condition
     * where if true, this change should be applied.
     */

    private static final String updatePieceTable = "UPDATE " + pieceTable
            + " SET [assignValues] WHERE [condition]";

    /**
     * SQL statement to update the specific table - replace [assignValues] and
     * [condition] with items to be altered + their new values and the condition
     * where if true, this change should be applied.
     */

    private static final String updateSpecificTable = "UPDATE " + specificTable
            + " SET [assignValues] WHERE [condition]";

    /**
     * SQL statement to update the quote table - replace [assignValues] and
     * [condition] with items to be altered + their new values and the condition
     * where if true, this change should be applied.
     */

    private static final String updateQuoteTable = "UPDATE " + quoteTable
            + " SET [assignValues] WHERE [condition]";

    /**
     * SQL statement to update the element table - replace [assignValues] and
     * [condition] with items to be altered + their new values and the condition
     * where if true, this change should be applied.
     */

    private static final String updateElementTable = "UPDATE " + elementTable
            + " SET [assignValues] WHERE [condition]";

    /**
     * SQL statement to update the stats table - replace [assignValues] and
     * [condition] with items to be altered + their new values and the condition
     * where if true, this change should be applied.
     */

    private static final String updateStatsTable = "UPDATE " + statsTable
            + " SET [assignValues] WHERE [condition]";

    // ----------------------------------------------------------------------------------

    /**
     * SQL statement to delete from the piece table - replace [condition] the
     * condition where if true, this deletion should be applied.
     */

    private static final String deleteFromPieceTable = "DELETE FROM "
            + pieceTable + " WHERE [condition]";

    /**
     * SQL statement to delete from the specific table - replace [condition] the
     * condition where if true, this deletion should be applied.
     */

    private static final String deleteFromSpecificTable = "DELETE FROM "
            + specificTable + " WHERE [condition]";

    /**
     * SQL statement to delete from the quote table - replace [condition] the
     * condition where if true, this deletion should be applied.
     */

    private static final String deleteFromQuoteTable = "DELETE FROM "
            + quoteTable + " WHERE [condition]";

    /**
     * SQL statement to delete from the element table - replace [condition] the
     * condition where if true, this deletion should be applied.
     */

    private static final String deleteFromElementTable = "DELETE FROM "
            + elementTable + " WHERE [condition]";

    /**
     * SQL statement to delete from the stats table - replace [condition] the
     * condition where if true, this deletion should be applied.
     */

    private static final String deleteFromStatsTable = "DELETE FROM "
            + statsTable + " WHERE [condition]";

    // ----------------------------------------------------------------------------------

    /**
     * SQL statement to insert into the piece table - replace [values] with the
     * values to be inserted.
     */

    private static final String insertIntoPieceTable = "INSERT INTO "
            + pieceTable + " VALUES ([values])";

    /**
     * SQL statement to insert into the specific table - replace [values] with
     * the values to be inserted.
     */

    private static final String insertIntoSpecificTable = "INSERT INTO "
            + specificTable + " VALUES ([values])";

    /**
     * SQL statement to insert into the quote table - replace [values] with the
     * values to be inserted.
     */

    private static final String insertIntoQuoteTable = "INSERT INTO "
            + quoteTable + " VALUES ([values])";

    /**
     * SQL statement to insert into the element table - replace [values] with
     * the values to be inserted.
     */

    private static final String insertIntoElementTable = "INSERT INTO "
            + elementTable + " VALUES ([values])";

    /**
     * SQL statement to insert into the quote table - replace [values] with the
     * values to be inserted.
     */

    private static final String insertIntoStatsTable = "INSERT INTO "
            + statsTable + " VALUES ([values])";

    // ----------------------------------------------------------------------------------

    /**
     * SQLiteDatabase representing the English database
     */

    private SQLiteDatabase dataBase;

    /**
     * Instance of DatabaseHelper class utilised to 'access' database
     */

    private DatabaseHelper baseHelper;

    /**
     * Content of the Database Manipulator (ManipulateDatabase class)
     */

    private Activity context;

    /**
     * Boolean to store whether or not this is the first time this base/version
     * has been launched
     */

    private boolean initialLaunch = false;

    /**
     * File for the BufferedReader to read into Database
     */

    private File pieceList;

    /**
     * Method to get pieceText file from assets for BufferedReader to use
     * 
     * @throws IOException
     */

    private InputStream getPieceTextFile(Context ctx) throws IOException {

        try {
            AssetManager manager = ctx.getAssets();
            InputStream is = manager.open("pieceText.txt");
            return is;
        } catch (Exception e) {
            System.out.println("Asset Manager/IS not work.");
            e.printStackTrace();
            return null;
        }
    }

    private BufferedReader pieceScan = new BufferedReader(
            new InputStreamReader(getPieceTextFile(this.context), "UTF-8"));

    /*
     * private File specificList = new File("specificList.txt");
     * 
     * private BufferedReader specificScan = new BufferedReader(new FileReader(
     * "specificList.txt"));
     * 
     * private File elementList = new File("elementList.txt");
     * 
     * private BufferedReader elementScan = new BufferedReader(new FileReader(
     * "elementList.txt"));
     * 
     * private File quoteList = new File("quoteList.txt");
     * 
     * private BufferedReader quoteScan = new BufferedReader(new FileReader(
     * "quoteList.txt"));
     */
    /**
     * Method to open the database
     */

    private void openSesame() {
        try {
            dataBase = baseHelper.getWritableDatabase();
        } catch (SQLiteException e) {
            System.out.println("Database couldn't be opened");
            e.printStackTrace();
        }
    }

    /**
     * Method to close the database
     */

    private void closeSesame() {
        baseHelper.close();
    }

    public ArrayList<String> getPieces(String typePiece) {
        try {
            openSesame();
            ArrayList<String> pieces = new ArrayList<String>();
            String command = searchPieceTable
                    .replace("[columnName]", typeField);
            command = command.replace("[value]", typePiece);

            Cursor cursor = dataBase.rawQuery(command, null);
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                pieces.add(cursor.getString(cursor.getColumnIndex(pieceField)));
                cursor.moveToNext();
            }
            closeSesame();
            return pieces;
        } catch (SQLiteException e) {
            e.printStackTrace();
            System.out.println("SQL Problem");
            ArrayList<String> defaultReturn = new ArrayList<String>();
            defaultReturn.add("There is is default item.");
            defaultReturn.add("Because the proper ArrayList");
            defaultReturn.add("Wasn't filled properly");
            return defaultReturn;
        }
    }

    public ArrayList<String> getAllPieces() {

        try {
            openSesame();
            ArrayList<String> allPieces = new ArrayList<String>();
            String instruction = "SELECT * FROM pieceTable";

            Cursor cursor = dataBase.rawQuery(instruction, null);
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                allPieces.add(cursor.getString(cursor
                        .getColumnIndex(pieceField)));
                cursor.moveToNext();
            }

            closeSesame();
            return allPieces;
        } catch (Exception e) {
            e.printStackTrace();
            ArrayList<String> defaultList = new ArrayList<String>();
            defaultList.add("Catch default");
            return defaultList;
        }

    }

    /**
     * Constructor
     * 
     * @param contextIn
     *            Context of the MainpuxlateDatabase class
     * @throws IOException
     */

    public ManipulateDatabase(Activity contextIn) throws IOException {
        baseHelper = new DatabaseHelper(contextIn);
        context = contextIn;
        openSesame();
        String line;
        String x;
        String pieceName;
        String isDrama;
        String point;
        String element;
        String quote;
        String isCharacter;
        int commaPoint;
        int commaPoint2;

        if (true) {
            while ((x = pieceScan.readLine()) != null) {
                line = pieceScan.readLine();
                System.out.println(line);
                commaPoint = line.indexOf(",");
                pieceName = line.substring(0, commaPoint);
                isDrama = line.substring(commaPoint + 1, line.length() - 1);
                ContentValues pv = new ContentValues();
                pv.put(pieceField, pieceName);
                pv.put(typeField, isDrama);
                dataBase.insert(pieceTable, null, pv);

                System.out.println("DAMN YOU MORONIC CRETIN!!");
            }

            /*
             * while ((x = specificScan.readLine()) != null) { line =
             * specificScan.readLine(); System.out.println(line); commaPoint =
             * line.indexOf(","); point = line.substring(0, commaPoint);
             * commaPoint2 = (line .substring(commaPoint + 1, line.length() - 1)
             * .indexOf(",")); pieceName = line.substring(commaPoint + 1,
             * commaPoint2); element = line.substring(commaPoint2 + 1,
             * line.length() - 1);
             * 
             * ContentValues sv = new ContentValues(); sv.put(pointField,
             * point); sv.put(pieceField, pieceName); sv.put(elementField,
             * element); dataBase.insert(specificTable, null, sv); } while ((x =
             * elementScan.readLine()) != null) { line = elementScan.readLine();
             * System.out.println(line); commaPoint = line.indexOf(","); element
             * = line.substring(0, commaPoint); commaPoint2 = (line
             * .substring(commaPoint + 1, line.length() - 1) .indexOf(","));
             * pieceName = line.substring(commaPoint + 1, commaPoint2);
             * isCharacter = line .substring(commaPoint2 + 1, line.length() -
             * 1);
             * 
             * ContentValues ev = new ContentValues(); ev.put(elementField,
             * element); ev.put(pieceField, pieceName); ev.put(elTypeField,
             * isCharacter); dataBase.insert(elementTable, null, ev);
             * 
             * } while ((x = quoteScan.readLine()) != null) { line =
             * quoteScan.readLine(); System.out.println(line); commaPoint =
             * line.indexOf(","); quote = line.substring(0, commaPoint); point =
             * line.substring(commaPoint + 1, line.length() - 1);
             * 
             * ContentValues qv = new ContentValues(); qv.put(quoteField,
             * quote); qv.put(pointField, point); dataBase.insert(quoteTable,
             * null, qv); }
             */

        }

    }

    // ----------------------------------------------------------------------------------

    /**
     * Database helper - Three basic methods - required database tasks
     * 
     * @author Daniel Lawson
     * @version 30/12/13
     */

    private class DatabaseHelper extends SQLiteOpenHelper {

        private DatabaseHelper(Context theContext) {
            super(theContext, databaseName, null, databaseVersion);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(createPieceTable);
                /*
                 * db.execSQL(createSpecificTable);
                 * db.execSQL(createQuoteTable); db.execSQL(createElementTable);
                 * db.execSQL(createStatsTable);
                 */
                initialLaunch = true;

            } catch (SQLiteException e) {
                System.out.println("Failed to create table(s)");
                e.printStackTrace();
            }

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + pieceTable);
            db.execSQL("DROP TABLE IF EXISTS " + specificTable);
            db.execSQL("DROP TABLE IF EXISTS " + quoteTable);
            db.execSQL("DROP TABLE IF EXISTS " + elementTable);
            db.execSQL("DROP TABLE IF EXISTS " + statsTable);
            onCreate(db);

        }

    }
}

1 个答案:

答案 0 :(得分:0)

private BufferedReader pieceScan = new BufferedReader(
        new InputStreamReader(getPieceTextFile(this.context), "UTF-8"));

此类初始化代码在实例化类时运行。 this.contextnull。这显示在logcat in

01-03 12:17:55.091: W/System.err(589):  at com.lawson.englishlitrevision.ManipulateDatabase.getPieceTextFile(ManipulateDatabase.java:387)
01-03 12:17:55.091: W/System.err(589):  at com.lawson.englishlitrevision.ManipulateDatabase.<init>(ManipulateDatabase.java:398)

其中<init>指的是构造函数和成员变量初始化。您在构造函数中初始化context,但构造函数仅在成员变量初始化后运行。

只需将pieceScan初始化移动到构造函数。