51
Programação 1 / Re:Aula 3
« Última Mensagem: por Jefferson Online Março 06, 2019, 07:15:01 am »Exercício 6
Neste exercício eu uni o resultado dos exercícios 4 e 5, removi o que não era essencial na classe pessoa para melhorar a clareza e acrescentei o que foi pedido.
Este foi o único exercício realmente complicado para mim. Eu tive dois problemas mas somente o segundo me deixou perdido olhando para o código sem saber o que fazer.
1o Problema:
Ao tentar criar uma instância do objeto carro
O problema desapareceu ao declarar aa classes carro e pessoa como static
2o Problema:
Uma java.lang.NullPointerException sempre que eu tentava usar o objeto carro como propriedade do objeto pessoa.
O código a seguir mostra o problema:
A causa está na linha
Carro car=new Carro();
e foi resolvido ao mudar para:
car=new Carro();
Citar
Altere a classe Pessoa para que o objeto possua um Carro. Faça com que a pessoa consiga ligar, desligar, acelerar ou frear o próprio carro.
Atenção: Lembre-se de manter as regras de encapsulamento
Neste exercício eu uni o resultado dos exercícios 4 e 5, removi o que não era essencial na classe pessoa para melhorar a clareza e acrescentei o que foi pedido.
Código: Java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | import java.util.Scanner;public class Exercício6 { public static class Carro { private static final byte MAX_ACEL = 100; private short velocidade; private short RPM; private short tempMotor; private short tempInterna; private short combustivelRestante; private short posicaoChave; private boolean statusAlternador; private boolean statusLubrificante; private boolean statusFreioMao; private boolean statusFreio; private boolean statusMotor; //false=desligado private int aceleracao; //Poderia ser byte mas o compilador exige que seja int por causa das operações de soma Carro( ){ velocidade=0; RPM=0; tempMotor=0; tempInterna=0; combustivelRestante=0; posicaoChave=0; statusAlternador=false; statusLubrificante=false; statusFreioMao=false; statusFreio=false; } boolean getStatusMotor () { return statusMotor; }; boolean ligarMotor (boolean x) { //Na maioria dos casos vai requerer mais código para efetivamente ligar/desligar o motor //E a tentativa de ligar pode falhar, o que irá mudar o valor de x statusMotor=x; return x; } /*"Relativa" porque no argumento eu só passo o valor que deve ser somado/subtraído * da aceleração corrente */ void aceleracaoRelativa (int x) { //valores negativos implicam frenagem if (statusMotor==false) return; if ((aceleracao+x)>MAX_ACEL) { aceleracao=MAX_ACEL; } else { if (aceleracao+x<0) { aceleracao=0; } else aceleracao=aceleracao+x; } }; void frear () { //imediatamente //requer mais código para efetivamente parar o veículo aceleracao=0; }; short getVelocidade () {return velocidade;}; short getRPM () {return RPM;}; short getTempMotor () {return tempMotor;}; short getTempInterna () {return tempInterna;}; short getCombustivelRestante () {return combustivelRestante;}; boolean getStatusAlternador () {return statusAlternador;}; boolean getStatusLubrificante () {return statusLubrificante;}; boolean getStatusFreioMaio () {return statusFreioMao;}; boolean getStatusFreio () {return statusFreio;}; short getPosicaoChave() {return posicaoChave;}; //0=desligado, 1=ligado, 2=partida void abrirPorta (byte numPorta) {}; void acionarTravas (boolean locked) {}; //estou supondo que todas as travas sejam automaticamente ativadas ou desativadas ao memso tempo void engrenarMarcha (byte numMarcha) {}; void ligarLimpador (byte numLimpador, byte velLimpador) {};//velLimpador=0 desliga o limpador void ligarFarois (byte numFarol, byte intensidade) {};//0=desligado void ligarLuzAlta (boolean x) {}; void ligarLanterna (byte numLanterna) {}; void ligarDesembacador (byte numDesembacador) {}; void ligarArCondicionado (byte intensidade) {}; //0=desligado void ligarAlerta (boolean x){}; void acionarBuzina (boolean x){}; void LigarAlarme (boolean x){}; void AcionarVidroElet (byte numVidro, boolean subir){}; //subir=false desce } public static class Pessoa { private Carro car; private String nome; public Pessoa() { nome=""; car=new Carro(); }; } public static void main(String args[]) { Pessoa person = new Pessoa(); int opcao; Scanner op = new Scanner(System.in); System.out.println("Digite a opcao desejada: "); System.out.println("1 para ligar o motor"); System.out.println("2 para desligar o motor"); System.out.println("3 para acelerar"); System.out.println("4 para desacelerar"); System.out.println("0 para abortar..."); do{ opcao = op.nextInt(); switch(opcao){ case 0: System.out.println("Abortado pelo usuário."); break; case 1: person.car.ligarMotor(true); System.out.println("Motor ligado"); break; case 2: person.car.ligarMotor(false); System.out.println("Motor desligado"); break; case 3: if (person.car.getStatusMotor()==true) { person.car.aceleracaoRelativa(10); System.out.println(person.car.aceleracao); }else System.out.println("Não pode mudar aceleração com motor desligado."); break; case 4: if (person.car.getStatusMotor()==true) { person.car.aceleracaoRelativa(-10); System.out.println(person.car.aceleracao); }else System.out.println("Não pode mudar aceleração com motor desligado."); break; default: System.out.println("Opcao invalida !!!"); } }while(opcao != 0); System.out.println("Programa encerrado."); op.close();}} |
Este foi o único exercício realmente complicado para mim. Eu tive dois problemas mas somente o segundo me deixou perdido olhando para o código sem saber o que fazer.
1o Problema:
Ao tentar criar uma instância do objeto carro
Citar
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
No enclosing instance of type Exercício6 is accessible. Must qualify the allocation with an enclosing instance of type Exercício6
(e.g. x.new A() where x is an instance of Exercício6).
at Exercício6$Pessoa.<init>(Exercício6.java:20)
at Exercício6.main(Exercício6.java:27)
O problema desapareceu ao declarar aa classes carro e pessoa como static
2o Problema:
Uma java.lang.NullPointerException sempre que eu tentava usar o objeto carro como propriedade do objeto pessoa.
O código a seguir mostra o problema:
Código: Java
1234567891011121314151617181920212223242526 | public class Exercício6 { public static class Carro { public String nome; Carro(){ nome=""; } } public static class Pessoa { public Carro car; public Pessoa() { Carro car=new Carro(); }; } public static void main(String args[]) { Pessoa person = new Pessoa(); person.car.nome="teste"; System.out.println(person.car.nome); } } |
A causa está na linha
Carro car=new Carro();
e foi resolvido ao mudar para:
car=new Carro();