Dúvida em código

[code]
public class Banco extends Conta{

private int TotalContas;
private Conta[] contas;
private int contadorContas = 0;

Banco(int c)
{
	contas = new Conta[c];
}

public void addConta(Conta c)
{
	System.out.println("Adicionando uma conta no banco!");
	if(contadorContas < contas.length)
	{
		contas[contadorContas] = c;
		TotalContas++;
		contadorContas++;
	}
}

public int getTotalContas()
{
	return TotalContas;
}
	
public Conta getConta(int x)
{	
	return contas[x];
}

}[/code]

Nesse código pessoal estou com uma dúvida…no meu getConta(int x) eu gostaria de verificar se o x que me é passado não vai estourar o .lenght do meu array, porém tentei fazer assim:

public Conta getConta(int x)
{
      if(x < conta.length)
      {
    	  return conta[x];
      }else
      {
    	  //codigo qualquer
      }
}

Mas não vai desse jeito, acusa que a função getConta precisa retornar o tipo Conta, eu entendo, é por que o return não pode aparecer dentro de um bloco if…mas agora não me vêm como posso fazer isso? alguém se habilita?
:stuck_out_tongue:

Existem duas formas de lidar com isto.

  1. Lançar uma exceção e parar o programa. É bom reutilizar exceções que já existem:
public Conta getConta(int x)
{
    if( x < 0 || x >= conta.length )
        throw new ArrayIndexOutOfBoundsException( "O index [" + x  + "] é inválido." );

    return contas[x];
}
  1. Retornar null. Há outras maneiras de implementar esta checagem simples, mas é bom ter apenas um “return” por método:
public Conta getConta(int x)
{
    Conta conta = null;
    if( x >= 0 && x < conta.length )
        conta = contas[ x ];

    return conta;
}

[quote=akumaldo]

public Conta getConta(int x)
{
      if(x < conta.length)
      {
    	  return conta[x];
      }else
      {
    	  //codigo qualquer
      }
}

Mas não vai desse jeito, acusa que a função getConta precisa retornar o tipo Conta, eu entendo, é por que o return não pode aparecer dentro de um bloco if…mas agora não me vêm como posso fazer isso? alguém se habilita?
:stuck_out_tongue: [/quote]

Acho que seu problema é de português. Qual é a diferença entre conta[x] e contas[x]?

A propósito, o return pode aparecer em um bloco if sim. Não tem problemas.

(Não fique chateado, eu faço isso de vez em quando também.)

Bom…eu só escrevi errado aqui no site…por que lá na class eu prestei bastante atenção se estava escrevendo corretamente…
bom…quando eu coloco dentro do if, aparece simplesmente que o metodo deve retornar um objeto do tipo Conta…pode ter certez conferi bastante para não ver se era erro de português(sempre acontece mesmo…)
bom…vou tentar jogando a exception…
abração

Por que quando vc coloca dentro do if “aparece simplesmente que o metodo deve retornar um objeto do tipo Conta”? Porque o compilador é um “cara cauteloso”, pessimista até, que pensa (ou tenta) em todas as possibilidades possíveis de nosso programa fazer caca…
O compilador te fala isso porque provavelmente naquele trecho que vc escreveu

//codigo qualquer

não deve ter uma instrução return.
Por que isso? Porque se um método retorna Conta, por exemplo, o compilador não vai compilar enquanto houver alguma possibilidade de o método terminar e não retornar nada, ou seja, não executar uma instrução return /*algumaCoisa*/;.
Perceba o seguinte: Vamos supor que o seu código seja esse para aquele método:

public Conta getConta(int x)
 {
       if(x < conta.length)
       {
     	  return conta[x];
       }else
       {
     	  System.out.println("Nenhuma conta encontrada");
       }
 }

Nesse caso, vai dar aquele erro que está te apoquentando. Vejamos porque:
Se x for menor que o comprimento de conta, ele entra no if e retorn conta[x]. Mas se x for maior ou igual ao comprimento de conta o que aconteceria? O método iria entrar no else, jogar na tela um “Nenhuma conta encontrada”, sair do else e encerrar o processamen… OPA!!! Ele ia encerrar sem retornar nada!!! Isso o compilador não pode permitir, por que lá fora, tem alguém que chamou o getConta(int) e está esperando dele ou uma instância da classe Conta, ou um null. Por isso aquele erro que vc mencionou: Por que o compilador (ou pré-compilador, se vc tiver usando alguma IDE que te mostre os erros em tempo de digitação) não permite que um método, que diz retorna alguma, não retorne nada (ou seja, “retorne” void).
E isso continuaria acontecendo se vc tivesse um caso assim também:

public Conta getConta(int x)
 {
       if(x < conta.length)
       {
     	  return conta[x];
       }else
       {
     	  int option = JOptionPane.showConfirmDialog(null, "Conta inexistente, deseja criá-la")
     	  if(option == JOptionPane.YES_OPTION)
     	       	  return new Conta(...);
     	  else
     	       	  System.out.println("Nenhuma conta encontrada");
       }
 }

Nesse caso, se o método entrar no segundo else, ele vai denovo terminar sem retornar nada. Então o compilador tá manda aquela mensagensinha simpático, informando que o método deve retornar um Conta.
Espero ter ajudado!
qq coisa, poste mais, ok!?

Vc pode tratar esta tipo de coisa com try/catch. imagine que vc tem um vetor de contas com 1000 elementos mas só inicializou 50 deles… o ideal seria implementar um metodo find que retornasse um booleano se não existisse a conta, por exemplo.

[quote=Mantu]Por que quando vc coloca dentro do if “aparece simplesmente que o metodo deve retornar um objeto do tipo Conta”? Porque o compilador é um “cara cauteloso”, pessimista até, que pensa (ou tenta) em todas as possibilidades possíveis de nosso programa fazer caca…
O compilador te fala isso porque provavelmente naquele trecho que vc escreveu

//codigo qualquer

não deve ter uma instrução return.
Por que isso? Porque se um método retorna Conta, por exemplo, o compilador não vai compilar enquanto houver alguma possibilidade de o método terminar e não retornar nada, ou seja, não executar uma instrução return /*algumaCoisa*/;.
Perceba o seguinte: Vamos supor que o seu código seja esse para aquele método:

public Conta getConta(int x)
 {
       if(x < conta.length)
       {
     	  return conta[x];
       }else
       {
     	  System.out.println("Nenhuma conta encontrada");
       }
 }

Nesse caso, vai dar aquele erro que está te apoquentando. Vejamos porque:
Se x for menor que o comprimento de conta, ele entra no if e retorn conta[x]. Mas se x for maior ou igual ao comprimento de conta o que aconteceria? O método iria entrar no else, jogar na tela um “Nenhuma conta encontrada”, sair do else e encerrar o processamen… OPA!!! Ele ia encerrar sem retornar nada!!! Isso o compilador não pode permitir, por que lá fora, tem alguém que chamou o getConta(int) e está esperando dele ou uma instância da classe Conta, ou um null. Por isso aquele erro que vc mencionou: Por que o compilador (ou pré-compilador, se vc tiver usando alguma IDE que te mostre os erros em tempo de digitação) não permite que um método, que diz retorna alguma, não retorne nada (ou seja, “retorne” void).
E isso continuaria acontecendo se vc tivesse um caso assim também:

public Conta getConta(int x)
 {
       if(x < conta.length)
       {
     	  return conta[x];
       }else
       {
     	  int option = JOptionPane.showConfirmDialog(null, "Conta inexistente, deseja criá-la")
     	  if(option == JOptionPane.YES_OPTION)
     	       	  return new Conta(...);
     	  else
     	       	  System.out.println("Nenhuma conta encontrada");
       }
 }

Nesse caso, se o método entrar no segundo else, ele vai denovo terminar sem retornar nada. Então o compilador tá manda aquela mensagensinha simpático, informando que o método deve retornar um Conta.
Espero ter ajudado!
qq coisa, poste mais, ok!?[/quote]

Genial…é isso ae mesmo!! o compilador estava alertando para a burrada de talvez não retornar nada…OBRIGADO PELA LUZ!! foi muito útil a explicação!!agradeço!
agora o code já está rodando legal, taquei uma exception e tá rolando legal agora…obrigado a todos!
abraço :smiley: