PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java]Elemente eines Arrays initialisieren?


Gast
2007-04-12, 18:15:24
Angenommen ich erzeuge in Java ein Array aus byte-Elementen:

byte [] my_array = new byte[42];

werden die dann alle automatisch mit 0 initialisiert oder muß ich die von Hand auf 0 setzen?

Baalzamon
2007-04-12, 18:24:28
byte [] my_array = new byte[42];
for (byte b : my_array)
{
System.out.println(b);
}

Alle 0 :|

Trap
2007-04-12, 18:32:46
Das Beispiel zeigt nur, dass alle 0 ein gültiges Ergebnis des Code ist. Damit zeigt man aber nicht, dass es das einzige standardkonforme Verhalten ist. Da muss man schon in den Sprachstandard schauen.

Da steht:
Each class variable, instance variable, or array component is initialized with a default value when it is created (§15.9, §15.10):
* For type byte, the default value is zero, that is, the value of (byte)0.

Gast
2007-04-12, 19:08:36
Demnach müßten Verweistypen mit null initialisiert werden. Mache ich aber folgendes:

int[] returnArray()
{
int[] result;

return result;
}

erhalte ich vom Eclipse-Compiler die Fehlermeldung:

The local variable result may not have been initialized

Initialisiere ich result expilizit mit null, verschwindet die Fehlermeldung.

Senior Sanchez
2007-04-12, 19:28:12
Demnach müßten Verweistypen mit null initialisiert werden. Mache ich aber folgendes:

int[] returnArray()
{
int[] result;

return result;
}

erhalte ich vom Eclipse-Compiler die Fehlermeldung:

Initialisiere ich result expilizit mit null, verschwindet die Fehlermeldung.

Ja, Array-Elemente werden standardmäßig initialisiert, aber nicht das Array ansich ;) Das ist ein Unterschied.

Du hast ansich gar kein Array oben erzeugt (Arrays sind ja im Grunde auch nur Objekte) und somit kann er das auch nicht zurückgeben.

AlSvartr
2007-04-12, 20:02:36
Demnach müßten Verweistypen mit null initialisiert werden. Mache ich aber folgendes:

int[] returnArray()
{
int[] result;

return result;
}

erhalte ich vom Eclipse-Compiler die Fehlermeldung:

Initialisiere ich result expilizit mit null, verschwindet die Fehlermeldung.
Da es eine methodenlokale Variable ist, wird es nicht mit einem Defaultwert initialisiert (vgl. auch Traps Quote).

Monger
2007-04-12, 20:35:31
Da es eine methodenlokale Variable ist, wird es nicht mit einem Defaultwert initialisiert (vgl. auch Traps Quote).

Das ist leider die falsche Antwort! ;)

Objektdeklarationen werden grundsätzlich mit null initialisiert, Basisdatentypen mit 0, egal ob Attribut oder Variable.

Soweit der Compiler es kann, warnt er einen allerdings davor, wenn ein Objekt nicht explizit initialisiert wurde. Bei öffentlichen Attributen kann er das nur nicht, weil es könnte ja irgendein anderes Objekt von außen diese Initialisierung machen.

AlSvartr
2007-04-13, 11:01:38
Es gibt in so einem Fall aber keine Compilerwarnung, sondern nen Compilerfehler. Zumindest beim Sun-Java. Vielleicht handhabt das ja irgendeine Implementierung anders.

Ich meine sowas hier:

public class Test {
public static void main(String[] args) {
String s;
System.out.println(s);
}
}


Dabei müsste nach deiner Definition null rauskommen (inkl. ner Warnung beim Kompilieren).

Der_Donnervogel
2007-04-13, 11:47:03
Es gibt in so einem Fall aber keine Compilerwarnung, sondern nen Compilerfehler. Zumindest beim Sun-Java. Vielleicht handhabt das ja irgendeine Implementierung anders.
Das Verhalten ist so spezifiziert (http://java.sun.com/docs/books/jls/second_edition/html/defAssign.doc.html#25979), der Sun Compiler macht also alles wie er soll:

Each local variable (§14.4) and every blank final (§4.5.4) field (§8.3.1.2) must have a definitely assigned value when any access of its value occurs. A Java compiler must carry out a specific conservative flow analysis to make sure that, for every access of a local variable or blank final field f, f is definitely assigned before the access; otherwise a compile-time error must occur.

AlSvartr
2007-04-13, 12:18:12
Gut zu wissen. Dann war meine ursprüngliche Aussage ja sogar so richtig richtig :wink:

Monger
2007-04-13, 12:18:29
Es gibt in so einem Fall aber keine Compilerwarnung, sondern nen Compilerfehler.

Tatsächlich. War das vorher mal anders? Ich hatte das immer nur als Warnung im Kopf.