Java - un objeto no actualiza su tiempo como debería

 
Vista:
sin imagen de perfil
Val: 63
Ha disminuido su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por smn (21 intervenciones) el 15/09/2020 21:57:26
Muy buenas a todos, tengo problemas con un codigo que en parte no funciona como deberia tengo 2 clases reloj y radioreloj, reloj me permite crear un objeto reloj y radioreloj un objeto radio con un objeto reloj y lo que pasa es que cuando agrego el objeto al radioreloj cuando su tiempo llega a 24:59:59 deberia actualizarse a 00:00:00 y lo que pasa es que si se actualizan todos pero no como deberian el tiempo me esta quedando asi 25:00:00.

lo raro es que si creo un objeto reloj desde el main el tiempo si actualiza como debe.

// Metodo de la clase reloj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public void crearReloj(){
    Scanner input = new Scanner(System.in);
    while(true){
        try{
            System.out.println("Ingrese la hora");
            this.hora = input.nextInt();
            if(this.hora < 0 || this.hora > 24){
                System.out.println("Ingreso una hora incorrecta o fuera del limite permitido(0-24)");
                continue;
            }else{
            System.out.println("Hora ingresada correctamente");
            break;
            }
        }catch(Exception e){
            System.out.println("Por favor solo ingrese numeros");
            input.nextLine();
        }
    }while(true){
        try{
            System.out.println("Ingrese minutos");
            this.minutos = input.nextInt();
            if(this.minutos < 0 || this.minutos > 60){
                System.out.println("Ingrese una cantidad de minutos incorrecto o que esta fuera del rango(0-60)");
                continue;
            }else{
                System.out.println("Minutos ingresados correctamente");
                break;
            }
        }catch(Exception e){
            System.out.println("Por favor solo ingrese numeros");
            input.nextLine();
        }
    }while(true){
        try{
            System.out.println("Ingrese segundos");
            this.segundos = input.nextInt();
            if(this.segundos < 0 || this.segundos > 60){
                System.out.println("Ingreso una cantidad de segundos incorrectos o que esta fuera del rango(0-60)");
                continue;
            }else{
                System.out.println("Segundos ingresados correctamente");
                break;
            }
        }catch(Exception e){
            System.out.println("Por favor solo ingrese numeros");
            input.nextLine();
        }
    }
 
    Reloj reloj = new Reloj(this.hora,this.minutos,this.segundos);


// Metodo de la clase radioreloj

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public void crearImprimir(ArrayList lista){
    Reloj rl = new Reloj();
    Scanner input = new Scanner(System.in);
    int cl = 0;
    double ps = 0;
    boolean ori;
    String[] colores = {"Blanco","Negro","Azul","Rojo","Amarillo","Verde","Rosado"};
    while(true){
        try{
            System.out.println("Seleccione un color\n1 - Blanco\n2 - Negro\n3 - Azul\n4 - Rojo\n5 - Amarillo\n6 - Verde\n7 - Rosado");
            cl = input.nextInt();
            if(cl < 0 || cl > 7){
                System.out.println("Ingresa una opcion correcta");
                continue;
            }else{
                System.out.println("Seleccionaste el color: " + colores[cl - 1]);
                break;
            }
        }catch(Exception e){
            System.out.println("Por favor ingrese solo numeros");
            input.nextLine();
        }
    }
    while(true){
        try{
            System.out.println("Ingrese el peso del Radio Reloj");
            ps = input.nextDouble();
 
        }catch(Exception e){
            System.out.println("Por favor ingrese un peso correcto");
            input.nextLine();
            continue;
        }
        System.out.println("Peso ingresado correctamente: " + ps);
        break;
    }
    while(true){
        try{
            System.out.println("Ingrese (true o false) para conocer la autenticidad del radio reloj");
            ori = input.nextBoolean();
        }catch(Exception e){
            System.out.println("Por favor ingrese una de estas dos opciones (true o false)");
            input.nextLine();
            continue;
        }
        System.out.println("La radio reloj es: " + ori);
        break;
    }
    rl.crearReloj();
 
    RadioReloj rdl = new RadioReloj(colores[cl - 1],ps,ori,rl.toString());
    lista.add(rdl);
    System.out.println(rdl);
}

// Este es el main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
ArrayList<RadioReloj> lista = new ArrayList();
RadioReloj radioRelojBase = new RadioReloj();
Reloj relojCreado = new Reloj(0,0,0);
Reloj relojUniversal = new Reloj(23, 59, 58);
 
Scanner input = new Scanner(System.in);
 
int opcion = 0;
 
while(opcion != 2){
    relojUniversal.imprimirHora();
    System.out.println("Seleccione una opcion\n1- Tienda\n2 - Salir");
 
    try{
        opcion = input.nextInt();
 
        if(opcion == 1){
            relojUniversal.imprimirHora();
            int opcionDos = 0;
            while(opcionDos != 6){
                System.out.println("Bienvenido a la tienda de relojes.\nSelecione una opcion\n1 - Crear Radio Reloj\n2 - Mostrar Radio Reloj\n3 - Eliminar Radio Reloj\n4 - Pintar Radio Reloj\n5 - Comprar Radio Reloj\n6 - Salir");
                opcionDos = input.nextInt();
 
                if(opcionDos == 1){
                    relojUniversal.imprimirHora();
                    radioRelojBase.crearImprimir(lista);
                }else if(opcionDos == 2){
                    relojUniversal.imprimirHora();
                    System.out.println("Radio Relojes");
                    for(int i=0; i<lista.size(); i ++){
                        System.out.println(lista.get(i));
                    }
                }else if(opcionDos == 3){
                    relojUniversal.imprimirHora();
                    radioRelojBase.eliminarRadioReloj(lista);
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 63
Ha disminuido su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por smn (21 intervenciones) el 15/09/2020 22:19:34
reloj

como ven el primer reloj si se actualiza el que esta en el radio reloj no, se me olvido decir que tengo un metodo que actualizael tiempo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 2.821
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por Kabuto (741 intervenciones) el 16/09/2020 00:44:29
Pues necesitaríamos ver la clase Reloj y RadioReloj.

Los métodos en los que pides datos para crear estos objetos, no creo que sean el problema. Lo que habría que ver es el código que modela el Reloj, y el RadioReloj.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 63
Ha disminuido su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por smn (21 intervenciones) el 16/09/2020 00:51:05
esta es la clase reloj no agregue los getters y setters

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public void imprimirHora(){
        System.out.print((hora<10?"0":"") + hora + ":" + (minutos<10?"0":"") + minutos + ":"+ (segundos<10?"0":"") + segundos + " ");
        segundos += 1;
 
        cambiarAmPm();
        modificarTime();
    }
 
    public void modificarTime(){
        if(segundos == 60){
            segundos = 0;
            minutos +=1;
            if(minutos == 60){
                minutos = 0;
                hora +=1;
                if(hora == 24){
                    hora = 0;
                }
            }
        }
    }
 
    public void cambiarAmPm(){
        System.out.print(hora<=12?"Am\n":"Pm\n");
    }
 
    @Override
    public String toString(){
        String cambioAMPM = hora<=12?"Am":"Pm";
        //String resultado = (this.hora<10?"0":"") + this.hora + ":" + (this.minutos<10?"0":"") + this.minutos + ":" + (this.segundos<10?"0":"") + this.segundos + " " + cambioAMPM;
        String resultado = (hora<10?"0":"") + hora + ":" + (minutos<10?"0":"") + minutos + ":" + (segundos<10?"0":"") + segundos + " " + cambioAMPM;
 
        modificarTime();
 
        return resultado;
    }
}

clase radioreloj

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    //Metodos
public class RadioRelojj {
    String color;
    double peso;
    boolean original;
    Object Reloj;
    public void eliminarRadioReloj(ArrayList lista){
        Scanner input = new Scanner(System.in);
        System.out.println("Selecione el reloj a eliminar");
        byte contador = 1, opcion = 0;
        for(int i=0; i<lista.size(); i ++){
           System.out.println(String.format("%s %s", contador,lista.get(i)) + (contador +=1));
           //contador += 1;
        }
        if(lista.isEmpty()){
            System.out.println("No hay datos en la Array");
        }else{
            try{
                opcion = input.nextByte();
                lista.remove(opcion - 1);
                System.out.println("Radio Reloj eliminado con exito.");
            }catch(Exception e){
                System.out.println("Ingrese una opcion correcta" + input.nextLine());
            }
        }
    }
 
    @Override
    public String toString() {
        return String.format("Color: %s, Peso: %s, Original: %s, Reloj: %s", this.color,this.peso,this.original,Reloj);
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 2.821
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por Kabuto (741 intervenciones) el 16/09/2020 02:32:44
Ok, un par de cositas tras darle un vistazo rápido.

En el método modificarTime(), para asegurarnos de que cualquier hora por encima de 23 siempre pasará a 0, yo cambiaría la condición a como lo he puesto en negrita:

1
2
3
4
5
6
7
8
9
10
11
12
13
public void modificarTime(){
        if(segundos == 60){
            segundos = 0;
            minutos +=1;
            if(minutos == 60){
                minutos = 0;
                hora +=1;
                if(hora >= 24){
                    hora = 0;
                }
            }
        }
    }

En el método toString(), habría que hacer el mismo cambio o bien invocar directamente este método.


Luego, en la clase RadioReloj, el objeto Reloj que recibe, no lo tratas como un Reloj, lo tratas como un Object.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class RadioRelojj {
    String color;
    double peso;
    boolean original;
    Object Reloj;
 
    public RadioRelojj() {
    }
 
    public RadioRelojj(String color, double peso, boolean original, Object Reloj) {
        this.color = color;
        this.peso = peso;
        this.original = original;
        this.Reloj = Reloj;
    }

Esto puede alterar su comportamiento. Si lo instancias como Object, no se podrá acceder a los métodos propios de la clase Reloj, como cambiarAmPm(), modificarTime(), etc...

Es cierto que dentro de la clase RadioReloj, no parece que necesites acceder a ellos, pero si accedes al atributo Reloj desde otro sitio (pues no es un atributo private) puede que no se comporte como un objeto Reloj, si no como un objeto Object, que son cosas distintas.

Debería ser instanciado como Reloj.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class RadioRelojj {
    String color;
    double peso;
    boolean original;
    Reloj reloj;
 
    public RadioRelojj() {
    }
 
    public RadioRelojj(String color, double peso, boolean original, Reloj reloj) {
        this.color = color;
        this.peso = peso;
        this.original = original;
        this.reloj = reloj;
    }
Y del mismo modo en el resto de métodos que accedan a él.

No se por qué decidiste instanciarlo como Object, quizás haya un motivo. Pero seguramente se pueda solucionar de otro modo sin tener que usar la clase Object, que insisto, puede reducir/alterar la funcionalidad de un objeto que inicialmente era de la clase Reloj
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 63
Ha disminuido su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por smn (21 intervenciones) el 16/09/2020 03:37:54
ohh muchas gracias ya me estaba resignando y empezando a crear el proyecto de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.977
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por Rodrigo (529 intervenciones) el 16/09/2020 05:36:50
Algunas cosas que detecto podrian mejorarse:

Parece extran~o que la clase RadioReloj tenga un metodo que elimine un RadioReloj de una lista.
Esto no deberia estar aqui. Deberia ser un metodo static al lado del main e invocarse desde alli sin instanciar RadioReloj alguno.

Por otro lado, cuando declaras ArrayList, asegurate de acompanarlo del tipo contenido, osea: ArrayList<Tipo>
No hacerlo es una invitacion a problemas.

El chequeo que haces si la lista esta vacia en la linea 15 podria hacerse al inicio del metodo y salir inmediatamente si no hay nada que hacer.
No tiene mucho sentido realizar las acciones anteriores si no hay datos en la lista.

El metodo toString() de la clase Reloj no deberia invocar el metodo modificarTime(), pues la mision del metodo es transformar a String, no tiene sentido esta operacion escondida.
Misma critica al metodo ImprimirHora()

El metodo toString e ImprimirHora parecen muy parecidos. Tal vez puedas sacar factor comun o usar una en la otra en vez de implementar 2 veces lo mismo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 63
Ha disminuido su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por smn (21 intervenciones) el 16/09/2020 07:36:29
toda critica que me ayude a mejorar se agradece, por otra parte lo que pasa es que mi profe nos entrego una guía y nos pedían un método para cada cosa, y bueno en poo llevo una semana mas o menos y voy poco a poco aprendiendo y adaptándome al lenguaje que de primeras fue un poco complicado pero bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 63
Ha disminuido su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por smn (21 intervenciones) el 16/09/2020 21:39:55
ahi lo arregle un poco

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public void imprimir(){
        System.out.println((hora<10?"0":"") + hora + ":" + (minutos<10?"0":"") + minutos + ":" + (segundos<12?"0":"") + segundos + " " + (hora<=12?"Am":"Pm"));
        segundos += 1;
 
        if(segundos==60){
            segundos = 0;
            minutos += 1;
            if(minutos == 60){
                minutos = 0;
                hora += 1;
                if(hora >= 24){
                    hora = 0;
                }
            }
        }
    }
 
 
    @Override
    public String toString() {
        return "Reloj{" +
                "hora=" + hora +
                ", minutos=" + minutos +
                ", segundos=" + segundos +
                '}' + (segundos++);
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.977
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

un objeto no actualiza su tiempo como debería

Publicado por Rodrigo (529 intervenciones) el 16/09/2020 22:38:51
imprimir no deberia modificar el estado del reloj.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar