2017-08-26 17 views
0

以前のデータを削除した後、最初の実行時にアプリが正常に動作します。 2回目に実行されたときにクラッシュし、sharedprefsから保存された情報を取得する必要がありました(これをHashSetsで保存しました)。データを保存しようとするとエラーが発生する

08-26 17:11:00.745 7730-7730/com.example.adam.vaistai E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.example.adam.vaistai, PID: 7730 
                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.adam.vaistai/com.example.adam.vaistai.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference 

logcatはのコード厥この

を示す

SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.adam.vaistai", Context.MODE_PRIVATE); 

HashSet<String> set = (HashSet<String>) sharedPreferences.getStringSet("names", null); 

HashSet<String> numberSet = (HashSet<String>) sharedPreferences.getStringSet("numbers", null); 

HashSet<String> descSet = (HashSet<String>) sharedPreferences.getStringSet("desc", null); 

if (set == null){ 
    vaistai.add("Pavyzdys 2017-08-18"); 
    numbers.add(String.valueOf(0)); 
    description.add("Nuo persalimo, vartoti 3 kartus dienoje"); 

} else { 

    vaistai = new ArrayList<>(set); 
    //error 
    numbers = new ArrayList<>(numberSet); 
    description = new ArrayList<>(descSet); 

} 

使用ログ私はアプリケーションのクラッシュライン(vaistai =新しいArrayListを<>(セット))後ことを見出しMainActivity.java

package com.example.adam.vaistai; 

import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteStatement; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Set; 

public class MainActivity extends AppCompatActivity { 

ListView listView; 

static ArrayList<String> vaistai = new ArrayList<>(); 
static ArrayList<String> numbers = new ArrayList<>(); 
static ArrayList<String> description = new ArrayList<>(); 

static ArrayAdapter arrayAdapter; 


public void nextActivity (int pos){ 

    Intent intent = new Intent(this, SecondActivity.class); 

    intent.putExtra("index", pos); 

    startActivity(intent); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater menuInflater = getMenuInflater(); 

    menuInflater.inflate(R.menu.main_menu, menu); 

    return super.onCreateOptionsMenu(menu); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    super.onOptionsItemSelected(item); 

    if (item.getItemId() == R.id.newNote){ 

     vaistai.add(""); 
     numbers.add(String.valueOf(0)); 
     description.add(""); 

     arrayAdapter.notifyDataSetChanged(); 

     nextActivity(vaistai.size()-1); 
    } 
    return false; 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listView = (ListView) findViewById(R.id.listView); 

    SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.adam.vaistai", Context.MODE_PRIVATE); 

    HashSet<String> set = (HashSet<String>) sharedPreferences.getStringSet("names", null); 

    HashSet<String> numberSet = (HashSet<String>) sharedPreferences.getStringSet("numbers", null); 

    HashSet<String> descSet = (HashSet<String>) sharedPreferences.getStringSet("desc", null); 

    if (set == null){ 
     vaistai.add("Pavyzdys 2017-08-18"); 
     numbers.add(String.valueOf(0)); 
     description.add("Nuo persalimo, vartoti 3 kartus dienoje"); 

    } else { 

     vaistai = new ArrayList<>(set); 
     numbers = new ArrayList<>(numberSet); 
     description = new ArrayList<>(descSet); 

    } 

    arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, vaistai); 

    listView.setAdapter(arrayAdapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

      nextActivity(i); 

     } 
    }); 

    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { 

      final int item = i; 

      new AlertDialog.Builder(MainActivity.this) 
        .setIcon(android.R.drawable.alert_dark_frame) 
        .setTitle("Ar norite istrinti?") 
        .setMessage("Irasas bus pasalintas") 
        .setPositiveButton("Taip", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 

          vaistai.remove(item); 
          numbers.remove(item); 
          description.remove(item); 
          arrayAdapter.notifyDataSetChanged(); 

          SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.adam.vaistai", Context.MODE_PRIVATE); 

          HashSet<String> numberSet = new HashSet<String>(MainActivity.numbers); 

          sharedPreferences.edit().putStringSet("numbers", numberSet).apply(); 

          HashSet<String> set = new HashSet<String>(MainActivity.vaistai); 

          sharedPreferences.edit().putStringSet("names", set).apply(); 

          HashSet<String> descSet = new HashSet<String>(MainActivity.description); 

          sharedPreferences.edit().putStringSet("desc", descSet).apply(); 
         } 
        } 
        ) 
        .setNegativeButton("Ne", null) 
        .show(); 

      return true; 
     } 
    }); 

} 

}

答えて

0

セットはコレクションです。セットをリストに追加するには、次の行を使用してみてください。 addallメソッドは、コレクションを要求します。また

vaistai.addAll(set); 

は、空の文字列のセットの場合はnullを返却する

HashSet<String> set = (HashSet<String>) sharedPreferences.getStringSet("names", null); 

HashSet<String> numberSet = (HashSet<String>) sharedPreferences.getStringSet("numbers", null); 

HashSet<String> descSet = (HashSet<String>) sharedPreferences.getStringSet("desc", null); 

これらの行は、ブレークポイントの設定およびデバッグすることによってこれを行うことを確認してください。

関連する問題