Programa em java de estação de comboios

8 respostas
O

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:
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();
	}
}

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

8 Respostas

W

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 -me null pointer exception  [/b]

//Daniel

montroni

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;  
  
    }
W

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

O
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:
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
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?

O

Niguém sabe o que posso fazer?

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[]) {
O

[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.

O

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.

Criado 26 de abril de 2011
Ultima resposta 28 de abr. de 2011
Respostas 8
Participantes 4