Foro de elhacker.net

Programación => Java => Mensaje iniciado por: cesariox23 en 26 Julio 2014, 06:04 am



Título: Error en valor de devolución de un método privado
Publicado por: cesariox23 en 26 Julio 2014, 06:04 am
Estimados señores, los saludo muy cordialmente y paso a exponer mi duda. Soy programador principiante y autodidacta, he estado realizando un ejercicio que consiste en crear una clase llamada Fecha con 3 campos miembro: Year, Month y Day, el ejercicio pide además que se hagan ciertas comprobaciones para asegurar que solo se introducen datos válidos.

En el archivo Fecha.java está la definición de la clase principal y consideré oportuno definir métodos privados para la verificación interna de los datos, el problema está en el método privado nameMonth que debería devolver el nombre del mes en función del valor numérico del campo miembro Month, me sale error en la línea al final de la estructura switch donde está la instrucción: "return nombre", el compilador me dice que la variable no está inicializada, como debería inicializar la variable nombre para que el método funcione correctamente?

Archivo Fecha.java
Código
  1. /* Definicion general de la clase Fecha */
  2.  
  3. public class Fecha
  4. {
  5.    private int year, month, day;
  6.  
  7.    public Fecha(int y, int m, int d)
  8.    {
  9.        year = (y <= 0) ? 2014 : y;
  10.        month = verifyMonth(m);
  11.        day = verifyDay(d);
  12.    }
  13.  
  14.    /* Metodo privado que devuelve el nombre del mes en funcion a su numero */
  15.    private String nameMonth(int mes)
  16.    {
  17.        String nombre;
  18.  
  19.        switch(mes)
  20.        {
  21.            case 1:
  22.                nombre = "Enero";
  23.                break;
  24.            case 2:
  25.                nombre = "Febrero";
  26.                break;
  27.            case 3:
  28.                nombre = "Marzo";
  29.                break;
  30.            case 4:
  31.                nombre = "Abril";
  32.                break;
  33.            case 5:
  34.                nombre = "Mayo";
  35.                break;
  36.            case 6:
  37.                nombre = "Junio";
  38.                break;
  39.            case 7:
  40.                nombre = "Julio";
  41.                break;
  42.            case 8:
  43.                nombre = "Agosto";
  44.                break;
  45.            case 9:
  46.                nombre = "Septiembre";
  47.                break;
  48.            case 10:
  49.                nombre = "Octubre";
  50.                break;
  51.            case 11:
  52.                nombre = "Noviembre";
  53.                break;
  54.            case 12:
  55.                nombre = "Diciembre";
  56.                break;
  57.        }
  58.  
  59.        return nombre;
  60.    }
  61.  
  62.    /* Metodo privado para saber si un year es bisiesto */
  63.    private boolean Bisiesto(int y)
  64.    {
  65.        if((y % 4 == 0) && (!(y % 100 == 0) || (y % 400 == 0)))
  66.            return true;
  67.        else
  68.            return false;
  69.    }
  70.  
  71.    /* Metodo privado para verificar si el mes asignado es el correcto */
  72.    private int verifyMonth(int mes)
  73.    {
  74.        int valor;
  75.  
  76.        if(mes <= 0)
  77.            valor = 1;
  78.        else if(mes > 12)
  79.            valor = 12;
  80.        else
  81.            valor = mes;
  82.  
  83.        return valor;                
  84.    }
  85.  
  86.    /* Metodo para verificar si el dia asignado es el correcto */
  87.    private int verifyDay(int dia)
  88.    {
  89.        int maximo, valor;
  90.  
  91.        /* Evaluando el valor de los campos miembro month y year para determinar el maximo valor en dias de cada mes  */
  92.        switch(month)
  93.        {
  94.            case 4:
  95.            case 6:
  96.            case 9:
  97.            case 11:
  98.                maximo = 30;
  99.                break;
  100.            case 2:
  101.                maximo = (Bisiesto(year)) ? 29 : 28;
  102.                break;
  103.            default:
  104.                maximo = 31;
  105.                break;
  106.        }
  107.  
  108.        if(dia <= 0)
  109.            valor = 1;
  110.        else if(dia > maximo)
  111.            valor = maximo;
  112.        else
  113.            valor = dia;
  114.  
  115.        return valor;            
  116.    }
  117.  
  118.    /* Metodo para mostrar la fecha */
  119.    public String mostrarFecha()
  120.    {
  121.        String fecha = String.format("%d de %s de %d", day, nameMonth(month), year);
  122.        return fecha;
  123.    }
  124. }
  125.  

Archivo PruebaFecha.java
Código
  1. /* Prueba general de la clase Fecha */
  2. import java.util.Scanner;
  3.  
  4. public class PruebaFecha
  5. {
  6.    public static void main(String args[])
  7.    {
  8.        Scanner entrada = new Scanner(System.in);
  9.        Fecha miFecha = new Fecha(2014, 6, 2);
  10.  
  11.        System.out.printf("\nLa fecha es %s\n", miFecha.mostrarFecha());
  12.    }
  13. }
  14.  

De antemano les agradezco cualquier ayuda que puedan darme, saludos y éxitos a todos.


Título: Re: Error en valor de devolución de un método privado
Publicado por: engel lex en 26 Julio 2014, 06:13 am
es un error capcioso :P el compilador te dice "la variable no está inicializada" y es cierto...

Código
  1. String nombre;

ahí la variable está declarada pero no incializada (es decir, fue reservado el espacio de memoria, pero no se le colocó un valor inicial) java no acepta del todo esto...

debes colocarle algo inicialmente
Código
  1. String nombre = "";

le estás colocando una cadena vacía, esto asegura que tenga un valor inicial coherente y acorde con el tipo de variable...


Título: Re: Error en valor de devolución de un método privado
Publicado por: cesariox23 en 28 Julio 2014, 03:24 am
Ah, ese era el problema, yo estaba bien creído que los datos de tipo String se declaraban y no se tenían que inicializar, asi como se declara un int por ejemplo. Te agradezco mucho que me hayas echado una mano.


Título: Re: Error en valor de devolución de un método privado
Publicado por: engel lex en 30 Julio 2014, 02:28 am
Ah, ese era el problema, yo estaba bien creído que los datos de tipo String se declaraban y no se tenían que inicializar, asi como se declara un int por ejemplo. Te agradezco mucho que me hayas echado una mano.

todos los tipos de variable es importante inicializarlas por seguridad, el asunto con un int es que contiene basura que siempre corresponderá a su tipo (todo binario puede ser interpretado como entero) pero en string probablemente al no tener coherentemente el carácter final (fin de string "\0") o tener un contenido invalido falle...