String

tiger360
String

est ce qu une variable de type String est initialise par dedault à null?

moi j dirai faux mais le prof nous avait dit que c'etait VRAI

fredericmazue

Bonjour,

Quote:

moi j dirai faux mais le prof nous avait dit que c'etait VRAI

Navré de te décevoir (on aime toujours contredire son prof n'est-ce pas ;) ) mais sur le fond ton prof à raison quoi qu'on puisse un peu pinailler. Si tu veux l'impressioner voilà:

Regarde cette classe

package fred;

public class Gremlins {
	String s_null;
	void run() {
		String s;
		s_null.equals("toto");
	}
	public static void main(String[] args) {
		Gremlins g = new Gremlins();
		g.run();
	}
}

Il y a deux chaînes dedans. s_null membre de la classe et s variable locale à la méthode run

voici le by-code désassemblé:

fred@soleil ~/workspace/GremlinsJava/fred $ javap -c Gremlins
Compiled from "Gremlins.java"
public class fred.Gremlins extends java.lang.Object{
java.lang.String s_null;

public fred.Gremlins();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

void run();
  Code:
   0:   aload_0
   1:   getfield        #2; //Field s_null:Ljava/lang/String;
   4:   ldc     #3; //String toto
   6:   invokevirtual   #4; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
   9:   pop
   10:  return

public static void main(java.lang.String[]);
  Code:
   0:   new     #5; //class fred/Gremlins
   3:   dup
   4:   invokespecial   #6; //Method "<init>":()V
   7:   astore_1
   8:   aload_1
   9:   invokevirtual   #7; //Method run:()V
   12:  return

}

Si tu regardes le corps de la méthode run, tu n'y vois pas trace de s. S est considéré non initialisée (par le compilateur) donc là tu peux contredire (un peu) ton prof car s n'est pas à null. Mais attention tu peux ne le contredire qu'un peu car s n'est pas utilisable non plus. En fait il n'existe pas de référence sur s, si tu écris:

s.equals("toto");

Le compilateur va le refuser justement parce que s n'est pas initialisé *du tout* et qu'il n'y a pas de référence définie. Mais comme il n'est pas initialisé on peut dire sur le bout des lèvres qu'il n'est pas à null stricto sensu ;)

Par contre si tu regardes s_null, alors là tu as null. Et si tu essaies le code il va te lever une NullPointerException parce que là il existe bien une référence sur s_null et elle est à null. C'est ce que ton prof a voulu dire je pense et il a raison.

Comme je n'aime pas Java, je te suggère de troller un peu avec ton prof en lui disant que Java n'est pas un langage cohérent avec lui même puisque dans un cas il crée une référence null et pas dans l'autre cas ;)