StringTokenizer e ArrayList

Pessoal estou com um problema pequeno, mas chato:
No método abaixo eu uso um StringTokenizer para quebrar uma String em várias e tento adicionar cada “token” a um ArrayList:

public void setMusicas(String musicas){
		StringTokenizer str = new StringTokenizer(musicas, ";");

		while(str.hasMoreTokens()){	
			//System.out.println(str.nextToken());
			this.musicas.add(str.nextToken());	
		}		
	}

public static void main(String[]args){
		new Disco().setMusicas("a;b;c;d;e;");
	}

Mas por algum motivo não funciona. Se eu testar, tirando o comentário da linha 5 ele imprime normalmente, mas na hora de adicionar à lista dá o erro java.lang.NullPointerException (na linha 6).

Alguém sabe dizer por quê isso?

Amigo, evite usar StringTokenizer.

...
private List<String> musicas = new ArrayList(); 
...

public void setMusicas(String pMusicas){
    musicas.clear();
    musicas.addAll (Arrays.asList (pMusicas.split (";")));
}
...
public static void main(String[]args){
    new Disco().setMusicas("a;b;c;d;e");
}
...

Concordo em gênero, número e grau.

Não vejo nenhum problema em usar o StringTokenizer nesse caso.

Acredito que “musicas” é um atributo privado da sua classe Disco, mas vc esqueceu de instanciá-lo antes da inserção das Strings.

package com.porto.testeStringTokenizer;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Disco {
	
	private List musicas;
	
	public void setMusicas(String musicas) {
		StringTokenizer str = new StringTokenizer(musicas, ";");
		this.musicas = new ArrayList();
		
		while (str.hasMoreTokens()) {
			String a = str.nextToken();
			System.out.println(a);
			this.musicas.add(a);
		}
	}

	public static void main(String[] args) {
		new Disco().setMusicas("a;b;c;d;e");
	}

}

Funciona perfeitamente no caso acima :wink:

[quote=ChronoTrigger]Não vejo nenhum problema em usar o StringTokenizer nesse caso.

Acredito que “musicas” é um atributo privado da sua classe Disco, mas vc esqueceu de instanciá-lo antes da inserção das Strings.

[code]
package com.porto.testeStringTokenizer;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Disco {

private List musicas;

public void setMusicas(String musicas) {
	StringTokenizer str = new StringTokenizer(musicas, ";");
	this.musicas = new ArrayList();
	
	while (str.hasMoreTokens()) {
		String a = str.nextToken();
		System.out.println(a);
		this.musicas.add(a);
	}
}

public static void main(String[] args) {
	new Disco().setMusicas("a;b;c;d;e");
}

}
[/code][/quote]

Tem toda a razão amigo, uma olhada com mais atenção me fez perceber o erro. Vlw.

Existe só o problema de ser mais sujeito a erros, mais complexo, mais trabalhoso e menos eficiente. Consequentemente, mais caro.

No resto, tá tudo beleza, no final das contas ele funciona.