2017-08-26 139 views
0

删除以前的数据后,应用程序在第一次运行时运行良好。它在第二次运行时崩溃,并且必须从sharedprefs中获取已保存的信息(我使用HashSets保存了它)。尝试保存数据时出错

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 <>(组);)之后的应用程序崩溃

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的示出了该

那的代码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); 

,并确保这些线路

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); 

在空字符串集的情况下返回null,通过设置断点和调试做到这一点。

相关问题