2013-05-23 3 views
0

S'il vous plaît aidez-moi à pourquoi obtenir une sortie étrange pour ce code ci-dessous ..... pourquoi obtenir la valeur null pour le getName().ArrayList Java Addition

Sortie:

Liste Vérifiez: null: 1

public class ListTest 
{ 
public static void main(String args[]) 
{ 
    List<Movie> lst = new java.util.ArrayList<Movie>(); 
    lst.add(new Movie("move1", "genre1")); 
    System.out.println("List Check :" + lst.get(0).getName() + ":" 
        + lst.size()); 
} 
} 

class Movie 
{ 
private String name; 
private String genre; 

public Movie(String name, String genre) 
{ 
    name = this.name; 
    genre = this.genre; 
} 

public String getName() 
{ 
    return name; 
} 

public void setName(String name) 
{ 
    this.name = name; 
} 

public String getGenre() 
{ 
    return genre; 
} 

public void setGenre(String genre) 
{ 
    this.genre = genre; 
} 

} 
+0

Essayez 'this.name = name' au lieu de l'inverse. – devconsole

Répondre

4

Ceci est faux:

public Movie(String name, String genre) 
{ 
    name = this.name; 
    genre = this.genre; 
} 

devrait être

public Movie(String name, String genre) 
{ 
    this.name = name; 
    this.genre = genre; 
} 

comme dans les setters.

+0

Non. Cela était correct même s'il est plus clair avec "this" –

+0

@adenoyelle non, sauf que vous voulez écraser les paramètres passés avec ceux de l'objet (qui sont null). Vous connaissez l'ombrage des noms? – Kai

+0

J'étais certain mais après un essai, vous avez raison, désolé –

1

Les variables locales, name et genre, sont affectées aux noms de variables globales du même nom dans le constructeur de Movie. La valeur par défaut de Object types est null donc ces variables restent non affectées. Le constructeur corrigé doit apparaître comme

public Movie(String name, String genre) { 
    this.name = name; 
    this.genre = genre; 
} 
1

Vous assignez paramètres à l'aide this.name devrait être inverse

public Movie(String name, String genre) 
{ 
    this.name = name; 
    this.genre = genre; 
} 
1

votre constructeur est erroné, il devrait être

public Movie(String name, String genre) 
{ 
    this.name = name; 
    this.genre = genre; 
} 
0

Reimeus a raison. Le "ceci" fait référence à la classe elle-même, donc "this.genre" se réfèrerait à la variable de classe "genre".

Changez-les pour résoudre le problème.

0

Lorsque vous écrivez name = this.name, vous affectez la valeur de this.name à name. Donc, dans votre cas, ce.nom est null lors de l'initialisation et vous l'attribuez au nom.

C'est une bonne pratique d'utiliser les getters et setters que vous avez écrits dans votre bean. vous pouvez le définir comme setName(name) au lieu d'écrire this.name=name. Les deux effectuent finalement la même action cependant.

+0

Si c'est une bonne pratique je ne l'aime pas. Dans le code où cela est fait, vous devez vérifier où le setter est appelé et où l'objet est directement accessible. Cela me rend régulièrement fou. Donc, à mon avis, c'est une bonne pratique d'appeler des setters et des getters seulement de l'extérieur de l'objet. – Kai