É isso aí mesmo que o Guilherme falou. Quando você inicializa um objeto informando o seu tamanho ele inicializa os valores para null.
Uma forma de resolver isso seria:
Porta[] portaSala = {new Porta("sala"), new Porta("cozinha"), new Porta("banheiro")};
Pra funcionar eu criei um construtor para porta recebendo uma String, claro. Isso fica a seu critério.
Outra forma seria:
for(Porta p : porta) {
p = new Porta();
}
Seu método poderia ficar assim:
public void quantasPortasEstaoAbertas(Porta porta[]) {
int cont = 0;
for(Porta p : porta) {
p = new Porta();
if(p.isAberta()) {
cont++;
}
}
System.out.println("Numero de portas abertas: "+cont);
}
Algumas sugestões para melhorar o seu código:
Por boas práticas, declare o array no tipo, não no atributo. Evite: Porta porta[], use sempre Porta[] porta
Use o for each, é bem mais elegante e previne contra erros
Encapsule o seu atributo “aberta”, fazendo uso do método “isAberta” na hora de perguntar se a porta está aberta ou não
Por mais que não seja necessário, coloque o par de chaves no seu if, imagine algum dia alguém alterando o seu código colocando mais alguma instrução dentro do if, mas esquecendo de colocar o par de chaves, dá uma dor de cabeça…
[quote=Joao.Gabriel]É isso aí mesmo que o Guilherme falou. Quando você inicializa um objeto informando o seu tamanho ele inicializa os valores para null.
Uma forma de resolver isso seria:
Porta[] portaSala = {new Porta("sala"), new Porta("cozinha"), new Porta("banheiro")};
Pra funcionar eu criei um construtor para porta recebendo uma String, claro. Isso fica a seu critério.
Outra forma seria:
for(Porta p : porta) {
p = new Porta();
}
Seu método poderia ficar assim:
public void quantasPortasEstaoAbertas(Porta porta[]) {
int cont = 0;
for(Porta p : porta) {
p = new Porta();
if(p.isAberta()) {
cont++;
}
}
System.out.println("Numero de portas abertas: "+cont);
}
Algumas sugestões para melhorar o seu código:
Por boas práticas, declare o array no tipo, não no atributo. Evite: Porta porta[], use sempre Porta[] porta
Use o for each, é bem mais elegante e previne contra erros
Encapsule o seu atributo “aberta”, fazendo uso do método “isAberta” na hora de perguntar se a porta está aberta ou não
Por mais que não seja necessário, coloque o par de chaves no seu if, imagine algum dia alguém alterando o seu código colocando mais alguma instrução dentro do if, mas esquecendo de colocar o par de chaves, dá uma dor de cabeça…
Por enquanto é isso, veja aí se funciona.
Att.[/quote]
Complementando as outras respostas, também é bom checar se o objeto não é nulo, para não dar aquela exceção (vai que por acaso você esquece de instaciar uma posição do array):
[quote=Lavieri]Como vc falou que o problema é que o JavaC não aceita, então eu acredito que o erro é de compilação…
o erro na verdade é esse
public void quantasPortasEstaoAbertas(Porta[] porta) {
o correto é
public void quantasPortasEstaoAbertas(Porta[] porta) {
[/quote]
Acho que o Lavieri cometeu um pequeno engano…
Na verdade, as duas maneiras estão corretas, tanto “Porta porta[]” quanto “Porta[] porta”.
No java, você pode declarar um array destas duas maneiras acima.
Só que, na maioria das vezes, sempre vemos nos códigos “Porta[] porta” porque fica mais legível (só de bater o olho dá para notar que é um array de portas).
Quando a gente declara Porta porta[], sabemos que é um array quando olhamos para a variável porta, mas temos que “voltar” na declaração para checar qual é o tipo do array!
O erro que o gRoOve se referiu é o gRoOve é NullPointerException , porque ele instanciou o array, mas esqueceu de instanciar os objetos de cada posição, e quando ele tentou chamar um método da classe Porta, a exceção foi disparada (por tentar acessar um objeto nulo)
guilhermevh, só tava declarado o array mesmo, não tinha referenciado cada objeto.
João sei da utilidade do encapsulamento, mas como era apenas um exemplo simples nem fiz, quanto aos ifs, prefiro assim, o código fica mais limpo sem as chaves. Quanto ao for each, preciso estudar sobre pois não consegui compreender certo ainda…
Ainda está dando erro, tipo fiz o método igual o do João, debuguei aqui, a variável tá definada como true mas não entra no cont ali…tipo a variável p usada no for não assume os valores, ela fica sempre null…Não vou ter que atribuir os valores de porta à p?
[quote=gRoOve]guilhermevh, só tava declarado o array mesmo, não tinha referenciado cada objeto.
João sei da utilidade do encapsulamento, mas como era apenas um exemplo simples nem fiz, quanto aos ifs, prefiro assim, o código fica mais limpo sem as chaves. Quanto ao for each, preciso estudar sobre pois não consegui compreender certo ainda…
Ainda está dando erro, tipo fiz o método igual o do João, debuguei aqui, a variável tá definada como true mas não entra no cont ali…tipo a variável p usada no for não assume os valores, ela fica sempre null…
[/quote]
Guilherme, onde a variável está definida como true? Eu também debuguei o código aqui e funcionou perfeitamente. Detalhe: o valor padrão de um boolean é false, portando, se você estiver instanciado apenas o objeto, provavelmente o valor dele esteja false.
Com relação às chaves do if, eu também usava assim por achar que ficava mais limpo, até que um dia precisaram dar manutenção em meu código e perderam muito tempo pra ver que a instrução que era pra ser executada dentro do if não estava acontecendo, e justamente porcausa as malditas chaves… Portanto, hoje não tenho dúvida, pela manutenibilidade do código e pela amizade com meus amigos desenvolvedores, sempre utilizo o par de chaves mesmo pra ifs com uma linha apenas. :lol:
Mas isso realmente é opcional na maioria dos casos.
public class Porta {
boolean aberta;
String cor;
public void abrirPorta()
{
this.aberta = true;
}
public void fecharPorta()
{
this.aberta = false;
}
.
.
.
“Detalhe: o valor padrão de um boolean é false, portando, se você estiver instanciado apenas o objeto, provavelmente o valor dele esteja false.”, como assim instanciando apenas o objeto? Tipo, a variável p recebe os valores de porta, mas quando vai de fato verificar nessa linha if(p.getAberta()), ela é zerada, recebe outro endereço de memória(id no caso do eclipse)…
Consegui fazer assim:
public void quantasPortasEstaoAbertas(Porta[] porta)
{
int cont = 0;
for(int i=0;i<porta.length; i++)
{
if(porta[i] == null)
continue;
if(porta[i].aberta)
cont++;
}
System.out.println("Numero de portas abertas: "+cont);
}
Eu tinha criado um método parecido com esse, com umas informações desnecessárias, já corrigi. Hm, teu for também funciona…mas quero fazer usando o for each pra treinar e to tendo os problemas que relacionei acima
[quote=Joao.Gabriel]É isso aí mesmo que o Guilherme falou. Quando você inicializa um objeto informando o seu tamanho ele inicializa os valores para null.
Uma forma de resolver isso seria:
for(Porta p : porta) {
p = new Porta();
}
Seu método poderia ficar assim:
public void quantasPortasEstaoAbertas(Porta porta[]) {
int cont = 0;
for(Porta p : porta) {
p = new Porta();
if(p.isAberta()) {
cont++;
}
}
System.out.println("Numero de portas abertas: "+cont);
}
[/quote]
Exato. Fiquei confuso pq o João referenciou o objeto criado…ai nunca ia dar certo mesmo, pois era outro endereço de memória, sempre ia retornar null…
Agora tenho que criar um método pra adicionar portas…pensei em criar um atributo do tipo vetor pra controlar ate quantas portas podem ser criadas
int[] portas = new int[10];
mas não consigo ir pra frente…fico pensando em como fazer como faço em C, tá foda de entender…