Android: исключение NullPointerException при чтении текстового файла

Я пытаюсь написать приложение-переводчик для Android и хочу прочитать текстовый файл. Однако я всегда получаю исключение NullpointerException, пытаясь прочитать файл. Я поместил текстовый файл в папку с ресурсами, но я думаю, что приложение не может его найти :( Мой код:

(Это код моего класса VocabTrainer из строки 160: (vocsE, vocsG — это LinkedLists и vocMapE, vocMapG — это HasMaps как поля VocabTrainer))

try{
        AssetManager manager;
        manager = currentContext.getAssets();
        InputStream input = manager.open("vocabs.txt");
        InputStreamReader inputReader = new InputStreamReader(input);

        BufferedReader reader = new BufferedReader(inputReader);
        String word = null;

        while ((word = reader.readLine()) != null) {
            //Splitts the given String when there is given " " 
            String[] wordSplit = word.split(" ");

            vocsE.add(wordSplit[0]);
            vocsG.add(wordSplit[1]);

            vocMapE.put(wordSplit[0], wordSplit[1]);
            vocMapG.put(wordSplit[1], wordSplit[0]);
        }
        reader.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }

И вот трассировка logcat:

04-18 17:24:27.204: E/AndroidRuntime(1736): java.lang.RuntimeException: Unable to    
instantiate activity  
ComponentInfo{de.dbgeppelheim.dbgvocab/de.dbgeppelheim.dbgvocab.TrainingActivity}: 
java.lang.NullPointerException
04-18 17:24:27.204: E/AndroidRuntime(1736):     at  
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
android.app.ActivityThread.access$600(ActivityThread.java:141)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at    
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
android.os.Handler.dispatchMessage(Handler.java:99)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
android.os.Looper.loop(Looper.java:137)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at    
android.app.ActivityThread.main(ActivityThread.java:5039)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
java.lang.reflect.Method.invokeNative(Native Method)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at  
java.lang.reflect.Method.invoke(Method.java:511)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at    
dalvik.system.NativeStart.main(Native Method)
04-18 17:24:27.204: E/AndroidRuntime(1736): Caused by: java.lang.NullPointerException
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
android.content.ContextWrapper.getResources(ContextWrapper.java:89)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
de.dbgeppelheim.functionality.VocabTrainer.initialise(VocabTrainer.java:167)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
de.dbgeppelheim.functionality.VocabTrainer.<init>(VocabTrainer.java:40)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
de.dbgeppelheim.dbgvocab.TrainingActivity.<init>(TrainingActivity.java:25)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at  
java.lang.Class.newInstanceImpl(Native Method)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
java.lang.Class.newInstance(Class.java:1319)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
android.app.Instrumentation.newActivity(Instrumentation.java:1054)
04-18 17:24:27.204: E/AndroidRuntime(1736):     at   
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
04-18 17:24:27.204: E/AndroidRuntime(1736):     ... 11 more

person user2296122    schedule 18.04.2013    source источник
comment
Можете ли вы попробовать проверить, существует ли файл, прежде чем пытаться его открыть? Возможно, проблема с путями?   -  person James Oravec    schedule 18.04.2013
comment
Файл находится в начале в папке с ресурсами, поэтому он должен существовать. Может быть, проблема с экспортом, когда приложение должно запускаться с эмулятором?   -  person user2296122    schedule 18.04.2013
comment
Опубликуйте свою трассировку logcat   -  person Pragnani    schedule 18.04.2013
comment
VocabTrainer.java принадлежит вам? если ваш, можете ли вы показать нам, что находится в строке 167 и вокруг?   -  person user902383    schedule 18.04.2013
comment
Я добавил код выше. Строка 167: InputStreamReader inputReader = new InputStreamReader(input);   -  person user2296122    schedule 18.04.2013


Ответы (2)


Этот вопрос объясняет, как сделать то, что вы пытаетесь сделать. Выполните эти шаги, затем вернитесь, если это все еще не работает.

Чтение простого текстового файла

person NathanTempelman    schedule 18.04.2013
comment
Хорошо, тогда я постараюсь помочь. Где находится этот раздел кода? Это в текущей деятельности? Текущий контекст необходим для доступа к текстовому файлу, и он доступен только в действии. Если этот код находится в файле библиотеки без действий или в чем-то, что не расширяет действие, вам придется передать контекст, когда вы вызываете его из действия. - person NathanTempelman; 18.04.2013
comment
Да, это не действие, но я передаю его конструктору другого класса, который использует его в качестве аргумента для метода (который должен читать файл) - person user2296122; 18.04.2013
comment
Где-то там, вероятно, ваша проблема. Android действительно раздражает для такого рода вещей. Попробуйте включить этот метод в действие, просто чтобы проверить его. Если он там работает, значит что-то не так с прохождением вашего контекста. Дайте мне знать, как это происходит. - person NathanTempelman; 18.04.2013
comment
Вместо этого попробуйте этот метод: поместите файл в каталог /res/raw, где файл будет проиндексирован и доступен по идентификатору в файле R: InputStream is = getResources().openRawResource(R.raw.vocabs); Затем посмотрите, можете ли вы читать из этого входного потока. - person NathanTempelman; 18.04.2013
comment
Попробуйте это в своей основной деятельности. Просто посмотреть, будет ли это работать. Если этого не происходит, то с вашим проектом что-то не так или вы что-то делаете не так. Попробуйте выполнить точные шаги в вопросе, который я вам связал. - person NathanTempelman; 19.04.2013
comment
Спасибо! Я только что попробовал это с новым проектом, и он работает. Но я понятия не имею, почему тот же код не работает в моем другом проекте... - person user2296122; 19.04.2013
comment
Да, это что-то ужасно неправильное с вашим вариантом проекта Android. Попробуйте перейти в Файл->Инструменты Android->Исправить свойства проекта. Иногда это исправляет. - person NathanTempelman; 19.04.2013
comment
Хорошо, теперь я изменил концепцию своих классов, и теперь это работает... безумно :D Спасибо всем за поддержку :) - person user2296122; 19.04.2013

попробуйте поместить его в папку res. И перезапустить. Если это по-прежнему не работает, выполните отладку, если проблема вызвана ошибкой «Файл не найден».

person Lance    schedule 18.04.2013
comment
Только что попробовал с папкой res, но тоже не работает :( - person user2296122; 18.04.2013