배열리스트 저장을 위해 직렬화를 사용하였습니다. 그런데 저장까지는 문제없이 실행되는데.
저장된 파일을 다시 불러오려니까 뭔지 모를 오류가 발생하는 것 같습니다.
직렬화는 SaveData라는 객체를 저장합니다.
ArrayList<SaveData> saveData = null;
저장은 리스트뷰를 클릭해서 save버튼을 누르면 몇가지 정보와 함께 savefile.sav로 저장되는 형식입니다.
클릭된 리스트뷰의 번호로 배열리스트의 순서를 지정해서(itemClicked 번호), 그자리에 SaveData 객체를
add로 끼워넣습니다. 저장은 배열리스트 전체를 저장합니다.
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar c = Calendar.getInstance(); //현재날짜
String date = c.get(Calendar.YEAR) + "/" + ((c.get(Calendar.MONTH))+1) +"/" + c.get(Calendar.DATE) + " 저장됨 ";
SaveData new_saveData = new SaveData();
new_saveData.setSaveOrder("Save " + itemClicked + " \n"+ date);
new_saveData.setSaveWord(words);
new_saveData.setKeyNum(keyNum);
new_saveData.setStageNum(stageNum);
new_saveData.setEncodeScreenShot(encodeScreenShot);
saveData.remove(itemClicked);
saveData.add(itemClicked,new_saveData);
///본격직렬화 저장///
String filePath = "/sdcard/savefile.sav";
try{
FileOutputStream fos = new FileOutputStream(filePath);
BufferedOutputStream bos = new BufferedOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(saveData);
oos.close();
}catch(IOException e){
e.printStackTrace();
}
Toast.makeText(getApplicationContext(),"정상적으로 완료되었습니다",Toast.LENGTH_SHORT);
refresh();
}
});
public ArrayList<SaveData> unSerialize() {
try {
FileInputStream fis = new FileInputStream("/sdcard/savefile.sav");
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream ois = new ObjectInputStream(bis);
ArrayList<SaveData> savedata = new ArrayList<SaveData>();
savedata = (ArrayList<SaveData>) ois.readObject();
return savedata;
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}catch (ClassNotFoundException e){
e.printStackTrace();
}
Log.v("직렬화","savedata 리턴 실패");
return null;
}
문제가 되는 부분입니다.
savedata = (ArrayList<SaveData>) ois.readObject();
이 부분에서 EOFException 에러가 발생하는데, 여기저기 찾아봤지만 이게 어떤 에러인지 찾기가 힘듭니다.
영어에 약해 영어로 된 사이트는 이해가 잘 안됩니다 ...
saveData = (ArrayList<SaveData>) unSerialize();
리스트뷰에 적용시키기 위해 saveData에 적용하는 부분입니다.
이렇게 하고 실행시키면,
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.novel.aca.visualnovelproject, PID: 2674
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.novel.aca.visualnovelproject/com.novel.aca.visualnovelproject.SaveLoad}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at com.novel.aca.visualnovelproject.BaseAdapterEx.getCount(BaseAdapterEx.java:39)
at android.widget.ListView.setAdapter(ListView.java:508)
at com.novel.aca.visualnovelproject.SaveLoad.refresh(SaveLoad.java:67)
at com.novel.aca.visualnovelproject.SaveLoad.onCreate(SaveLoad.java:116)
at android.app.Activity.performCreate(Activity.java:6876)
01-12 17:46:04.470 2674-2674/com.novel.aca.visualnovelproject W/System.err: java.io.EOFException
01-12 17:46:04.470 2713-2713/? W/ResourcesManager: getTopLevelResources: /data/app/com.kakao.talk-1/base.apk / 1.0 running in com.samsung.android.game.gametools rsrc of package com.kakao.talk
01-12 17:46:04.470 2674-2674/com.novel.aca.visualnovelproject W/System.err: at java.io.DataInputStream.readByte(DataInputStream.java:77)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.novel.aca.visualnovelproject, PID: 2674
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.novel.aca.visualnovelproject/com.novel.aca.visualnovelproject.SaveLoad}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at com.novel.aca.visualnovelproject.BaseAdapterEx.getCount(BaseAdapterEx.java:39)
at android.widget.ListView.setAdapter(ListView.java:508)
at com.novel.aca.visualnovelproject.SaveLoad.refresh(SaveLoad.java:67)
at com.novel.aca.visualnovelproject.SaveLoad.onCreate(SaveLoad.java:116)
at android.app.Activity.performCreate(Activity.java:6876)
이런 예외가 발생합니다.
아마 예외가 발생함으로 인해 객체가 전달이 안되서 NullPointerException도 같이 발생하는 것 같은데
예외가 뜨는 연유를 모르겠습니다.
catch로는 IOException가 발생했다고 나옵니다.
읽어주셔서 감사합니다.
(글자 수 제한으로 예외와 에러 항목을 대부분 지웠습니다)