Ошибка сканера - попытка вызвать виртуальный метод для ссылки на пустой объект - PullRequest
0 голосов
/ 23 октября 2018

Этот код просто читает файлы, которые являются совершенными и правильными, но оба условия if & else if дают мне ошибку: Scanner error - Attempt to invoke virtual method on a null object reference

  public void read(Map<String,String> dictionary,List<String> word){
        word = new ArrayList<>();
        dictionary = new HashMap();
        if(!FILE) {
            Scanner sc = new Scanner(getResources().openRawResource(R.raw.word2));
            Scanner sc2 = new Scanner(getResources().openRawResource(R.raw.def2));
            try {
                Scanner sc4 = new Scanner(openFileInput("addword.txt"));
                Scanner sc5 = new Scanner(openFileInput("adddef.txt"));
                while (sc4.hasNextLine() && sc5.hasNextLine()) {
                    String a = sc4.nextLine();
                    String b = sc5.nextLine();
                    dictionary.put(a, b);
                    word.add(a);
                }
                sc4.close();
                sc5.close();
            } catch (Exception e) {

            }
            while (sc.hasNextLine() && sc2.hasNextLine()) {
                String a = sc.nextLine();
                String b = sc2.nextLine();
                dictionary.put(a, b);
                word.add(a);
            }
            sc.close();
            sc2.close();
        }
        else if(FILE) {

              Scanner scan = new Scanner(getResources().openRawResource(R.raw.easy));
              while (scan.hasNextLine()) {
                    String a = scan.nextLine();
                    if (!a.equals("")) {
                        String arr[] = a.split("~");
                        dictionary.put(arr[0], arr[1]);
                        word.add(arr[0]);
                    }}
                scan.close();
}}}

журнал ошибок выглядит следующим образом:

Причина: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.content.res.Resources android.content.Context.getResources ()' для ссылки на пустой объект в android.content.ContextWrapper.getResources (ContextWrapper.java:89) в android.view.ContextThemeWrapper.getResourcesInternal (ContextThemeWrapper.java:127) в android.view.ContextThemeWrapper.getResources (ContextThemeWrapper.java:121) в android.support.getRasAccess.App.App.App.(AppCompatActivity.java:542) на com.example.ankitrath.WordTrivia.Settings.read (Settings.java:37) на com.example.ankitrath.WordTrivia.GameActivity.onCreate (GameActivity.java:51)

Settings.java:37 относится к строке под *.метод используется здесь следующим образом

ListView list;
ArrayAdapter<String> adap;
List<String> word = new ArrayList<>();
Map<String,String> dictionary;
private String que="",ans="";
int counter=0;
private int hi = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);//will hide the title
    getSupportActionBar().hide(); //hide the title bar
    dictionary = new HashMap<>();


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);


    ((ListView)findViewById(R.id.listid))
    .setBackgroundResource(R.drawable.bglist);
    Settings o = new Settings();
    o.read(dictionary,word);

1 Ответ

0 голосов
/ 24 октября 2018

Исключение ясно.

Причина: java.lang.NullPointerException: попытка вызвать виртуальный метод

....

android.support.v7.app.AppCompatActivity.getResources (AppCompatActivity.java:542) на com.example.ankitrath.WordTrivia.Settings.read (Settings.java:37)

Он сообщает, что вы пытаетесьиспользуйте Context, то есть null.

Почему это null?

Эта строка класса Settings:

Scanner sc = new Scanner(getResources().openRawResource(R.raw.word2));

когда вы вызываете метод getResources() как метод класса Settings, это говорит нам о том, что класс Settings расширяет класс Activity.

Если это правда, вы должны изменить класс Settingsиз наследования Activity, чтобы сделать его, содержит Activity как член класса Settings.Например:

public class Settings {

    private final Activity activity;

    public Settings(Activity activity){
        this.activity = activity;
    }

    ...

}

Кроме того, вам нужно будет реорганизовать все вызовы, связанные с методами деятельности, такими как getResources(), например:

Scanner sc = new Scanner(activity.getResources().openRawResource(R.raw.word2));

Это определенно вам поможет.Но, как я могу догадаться, класс Settings - это реальная деятельность, которую вы, вероятно, используете в своем приложении, поэтому вам, вероятно, потребуется извлечь весь код, связанный с методом read(), в отдельный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...