Objekt in Datei speichern wirft immer ne Exception

  • 17 Antworten
  • Letztes Antwortdatum
B

Bolic

Neues Mitglied
0
Hallo,

vorweg: ich bin noch Androidneuling und in manchen Belängen vielleicht sogar ein Javaneuling...

Mein Problem: Ich würde gerne eine ArrayList<Obj> in eine Datei speichern. Nun hab ich mich da was durch google gekämpft und hab dann nun einen Lösungsansatz. Doch leider wirft der jedes mal in den beiden try catches ne Exception. Woran liegt das? Suche auch die ganze Zeit schon dannach, wie die Dateiendung bei dem OutputStream lauten muss... finde aber nichts...Vielleicht ist das ja ein Fehler. Bin für jede Hilfe dankbar.

Hier meine Klasse, die sowohl die ArrayList speichert und lädt.

Code:
package com.example.listtest03;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

import android.app.Activity;
import android.util.Log;

public class SaveLoad extends Activity{

	private ArrayList<Item> itemList;
	private static final String TAG = MainActivity.class.getSimpleName();
	private static final String FILENAME = TAG +".txt";
	
	public SaveLoad(){
		itemList = new ArrayList<Item>();
	}
	
	public ArrayList<Item> getList(){
		return itemList;
	}
	public void save(ArrayList<Item> list){
		FileOutputStream fos = null;
		ObjectOutputStream os = null;
		try{
			fos = openFileOutput(FILENAME, MODE_PRIVATE);
			os = new ObjectOutputStream(fos);
			os.writeObject(list);
			os.close();
		}catch (Throwable t){
			Log.d(TAG, "SAVE failed");
		}
	}
	@SuppressWarnings("unchecked")
	public ArrayList<Item> load(){
		FileInputStream fis = null;
		ObjectInputStream is = null;
		try{
			fis = openFileInput(FILENAME);
			is = new ObjectInputStream(fis);
			itemList = (ArrayList<Item>) is.readObject();
			is.close();
		}catch (Throwable t){
			Log.d(TAG, "LOAD failed");
		}
		return itemList;
	}
}
 
Mit Catch fängt man die evt. vorkommenden Fehler ab, also sowas wie Exception t brauchste da ;)
 
Achso, vielleicht hab ich das was blöd ausgedrückt. Das Programm stürtzt nicht ab, aber es geht halt eben immer ins catch, weil es eben nen Fehler gibt.... Also ist eben irgendwo ein Fehler den ich aber nicht sehe
 
Wenn du auch noch Javaneuling bist, versuche es mal mit folgendem:

Anstatt
Code:
		}catch (Throwable t){
			Log.d(TAG, "SAVE failed");
		}

benutzt du
Code:
		}catch (Exception ex){
			Log.d(TAG, ex.toString());
		}

und bevor jemand meckert :D : Ich weiß nicht auswendig welche Exceptions da geworfen werden können, deswegen allgemein und den Trace brauch er denke ich auch erstmal nicht, sondern es ist erstmal wichtig zu wissen, was für eine Exception überhaupt geworfen wird.

EDIT: Und dann natürlich in den Log gucken und uns mal sagen, was überhaupt der Fehler ist.
 
Implementiert dein Item das Serializable-Interface?
 
Danke für die beiden Tipps.

Das item implementierte natürlich nicht Serializable ^^. Behebt den Fehler aber nicht.

Hab nun auch mal mir die Exception als String ausgegeben lassen und es ist ein Nullpointer Exception

Weiß nun nicht ob es das bringt, wenn ich euch hier mal die LogCat reinhaue ^^

Code:
04-04 17:17:57.878: W/SurfaceFlinger(36): createScreenshotSurface failed (Function not implemented)
04-04 17:17:57.878: I/ActivityManager(274): Config changes=1480 {1.0 310mcc260mnc en_US ldltr sw360dp w640dp h335dp 320dpi nrml long land finger qwerty/v/v -nav/h s.10}
04-04 17:17:57.896: I/InputReader(274): Reconfiguring input devices.  changes=0x00000004
04-04 17:17:57.896: I/InputReader(274): Device reconfigured: id=0, name='qwerty2', size 1280x720, orientation 0, mode 1, display id 0
04-04 17:17:57.906: I/InputReader(274): Reconfiguring input devices.  changes=0x00000004
04-04 17:17:57.906: I/InputReader(274): Device reconfigured: id=0, name='qwerty2', size 1280x720, orientation 0, mode 1, display id 0
04-04 17:17:58.006: D/MainActivity(855): SAVE......java.lang.NullPointerException
04-04 17:17:58.146: D/dalvikvm(643): GC_FOR_ALLOC freed 12999K, 74% free 4809K/18136K, paused 66ms, total 73ms
04-04 17:17:58.166: I/dalvikvm-heap(643): Grow heap (frag case) to 10.922MB for 6410576-byte allocation
04-04 17:17:58.257: D/dalvikvm(643): GC_FOR_ALLOC freed 1K, 39% free 11068K/18136K, paused 86ms, total 86ms
04-04 17:17:58.276: W/ResourceType(855): Skipping entry 0x7f040000 in package table 0 because it is not complex!
04-04 17:17:58.276: W/ResourceType(855): Skipping entry 0x7f040000 in package table 0 because it is not complex!
04-04 17:17:58.276: W/ResourceType(855): Skipping entry 0x7f040000 in package table 0 because it is not complex!
04-04 17:17:58.276: W/ResourceType(855): Skipping entry 0x7f040000 in package table 0 because it is not complex!
04-04 17:17:58.276: W/ResourceType(855): Skipping entry 0x7f040000 in package table 0 because it is not complex!
04-04 17:17:58.356: D/dalvikvm(643): GC_CONCURRENT freed <1K, 39% free 11068K/18136K, paused 4ms+10ms, total 104ms
04-04 17:17:58.426: D/dalvikvm(855): GC_FOR_ALLOC freed 210K, 6% free 5544K/5876K, paused 58ms, total 89ms
04-04 17:17:58.436: I/dalvikvm-heap(855): Grow heap (frag case) to 6.601MB for 1127536-byte allocation
04-04 17:17:58.506: D/dalvikvm(855): GC_CONCURRENT freed 11K, 5% free 6633K/6980K, paused 6ms+24ms, total 70ms
04-04 17:17:58.596: D/MainActivity(855): LOAD......java.lang.NullPointerException
04-04 17:17:58.626: I/Choreographer(855): Skipped 63 frames!  The application may be doing too much work on its main thread.
04-04 17:17:58.686: E/SurfaceFlinger(36): ro.sf.lcd_density must be defined as a build property
04-04 17:17:59.026: D/dalvikvm(643): GC_FOR_ALLOC freed <1K, 39% free 11068K/18136K, paused 75ms, total 75ms
04-04 17:17:59.076: I/dalvikvm-heap(643): Grow heap (frag case) to 17.464MB for 6860816-byte allocation
04-04 17:17:59.136: D/dalvikvm(643): GC_CONCURRENT freed 0K, 3% free 17769K/18136K, paused 5ms+11ms, total 45ms
04-04 17:17:59.136: D/dalvikvm(643): WAIT_FOR_CONCURRENT_GC blocked 40ms
04-04 17:18:01.646: D/dalvikvm(274): GC_EXPLICIT freed 499K, 31% free 6447K/9252K, paused 10ms+8ms, total 113ms
04-04 17:18:14.102: D/ExchangeService(656): Received deviceId from Email app: null
04-04 17:18:14.102: D/ExchangeService(656): !!! deviceId unknown; stopping self and retrying
04-04 17:18:19.206: D/ExchangeService(656): !!! EAS ExchangeService, onStartCommand, startingUp = false, running = false
04-04 17:18:19.206: W/ActivityManager(274): Unable to start service Intent { act=com.android.email.ACCOUNT_INTENT } U=0: not found
04-04 17:18:19.206: D/ExchangeService(656): !!! Email application not found; stopping self
04-04 17:18:19.216: W/ActivityManager(274): Unable to start service Intent { act=com.android.email.ACCOUNT_INTENT } U=0: not found
04-04 17:18:19.226: E/ActivityThread(656): Service com.android.exchange.ExchangeService has leaked ServiceConnection com.android.emailcommon.service.ServiceProxy$ProxyConnection@40d26e08 that was originally bound here
04-04 17:18:19.226: E/ActivityThread(656): android.app.ServiceConnectionLeaked: Service com.android.exchange.ExchangeService has leaked ServiceConnection com.android.emailcommon.service.ServiceProxy$ProxyConnection@40d26e08 that was originally bound here
04-04 17:18:19.226: E/ActivityThread(656): 	at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:969)
04-04 17:18:19.226: E/ActivityThread(656): 	at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:863)
04-04 17:18:19.226: E/ActivityThread(656): 	at android.app.ContextImpl.bindService(ContextImpl.java:1418)
04-04 17:18:19.226: E/ActivityThread(656): 	at android.app.ContextImpl.bindService(ContextImpl.java:1407)
04-04 17:18:19.226: E/ActivityThread(656): 	at android.content.ContextWrapper.bindService(ContextWrapper.java:473)
04-04 17:18:19.226: E/ActivityThread(656): 	at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:157)
04-04 17:18:19.226: E/ActivityThread(656): 	at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:145)
04-04 17:18:19.226: E/ActivityThread(656): 	at com.android.emailcommon.service.AccountServiceProxy.getDeviceId(AccountServiceProxy.java:116)
04-04 17:18:19.226: E/ActivityThread(656): 	at com.android.exchange.ExchangeService.getDeviceId(ExchangeService.java:1249)
04-04 17:18:19.226: E/ActivityThread(656): 	at com.android.exchange.ExchangeService$7.run(ExchangeService.java:1856)
04-04 17:18:19.226: E/ActivityThread(656): 	at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:551)
04-04 17:18:19.226: E/ActivityThread(656): 	at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:549)
04-04 17:18:19.226: E/ActivityThread(656): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-04 17:18:19.226: E/ActivityThread(656): 	at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-04 17:18:19.226: E/ActivityThread(656): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-04 17:18:19.226: E/ActivityThread(656): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-04 17:18:19.226: E/ActivityThread(656): 	at java.lang.Thread.run(Thread.java:856)
04-04 17:18:19.236: E/StrictMode(656): null
04-04 17:18:19.236: E/StrictMode(656): android.app.ServiceConnectionLeaked: Service com.android.exchange.ExchangeService has leaked ServiceConnection com.android.emailcommon.service.ServiceProxy$ProxyConnection@40d26e08 that was originally bound here
04-04 17:18:19.236: E/StrictMode(656): 	at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:969)
04-04 17:18:19.236: E/StrictMode(656): 	at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:863)
04-04 17:18:19.236: E/StrictMode(656): 	at android.app.ContextImpl.bindService(ContextImpl.java:1418)
04-04 17:18:19.236: E/StrictMode(656): 	at android.app.ContextImpl.bindService(ContextImpl.java:1407)
04-04 17:18:19.236: E/StrictMode(656): 	at android.content.ContextWrapper.bindService(ContextWrapper.java:473)
04-04 17:18:19.236: E/StrictMode(656): 	at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:157)
04-04 17:18:19.236: E/StrictMode(656): 	at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:145)
04-04 17:18:19.236: E/StrictMode(656): 	at com.android.emailcommon.service.AccountServiceProxy.getDeviceId(AccountServiceProxy.java:116)
04-04 17:18:19.236: E/StrictMode(656): 	at com.android.exchange.ExchangeService.getDeviceId(ExchangeService.java:1249)
04-04 17:18:19.236: E/StrictMode(656): 	at com.android.exchange.ExchangeService$7.run(ExchangeService.java:1856)
04-04 17:18:19.236: E/StrictMode(656): 	at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:551)
04-04 17:18:19.236: E/StrictMode(656): 	at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:549)
04-04 17:18:19.236: E/StrictMode(656): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-04 17:18:19.236: E/StrictMode(656): 	at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-04 17:18:19.236: E/StrictMode(656): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-04 17:18:19.236: E/StrictMode(656): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-04 17:18:19.236: E/StrictMode(656): 	at java.lang.Thread.run(Thread.java:856)
04-04 17:18:19.236: W/ActivityManager(274): Unbind failed: could not find connection for android.os.BinderProxy@41230c50
04-04 17:18:19.246: E/ActivityThread(656): Service com.android.exchange.ExchangeService has leaked ServiceConnection com.android.emailcommon.service.ServiceProxy$ProxyConnection@40d26a40 that was originally bound here
04-04 17:18:19.246: E/ActivityThread(656): android.app.ServiceConnectionLeaked: Service com.android.exchange.ExchangeService has leaked ServiceConnection com.android.emailcommon.service.ServiceProxy$ProxyConnection@40d26a40 that was originally bound here
04-04 17:18:19.246: E/ActivityThread(656): 	at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:969)
04-04 17:18:19.246: E/ActivityThread(656): 	at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:863)
04-04 17:18:19.246: E/ActivityThread(656): 	at android.app.ContextImpl.bindService(ContextImpl.java:1418)
04-04 17:18:19.246: E/ActivityThread(656): 	at android.app.ContextImpl.bindService(ContextImpl.java:1407)
04-04 17:18:19.246: E/ActivityThread(656): 	at android.content.ContextWrapper.bindService(ContextWrapper.java:473)
04-04 17:18:19.246: E/ActivityThread(656): 	at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:157)
04-04 17:18:19.246: E/ActivityThread(656): 	at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:145)
04-04 17:18:19.246: E/ActivityThread(656): 	at com.android.emailcommon.service.ServiceProxy.test(ServiceProxy.java:191)
04-04 17:18:19.246: E/ActivityThread(656): 	at com.android.exchange.ExchangeService$7.run(ExchangeService.java:1850)
04-04 17:18:19.246: E/ActivityThread(656): 	at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:551)
04-04 17:18:19.246: E/ActivityThread(656): 	at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:549)
04-04 17:18:19.246: E/ActivityThread(656): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-04 17:18:19.246: E/ActivityThread(656): 	at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-04 17:18:19.246: E/ActivityThread(656): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-04 17:18:19.246: E/ActivityThread(656): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-04 17:18:19.246: E/ActivityThread(656): 	at java.lang.Thread.run(Thread.java:856)
04-04 17:18:19.256: E/StrictMode(656): null
04-04 17:18:19.256: E/StrictMode(656): android.app.ServiceConnectionLeaked: Service com.android.exchange.ExchangeService has leaked ServiceConnection com.android.emailcommon.service.ServiceProxy$ProxyConnection@40d26a40 that was originally bound here
04-04 17:18:19.256: E/StrictMode(656): 	at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:969)
04-04 17:18:19.256: E/StrictMode(656): 	at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:863)
04-04 17:18:19.256: E/StrictMode(656): 	at android.app.ContextImpl.bindService(ContextImpl.java:1418)
04-04 17:18:19.256: E/StrictMode(656): 	at android.app.ContextImpl.bindService(ContextImpl.java:1407)
04-04 17:18:19.256: E/StrictMode(656): 	at android.content.ContextWrapper.bindService(ContextWrapper.java:473)
04-04 17:18:19.256: E/StrictMode(656): 	at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:157)
04-04 17:18:19.256: E/StrictMode(656): 	at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:145)
04-04 17:18:19.256: E/StrictMode(656): 	at com.android.emailcommon.service.ServiceProxy.test(ServiceProxy.java:191)
04-04 17:18:19.256: E/StrictMode(656): 	at com.android.exchange.ExchangeService$7.run(ExchangeService.java:1850)
04-04 17:18:19.256: E/StrictMode(656): 	at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:551)
04-04 17:18:19.256: E/StrictMode(656): 	at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:549)
04-04 17:18:19.256: E/StrictMode(656): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-04 17:18:19.256: E/StrictMode(656): 	at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-04 17:18:19.256: E/StrictMode(656): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-04 17:18:19.256: E/StrictMode(656): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-04 17:18:19.256: E/StrictMode(656): 	at java.lang.Thread.run(Thread.java:856)
04-04 17:18:19.276: W/ActivityManager(274): Unbind failed: could not find connection for android.os.BinderProxy@41247738

Das kommt alles, wenn die App schon gestartet war und ich den Bildschirm drehe. Genau dann soll er nämlich speichern und wieder laden.
 
FileOutputStream fos = null;
...
fos = openFileOutput(FILENAME, MODE_PRIVATE);

Und du bekommst eine nullReferenceException?
...kein Wunder...
 
Hm, wenn ich wüsste warum es kein Wunder ist, würde ich nicht fragen, oder?

Verstehe leider nicht, worauf du hinaus willst. Hilf mir mal bitte auf die Sprünge.
 
schau dir an was eine nullreferenzexcepion ist, bzw was sie auslöst.
Außerdem wäre interessant zu wissen was openFileOutput zurück liefert.
 
Warum quatscht du eigentlich so drumherum und sagst nicht mal konkret woran es liegt?

Ich verstehs nämlich auch nicht. Nullpointer Exception entstehen immer dann, wenn man Methoden auf ein Objekt aufrufen will, dass aber noch gar nicht erzeugt wurde, daher gibt die IDE keine Warnung, weil der definierte Typ der Variable diese Methode besitzt, aber es kommt zur Laufzeit zu einem Fehler, weil der Pointer noch auf kein Objekt zeigt.

Wenn ich das also mal durchgehe mit dem kleinen Stück zitierten Code von dir:
FileOutputStream fos = null; => Die Variable fos wird deklariert mit dem Tyen FileOutputStream
...
fos = openFileOutput(FILENAME, MODE_PRIVATE); => fos referenziert auf ein Objekt vom Typen FileOutputStream. Auf fos wird nichts aufgerufen = alles OK. Die Parameter FILENAME ist ein statischer String, der ebenfalls keinen Null Wert besitzt. MODE_PRIVATE ist ein vorgegebener konstanter Wert (0x00000000) = alles OK. openFileOutput ist eine Methode, die den FileOutputStream zurückgibt und ist definiert in Context, wobei Activity eine Unterklasse von Context darstellt = alles OK.

Code:
public abstract FileOutputStream openFileOutput (String name, int mode)

Open a private file associated with this Context's application package for writing. Creates the file if it doesn't already exist.

Returns
FileOutputStream Resulting output stream.

Kurz gesagt: Ich versteh nicht worauf du hinaus willst. NullPointerException gibts nur bei Zugriffe auf Objekten. Erste Zeile hat keinen Zugriff, zweite Zeile hat nur einen mit der Methode "openFileOutput", die in der Vererbungshierarchie drin ist, FILENAME wurde auch initialisiert mit einem Wert != null und MODE_PRIVATE ist eine vordefinierte Konstante, die ebenfalls in der Vererbungshierarchie initialisiert wurde.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Punisher
... wenn jemand ohne eigeninitiative die eigene problemstellung von anderen gelöst bekommt wird er nie versuchen zuerst in der hilfe / google zu suchen was das problem war und warum es aufgetreten ist.
wenn sich aber jemand bemüht die probleme zuerst zu analysieren, bzw versteht warum sie aufrteten, können >80% sinnloser posts im forum ersparrt werden da bei etwas eigeninitiative klar ist warum der fehler auftritt und wie er behoben werden kann.

und nullPointerException werden nicht geworfen wenn objekte nicht erzeugt, sondern nicht INSTANZIERT werden und auf sie zugegriffen wird.
und das "fos" objekt wurde zwar erzeugt, aber nicht instanziert.
daher auch die beiden von mir geposteten zeilen aus dem code.
... würde man jetzt nachschauen und wissen wann eine nullPointerException kommt, und den unterschied zwischen objekt erzeugen und instanzieren wissen, wüsste man das das fos objekt nicht mit "null", sondern (hab grad kein Eclipse zu hand) mit:
"... fos = new FileOutputStream();"
erstellt und isntanziert werden muss.

würde "openFileOutput" eine neue INSTANZ vom typ fileOutputStream zurück liefert würde das problem auch nicht auftreten da das "fos" objekt durch die mehtode openFileOutput instanziert werden würde.


... sollte es daran nicht liegen nehme ich alles zurück und behaupte das gegenteil ;-)
hab wie gesagt grad kein Eclipse zur hand.
 
???
Eine Instanz ist eine konkrete Ausprägung eines gegebenen Schemas. Die Instanziierung, bzw. das Verb dazu, bedeutet daher eine konkrete Ausprägung eines gegebenen Schemas, in unserem Fall einer Klasse, zu erzeugen. Daher ist die Objekterzeugung damit gleich zu setzen.

fos ist kein Objekt! fos ist eine Referenz auf ein Objekt mit dem Typ FileOutputStream. Da er zu Beginn diese Referenz auf "null" zeigen lässt (nicht korrekt ausgedrückt), haben wir einen NullPointer vorerst. Die bloße Deklaration von "FileOutputStream fos;" oder "FileOutputStream fos = null;" ist, wie du auch immer dazwischen unterscheiden willst, weder Instanziierung noch Erzeugung eines Objekts. Welches Objekt sollte dort auch schon erzeugt werden? Es sind genauso mögliche Untertypen als konkrete Ausprägung möglich.

Desweiteren scheints du den Code "fos = openFileOutput(FILENAME, MODE_PRIVATE);" überhaupt gar nicht zu verstehen. Ich weise der Referenzvariable "fos" einen neuen Wert bzw. hier viel eher ein neuem Objekt zu und zwar mit Hilfe der openFileOutput Methode, dessen Rückgabe ein FileOutputStream ist. openFileOutput bekommt als Parameter NICHT fos und wird desweiteren auf dem "this" Objekt aufgerufen, es besteht also gar keine andere Möglichkeit als das openFileOutput eine neue Instanz eines FileOutputstream zurückgibt, weil die Methode von "fos" keine Kenntnis hat.

EDIT: Ich weiß nicht aus welcher "Welt" du kommst, aber ich weiß das teilweise in C++ zur Objekterzeugung die bloße Deklaration reicht z.B. eines vector, aber das hier ist Java ohne "new" keine Instanziierung/Erzeugung.

EDIT2: Und falls du mir nicht glauben magst, kannst du gerne mal googlen. Dort wirst du öfter sowas finden wie "Ein Initialisierer für eine Instanz-Variable wird bei jeder Instanzierung ( Objekterzeugung) der Klasse ausgewertet." Daher Instanziierung = Objekterzeugung.

EDIT3:
Da der Threadersteller sicherlich auch mal mit seinem Problem weiterkommen will. Ich dachte die Fehlermeldung würde aussagekräftiger werden, daher vielleicht mal den StackTrace ausgeben. Ich muss auch mal zugeben, ich programmiere in Android kaum, aber viel in Java. Soviel ich weiß, wird beim "umdrehen" die komplette Activity neu erzeugt, weswegen ich die Vermutung habe, dass an der Stelle "os.writeObject(list);" die Variable "list" Schuld an der Nullpointer Exception ist. Kannst du mal den StackTrace posten oder den Code, der bei dir ausgeführt wird, wenn dein Androidgerät gedreht wird? Sprich mit "onCreate" usw. ?
 
Zuletzt bearbeitet:
...ja, ich gebe mich geschlagen.
habs grade ausprobiert.
bin es aus c# gewohnt objekte an der stelle (vernünftig) zu initialisieren wo sie erstellt werden.
trotzdem kann ich dem ts nicht weiter helfen.
 
Nochmal kurz zum Sachverhalt (vielleicht sagt ihr dann: "wenn das so ist, mach es lieber so und so" ^^)
Ich steh da leider aufm Schlauch, weil ich es eigentlich genau so mache, wie es überall beschrieben wird.

1) Wenn die App gedreht wird, wir die Activity inkl. der ArrayList, welche ich brauche, um ein ListView zu füllen, gelöscht.
2) Ich will also irgendwie die Objekte, die in der Liste gespeichert sind, persistieren, damit sie eben nach dem drehen oder ausschalten der App nicht verloren gehen.
3) Da es ja nur jeweils immer ein Objekt ist, wollte ich das einfach in eine Datei auslagern und keine sqlLite DB verwenden.

Ich bin also auch für völlig andere Lösungsvorschläge zu haben.


Ich poste mal die Klassen, die dafür relavant sind:

Code:
package com.example.listtest03;

import java.util.ArrayList;


import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ListAdapter;

public class MainActivity extends Activity implements OnItemClickListener {

	private ListAdapter listenAdapter;
	private SaveLoad saveLoad;
	private int itemId = 0;
	private ArrayList<Item> itemList;
	
	private Button buttonFarbe;
	private Button buttonId;
	private Button buttonEdit;
		
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		saveLoad = new SaveLoad();
		itemList = saveLoad.load();
		
		createList(0);

	}
	@Override
	public void onDestroy(){
		super.onDestroy();
		saveLoad.save(itemList);
	}
	
	public void createList(int id){
		listenAdapter = new OwnListAdapter(this, id, itemList);
		
		GridView listView = (GridView) findViewById(R.id.gridView1);
		
		listView.setAdapter(listenAdapter);
		listView.setOnItemClickListener(this);
	}

}

Code:
package com.example.listtest03;

import java.io.Serializable;


public class Item implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 5447329348080716982L;
	private String oben;
	private String unten;
	private int id;
	private int day;
	
	public Item(String oben, String unten, int id, int day){
		this.oben = oben;
		this.unten = unten;
		this.id = id;
		this.day = day;
	}
	public String getOben(){
		return oben;
	}
	public String getUnten(){
		return unten;
	}
	public int getId(){
		return id;
	}
	public int getDay(){
		return day;
	}
}

Code:
package com.example.listtest03;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.util.Log;

public class SaveLoad extends Activity{

	private ArrayList<Item> itemList;
	private static final String TAG = MainActivity.class.getSimpleName();
	private static final String FILENAME = TAG +".txt";
	
	public SaveLoad(){
		itemList = new ArrayList<Item>();
	}
	
	public ArrayList<Item> getList(){
		return itemList;
	}
	public void save(ArrayList<Item> itemList){
		FileOutputStream fos;
		try{
			fos = openFileOutput(FILENAME, MODE_PRIVATE);
			ObjectOutputStream os = new ObjectOutputStream(fos);
			os.writeObject(itemList);
			os.close();
		}catch (Exception t){
			Log.d(TAG, "SAVE......"+t.toString());
		}
	}
	@SuppressWarnings("unchecked")
	public ArrayList<Item> load(){
		FileInputStream fis;
		try{
			fis = openFileInput(FILENAME);
			ObjectInputStream is = new ObjectInputStream(fis);
			itemList = (ArrayList<Item>) is.readObject();
			is.close();
		}catch (Exception t){
			Log.d(TAG, "LOAD......"+t.toString());
		}
		return itemList;
	}
}

Ich war mal so frei und habe den Code für einige Buttons und die dazu gehörigen Listener gelöscht, damit es übersichtlicher wird.

Es sieht also so aus, dass ich in onCreate load() aufrufe. Dort wird es nun zwingend zu einem Fehler kommen,
da noch keine Datei mit dem Namen FILENAME besteht. Das ist aber nicht weiter schlimm, da diese gecatcht wird
und trotzdem die itemList, welche ja im Konstruktor initialisiert wurde, zurück gegeben wurde. Dabei ist anzumerken,
dass es bis dahin auch alles funktioniert. Kann die ArrayList ganz normal verwenden, neue Objekte hinzufügen und diese
auch in der GridView dann sehen.

Nun möchte ich im onDestroy() die Liste speichern, damit sie nach dem Drehen des Bildschirms nicht verloren geht!
Dreht man den Bildschirm wird ja onDestroy() als letztes aufgerufen, die Liste sollte also gespeichert werden, um
anschließend in onCreate() wieder mit load geladen zu werden.

In load und save hab ich das eigentlich genau so wie in den Bsp. aus dem Netz, aber die sind meist so minimalistisch
und lassen alles um die Methoden herum weg, dass ich es einfach nicht nach vollziehen kann...

An dieser Stelle schonmal ein großen Danke Kane, dass du dir so Mühe machst ;)



>> Hab mal aus der MainActivity allmögliochen Kram gelöscht, der da nur unnötig den Lesefluss stören würde: Knöpfe, die zur Erstellung von Listeneinträgen da sind und sowas.
 
Wunderbar, das war der Tipp der mir gefehlt hat! Meine App verwirft nun also nicht mehr die Daten bei einer Rotation.

ABER: nun bleibt ja noch das Problem, ein Objekt in einer Datei zu speichern. Da weiß ich mir keinen Rat.

Hier nochmal die Lösung, wie man Dateien bei einer Rotation speichert.

Code:
protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		if(savedInstanceState == null){
			itemList = saveLoad.getList();
		}else{
			itemList = (ArrayList<Item>) savedInstanceState.getSerializable(LIST);
		}
}


protected void onSaveInstanceState(Bundle outState){
		super.onSaveInstanceState(outState);
		outState.putSerializable(LIST, itemList);
	}
 
Wo genau ist denn jetzt noch das Problem?

Ich kanns nur vermuten, aber meiner Meinung nach liegt/lag das Problem daran, dass deine ArrayList<Item> schon "zerstört" ist, wenn du die Methoden aufrufst. Wenn du eine Nullpointer Exception bekommts überprüfe mal mit Log Ausgaben, welche Referenz ein Nullpointer ist und überprüfe mal, ob die Methoden außerhalb von onDestroy() usw. funktionieren, also wenn du sie einfach so im Code aufrufst.
 
Hab mal gehört wenn man sich mit den lifecycle beschäftigt ist einem oft geholfen ...


Sent from my iPhone using Tapatalk
 

Ähnliche Themen

AnnaBauer21
Antworten
0
Aufrufe
503
AnnaBauer21
AnnaBauer21
D
Antworten
8
Aufrufe
807
jogimuc
J
S
Antworten
7
Aufrufe
1.295
Silvasurf
S
AnnaBauer21
Antworten
6
Aufrufe
1.027
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten