publicvoidquantasPortasEstaoAbertas(Portaporta[]){intcont=0;for(inti=0;i<porta.length;i++){if(porta[i].aberta)cont++;}System.out.println("Numero de portas abertas: "+cont);}
Na minha clase Principal(método main), tenho um array de objetos assim:
Porta[]portaSala=newPorta[5];
Quero passar esse array pra dentro do método e correr o laço a fim de verificar todos os objetos. Tentei assim, mas o Javac recusou
Quando o seu método vai ler o array ele acha NULL.
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:
Pra funcionar eu criei um construtor para porta recebendo uma String, claro. Isso fica a seu critério.
Outra forma seria:
for(Portap:porta){
p=newPorta();
}
Seu método poderia ficar assim:
publicvoidquantasPortasEstaoAbertas(Portaporta[]){intcont=0;for(Portap:porta){p=newPorta();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.
Loiane
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:
Pra funcionar eu criei um construtor para porta recebendo uma String, claro. Isso fica a seu critério.
Outra forma seria:
for(Portap:porta){
p=newPorta();
}
Seu método poderia ficar assim:
publicvoidquantasPortasEstaoAbertas(Portaporta[]){intcont=0;for(Portap:porta){p=newPorta();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.
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):
if((porta[i]!=null)&&(porta[i].aberta))cont++;
Lavieri
Como vc falou que o problema é que o JavaC não aceita, então eu acredito que o erro é de compilação…
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)
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…Não vou ter que atribuir os valores de porta à p?
Joao.Gabriel
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…
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.
“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:
publicvoidquantasPortasEstaoAbertas(Porta[]porta){intcont=0;for(inti=0;i<porta.length;i++){if(porta[i]==null)continue;if(porta[i].aberta)cont++;}System.out.println("Numero de portas abertas: "+cont);}
guilhermevh
deixando um pouco elegante o método:
crie o método: dentro da classe Porta:
publicbooleanisAberta(){
returnthis.aberta;
}
depois mude o for para:
publicvoidquantasPortasEstaoAbertas(Porta[]porta){intcont=0;for(inti=0;i<porta.length;i++){if(porta[i]!=null&&porta[i].isAberta()){cont++;}}System.out.println("Numero de portas abertas: "+cont);}
abraços
gRoOve
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
Lavieri
gRoOve:
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
o que muda no foreach, é que o index "i" para de existir,
o foreach, joga o valor de porta[i] dentro da variável que vc define na expressão do for(each)
guilhermevh
opa...tá certo...for each sempre que possível.
rsrs
só aproveitando, para deixar para as futuras pessoas que olharem este tópico, segue com o for each:
publicvoidquantasPortasEstaoAbertas(Porta[]portas){intcont=0;for(PortaobjPorta:portas){if(objPorta!=null&&objPorta.isAberta()){cont++;}}System.out.println("Numero de portas abertas: "+cont);}
:D
gRoOve
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(Portap:porta){
p=newPorta();
}
Seu método poderia ficar assim:
publicvoidquantasPortasEstaoAbertas(Portaporta[]){intcont=0;for(Portap:porta){p=newPorta();if(p.isAberta()){cont++;}}System.out.println("Numero de portas abertas: "+cont);}
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=newint[10];
mas não consigo ir pra frente…fico pensando em como fazer como faço em C, tá foda de entender…