Programa em java de estação de comboios

Boas amigos,

Estou a fazer um programa para a licenciatura de Eng. Informática em que se simula uma estacao de comboios, o programa é composto por varias classes, que estão dentro dos 2 packages principais, eis as classes:
No package Aplicação estao as classes Aplicação, Companhia, MenuEstacao. No package Horario estão as classes Horario, estacao e paragem. Depois tenho mais um package mas esse é o da consola onde crio os menus, que não interessam que já estão feitos.
Já tenho cerca de 80% do programa bem feito penso eu, agora estou com umas dificuldades no seguinte:

[code]
public class MenuEstacao {

// a companhia a que pertence esta aplicação
private Companhia companhia;    
// a consola de interação
private SConsola consola = new SConsola( "Menu de estação", 500, 500 );
Estacao aEstacao = new Estacao();
// a hora para testar o sistema
private Hora aHora = new Hora();  
	
// este construtor poderá ter de ser alterado
public MenuEstacao( Companhia c ){
	companhia = c;
}

/**
 * menu principal da aplicação
 */
public void menuEstacao(){
	String menu = " \n  S - Próxima saida para um destino\n" +
    			  "  E - Próxima entrada de um destino\n" +
    			  "  M - Mudar de estação\n" +
    			  "  H - mudar a hora\n" + 
    			  "  X - Sair\n";

	char op = ' ';
	do {
		// apagar a consola e apresentar qual a estação que está a ser operada
		consola.clear();
		
		consola.println( "Estação <"+ aEstacao.getId() +"> \n" );
		consola.println( aHora.toString() );  // apresentar a hora a usar nos testes

		// indicar qual a próxima entrada no formato seguinte:
		// dependendo se há ou não mais comboios
		// Próxima entrada: <hora de entrada> vindo de <estação de origem>
		
		int origem = aEstacao.getId();
		consola.print("dd"+aEstacao.getProximaEntrada(aHora) + "ee" + aEstacao.getHorariosOrigem(origem));
		// Próxima entrada: não há mais comboios
		
		System.out.println("Próxima entrada: não há mais comboios");

		// indicar qual a próxima saída no formato seguinte:
		// dependendo se há ou não mais comboios
		// Próxima saída: <hora de entrada> com destino a <estação de destino>
		// Próxima saída: não há mais comboios
		System.out.println("Próxima saída: não há mais comboios");

		// apresentar os horários de todos os comboios que param nesta estação
		consola.println("\n---------- Horários nesta estação ---------");
		// para cada comboio apresentar:
		//   se esta estação for a origem
		//     Originário daqui sai <hora saida> para <estação destino>
		//   se esta estação for a última
		//     Vindo de <estação origem> entra <hora entrada> e termina viagem aqui
		//   nos outros casos
		//     Vindo de <estação origem> entra <hora entrada> sai <hora saida> para <estação destino>
		consola.println("-------------------------------------------");
		
		// apresentar e processar o menu principal
		consola.println(menu);			
		op = consola.readChar();
		op = Character.toLowerCase(op);
		switch (op) {
		case 's': case 'S':
			saidaDestino();
			break;

		case 'e': case 'E':
			entradaOrigem();
			break;

		case 'm': case 'M':
			mudarEstacao();
			break;
			
		case 'h': case 'H':
			mudarHora();
			break;
		}
	} while (op != 'X' && op != 'x');
	consola.close();
}


/**
 * escolhe outra estação para operar
 */
private void mudarEstacao() {
	consola.clear();
	// faz o pedido, falta fazer a mudança
	Estacao e = getEstacao("Qual a estação para que pretende mudar? ");
	e.getId();
}

/**
 * método auxiliar para pedir uma estação ao utilizador
 * @param msg mensagem a escrever no pedido
 * @return a estacão selecionada
 */
private Estacao getEstacao( String msg ){
	Estacao e = null;
	do {
		consola.println( msg );
		int cod = consola.readInt();  // pedir o código da estação
		for(int i =0; i<companhia.nEstacoes;i++)
			if( i == cod){
				e.get(i); // Aqui dá-me null pointer exception
				break;
			//	System.out.println("estação existe");
			}
		
		// testar se a estação com esse código existe
			System.out.println("Essa estação não existe...");
		
	// deverá fazer isto até que seja introduzida uma estação válida			
	} while( false );				
	return e;

}

/**
 * muda a hora para testar convenientemente o sistema
 */
private void mudarHora() {
	consola.print( "Introduza a hora no formato (h:m): " );
	String horaS = consola.readLine()+":00"; // :00 para introduzir os segundos
	aHora = new Hora( horaS );				
}


/**
 * Método que vai apresentar qual a próxima entrada de um comboio
 * que fez escala na estação escolhida
 */
private void entradaOrigem() {
	Estacao e = getEstacao("Qual a estação de origem? ");
	int origem = consola.readInt();
		e.getHorariosOrigem(origem); // nao tenho a certeza
		
		
	// depois de pedida a estação de origem deve apresentar qual a 
	// a próxima entrada de um comboio que passe por essa origem

	consola.println( "Já não há entradas vindas de " + e );
	// caso haja comboios
	
	// Entrada vinda de <estação origem> às <hora entrada>
	
	consola.readLine();
}

/**
 * Método que vai apresentar qual a próxima saída de um comboio
 * que fará escala na estação escolhida
 */
private void saidaDestino() {
	consola.clear();
	Estacao e = getEstacao("Qual a estação de destino? ");
	// depois de pedida a estação de destino deve apresentar qual a 
	// a próxima saída de um comboio que passe por esse destino
	
	consola.println( "Já não há saidas para " + e );
	// caso haja comboios
	// Saida para <estação origem> às <hora entrada>
	// chegada ao destino às <hora de chegada ao destino>
	// duração total da viagem: <duração em horas>
	// estações em que pára até ao destino
	consola.println("\nEscalas até ao destino");
	//    apresentar os códigos de todas as estações entre esta estação e o destino
	//    exemplo:   2 - 4 - 5 - 6 - 8
	consola.readLine();
}
public static void main(String[] args) {
	Companhia c = new Companhia();
	MenuEstacao menu = new MenuEstacao(c);
	menu.menuEstacao();
}

}[/code]

Na linha 109 dá.me erro como referi, eu gostava é de saber porquê?

No metodo getEstacao vc seta e = null e depois tentar executar e.get(i), nao eh estranho que vc tem uma exception, veja:

Estacao e = null;  
    do {  
        consola.println( msg );  
        int cod = consola.readInt();  // pedir o código da estação  
        for(int i =0; i<companhia.nEstacoes;i++)  
            if( i == cod){  
               [b] e.get(i); // Aqui dá-me null pointer exception  [/b]

//Daniel

Windsofhell, acredito que o seu problema seja o seguinte:

private Estacao getEstacao( String msg ){  
        Estacao e = null;  
//
//Observe que aqui voce criar o "e" como nulo e depois você não seta nada para ele, voce terá que de alguma forma setar um objeto existente pra ele ou criar um novo
// porque ao efetuar o e.get logo abaixo voce esta informando ao interpretador que deseja carregar o objeto contido em e que no momento esta null !       
//
        do {  
            consola.println( msg );  
            int cod = consola.readInt();  // pedir o código da estação  
            for(int i =0; i<companhia.nEstacoes;i++)  
                if( i == cod){  
                    e.get(i); // Aqui dá-me null pointer exception  
                    break;  
                //  System.out.println("estação existe");  
                }  
              
            // testar se a estação com esse código existe  
                System.out.println("Essa estação não existe...");  
              
        // deverá fazer isto até que seja introduzida uma estação válida              
        } while( false );                 
        return e;  
  
    }  

heheheh, nao fui eu quem postou a pergunta, eu postei a resposta, que eh exatamente a mesma que vc deu. :slight_smile:

Sim eu depois mais tarde reparei nisso, porque eu pensava que ele apanhava o valor que estava a correr no for, mas depois descobri que assim nao dava, agora o meu problema é que crio 10 estações na classe Aplicação, e essas 10 estações tenho que as carregar para a classe menuestacao, eu consigo carrega-las utilizando o seguinte:

public static Estacao[] criaestacoes(){ Estacao e[] = new Estacao[10]; for( int i = 0; i < e.length; i++ ){ e[i] = new Estacao(i+1); c.addEstacao(e[i]); } return e; }
E depois na classe MenuEstacao faço assim para carrega-las:

[code]private Aplicacao aAplicacao;
// a consola de interação
private SConsola consola = new SConsola( “Menu de estação”, 500, 500 );
Estacao aEstacao = new Estacao();
// a hora para testar o sistema
private Hora aHora = new Hora();

// este construtor poderá ter de ser alterado
public MenuEstacao( Companhia c ){
	companhia = c;
}

/**
 * menu principal da aplicação
 */
public void menuEstacao(){
	String menu = " \n  S - Próxima saida para um destino\n" +
    			  "  E - Próxima entrada de um destino\n" +
    			  "  M - Mudar de estação\n" +
    			  "  H - mudar a hora\n" + 
    			  "  X - Sair\n";
	for(int i=0; i<Aplicacao.criaestacoes().length;i++)
		aEstacao.setId(i);
	char op = ' ';
	do {
		// apagar a consola e apresentar qual a estação que está a ser operada
		consola.clear();
		consola.println( "Estação <"+ aEstacao.getId()  +"> \n" );
		consola.println( aHora.toString() );  // apresentar a hora a usar nos testes[/code]

Mas o problema é que eu não posso utilizar um metodo como estou a fazer, tenho utilizar as estacoes que são criadas no main() da classe aplicação ou seja assim:

public static void main(String[] args) { // a companhia Estacao e[] = new Estacao[10]; // as estações e =criaestacoes(); // criar as 10 estações for( int i = 0; i < e.length; i++ ){ e[i] = new Estacao(i+1); c.addEstacao(e[i]); }

Assim não sei como passar as estações, alguém dá uma ajudinha?

Niguém sabe o que posso fazer?

seria o caso de usar na classe MenuEstacao um método que recebe um vetor de estações como parâmetro?

public void definirEstacao (Estacoes e[]) {

[quote=Mephy]seria o caso de usar na classe MenuEstacao um método que recebe um vetor de estações como parâmetro?

public void definirEstacao (Estacoes e[]) {

Penso que assim nao da porque as estacões sao criadas na classe aplicação, e assim ia criar mais estacões e para isso ja tenho o vector de estações, tenho que passar de uma classe para a outra as estações que são criadas na classe aplicação.

Obrigado desde já pela disponibilidade.

Boas, queria que me ajudassem no seguinte, tenho este codigo:

Hora hora1 = new Hora(10,0,0); Horario horario1 = new Horario(hora1,hora1); Paragem paragem1 = new Paragem(); paragem1.setHorario(horario1); paragem1.setEstacao(e[0]); asParagens.add(paragem1);
e este

Horario horario1 = new Horario(); horario1.addParagem(new Paragem(new Horario(new Hora("10:00:00"), new Hora("10:00:00")),e[0]));

se repararem fazem os dois o mesmo, a diferença é que no primeiro devolve.me as horas, mas no segundo que é o que eu quero, implementar porque desperdiça menos memória, as horas devolve null, alguém sabe o porquê visto fazer supostamente o mesmo.