Arraylist mit Byte füllen

  • Antworten:10
SebastianE
  • Forum-Beiträge: 37

16.07.2012, 10:54:47 via Website

Hallo,

immer noch hab ich Probleme mit der Arraylist.
Ich bekomme Zahlen vom Typ byte und möchte diese in eine Arraylist einfügen. So wie ich das alles verstanden habe muß ich als erstes den byte Wert einem Byte Wrapper umhüllen da Arraylist mit einfachen Typen nichts anfangen kann. Ich hab jetzt mehrere Varianten durch aber es will nicht klappen. Wird zwar kompiliert aber beim ausführen der App im Emulator kommt ein "Sorry....". Wenn ich die Arraylist als Typ String erzeuge und string einfüge klappts wunderbar. Wie mache ich denn beim einfügen von Byte einen Fehler?

Hier mal mein Code:

Definition der Arraylist im create der Activity:
ArrayList<Byte> MyList = new ArrayList<Byte>();

Verschiedene Versuche Bytedaten in das Array einzufügen:

//Byte Beit = Byte.valueOf("22");löst bei einfügen eine NullPointerException aus
//Byte Beit = new Byte(30);wird nicht kompiliert
Byte Beit = 22;löst bei einfügen eine NullPointerException aus
MyList.add(Beit);

Hoffe Ihr könnt mir helfen,

Viele Grüße und besten Dank,
SebastianE

Antworten
Michael H
  • Forum-Beiträge: 127

16.07.2012, 11:31:50 via Website

Hallo Sebastian

Deine Testversuche und Ergebnisse sind etwas merkwürdig. Weil ich selber unsicher wurde, habe ich das kurz ausprobiert. Bei mir funktionieren folgende Konstrukte einwandfrei:

1ArrayList<Byte> al = new ArrayList<Byte>();
2al.add((byte) 22);
3System.out.println(al.get(0)); // Gibt 22 aus

1ArrayList<Byte> al = new ArrayList<Byte>();
2Byte b = 22;
3al.add(b);
4System.out.println(al.get(0)); // Gibt 22 aus

Vielleicht kannst du dein Problem noch etwas genauer beschreiben....

Gruss michi

Antworten
SebastianE
  • Forum-Beiträge: 37

16.07.2012, 15:58:45 via Website

Hallo michi,

bei mir funktionieren Deine beiden Beispiele auch, vielen Dank erstmal dafür. In Deinem ersten Beispiel verpackst Du ja auch nicht das byte in ein Byte Wrapper Objekt und trotzdem funktionierts. hmmmmm

ArrayList<Byte> al = new ArrayList<Byte>();
al.add((byte) 22); hier fügst Du einfach den Wert in die Liste ein ohne den Wrapper Byte zu verwenden.Geht also doch ohne wrappen?
System.out.println(al.get(0)); // Gibt 22 aus

Ich hab halt gelesen das die Arraylist nur Objekte akzeptiert und hab dann eben versucht den Inhalt einer byte Variablen in den Typ Byte umzuwandeln.
Ich hab da irgendwas nicht richtig verstanden fürchte ich.

In Deinem zweiten Beispiel wird doch mit :

Byte b = 22;

auch der Wert 22 in ein ein Byte Objekt "gewrappt", aber im ersten eben nicht, funktioniert aber trotzdem.
Ich hatte gedacht ich müßte ein Objekt vom typ Byte erzeugen und dann den Wert der byte Variablen da reinschreiben und dann erst könnte man das Wrapper-Objekt Byte in die Arraylist einfügen.

Ich komme aus der Delphi Pascal Welt und Java macht mir doch mehr Probleme als ich Anfangs vermutet habe.

Viele Grüße,
SebastianE

Antworten
Michael H
  • Forum-Beiträge: 127

16.07.2012, 16:06:31 via Website

In den neueren Java Versionen kann man einen primitiven sowie ein Wrapper übergeben. Java regelt das dann intern. Das heisst, Java kann automatisch byte in Byte casten...

ps. Wieso deine Beispiele nicht funktioniert haben, verstehe ich immernoch nicht! Naja, wird seinen Grund gehabt haben... :)

Gruss michi

Antworten
SebastianE
  • Forum-Beiträge: 37

16.07.2012, 16:26:19 via Website

Hallo michi,

ok Danke das ist mal ne gute Info. Bisher hab ich das nirgends lesen können.

Mit Deinen Beispielen funktioniert es bei mir nur wenn ich die Arraylist in der gleichen Methode z.B. onclick erzeuge wo ich auch die Arraylist verwende, z.B. zum einfügen. alles im onClick geht prima.
wenn ich aber die Arraylist im create der activity erzeuge funktioniert es wieder nicht.


public class Activity1 extends Activity implements OnClickListener {

public ArrayList MList;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);

ArrayList<Byte> MyList = new ArrayList<Byte>();
...

Die NullPointerexception kommt wohl weil die MyList in der Class Activity1 definiert wird. Allerdings wo sollte ich sie auch sonst definieren wenn ich sie auch in allen Methoden von Class Activity1 verwenden möchte?

Viele Grüße,
SebastianE

Antworten
SebastianE
  • Forum-Beiträge: 37

17.07.2012, 00:08:14 via Website

Boxing ja darüber hab ich gelesen aber scheinbar nicht ganz verstanden. Danke jetzt ist es mir aber schon etwas klarer.

Mein versuch die Liste mit Werten zu füllen funktioniert aber immer nur wenn ich das erzeugen der Liste und das füllen der Liste in der gleichen Methode durchführe sonst gibt es immer besagte NullPointerexception.

Globale Variablen scheint es ja nicht zu geben in Java, im Buc finde ich auch nicht wie ich eine Liste so deklariee das die ganze activity sie nutzen kann. Java liegt mir nicht glaub ich so langsam.

Wenn ich die Deklaration in eine andere Methode verlagere, z.B. onClick eines butttons und im ocClick eines anderen buttons die Liste mit werten füllen möchte gibt es immer besagte exception.

button1 onclick:
ArrayList<Byte> MyList = new ArrayList<Byte>();

button2 onclick:
Byte b = 22;
MyList.add(b);

Hat einer von euch noch einen Tip was ich falsch mache?

Viele Grüße,
SebastianE

Antworten
Michael H
  • Forum-Beiträge: 127

17.07.2012, 08:23:10 via Website

Ach schon wieder was gelernt (boxing / unboxing), danke Harald! :)

Dein Problem liegt darin, dass wenn du in onCreate() eine ArrayList<?> erzeugst, sie auch nur da ansprechbar ist. Du könntest es folgendermassen lösen:

1public class IrgendeineKlasse {
2 ArrayList<Byte> al = null;
3
4 public void onCreate(...) {
5 al = new ArrayList<Byte>();
6 }
7
8 public listFuellen() {
9 al.add((byte)144);
10 .....
11 }
12}
Wichtig ist, dass du in onCreate nicht ArrayList<Byte> al = .... machst sondern die Klassenvariable al alleine verwendest. Sonst ist das eine eigene Variable innerhalb onCreate()!
ps. Variablen (abgesehen von static, final usw..) schreibt man in Java üblicherweise klein...

Gruss Michi

Antworten
SebastianE
  • Forum-Beiträge: 37

18.07.2012, 14:55:43 via Website

Hallo michi,

vielen Dank für den Hinweis, daran hat es gelegen.
Ich hab dann gleich mal versuchsweise die gesamte Deklaration in die Klasse geschrieben und das funktionierte auch.

ArrayList<Byte> al = new ArrayList<Byte>();

Das heißt also es gibt doch sowas wie globale Variable die für die ganze Activity verwendbar sind.

Vielen Dank, jetzt kann ich erstmal weitermachen.

Viele Grüße,
SebastianE

Antworten
SebastianE
  • Forum-Beiträge: 37

18.07.2012, 15:22:26 via Website

Hallo Rafael,

naja was die Performance angeht bin ich noch gespannt. Mit byte[] meinst Du sicher ein Array?! Der Grund für die Arraylist ist das nicht bekannt ist wieviele Werte es sein können und Byte da Arraylist eben nur Objekte aufnehmen kann. Manchmal sind es 60 dann wieder 400 und die Arraylist vergrößerst sich ja von allein. Gespeichert wird das ganze als Stream nach dem TLV - Objekt Prinzip.

Viele Grüße,
SebastianE

Antworten