Este código es realmente simple, pero no puedo hacer que funcione. Sigue diciendo que la matriz se sale de los límites en la línea 8 (el ciclo while) y no tengo idea de por qué, porque u se restablece cada vez. ¿Algunas ideas? Probablemente sea una solución simple, pero gracias por la ayuda.

public class potato {
    public static void main(String[] args) {
        int year;
        int day = (int)((System.currentTimeMillis() + java.util.TimeZone.getDefault().getRawOffset()) / 1000.0 / 60.0 / 60.0 / 24.0);
        int[] months = {31,28,31,30,31,30,31,31,30,31,30,31};
        int u;
        for (year = 1970; year < 2018; year++) {
            u = 0;
            while (day > months[u] && u < 12) {
                day -= months[u];
                u++;
            }
        }
    }
}
0
Isaak Johnson 27 feb. 2018 a las 07:33

4 respuestas

La mejor respuesta

Verifique el valor de la variable u antes de verificar los días. Cambie la condición del bucle a

 while ( u < 12 && day > months[u] )
2
moh ro 27 feb. 2018 a las 05:05

Si miras de cerca aquí

 u = 0;
 while (day > months[u] && u < 12) {
                    day -= months[u];
                    u++;
                }

En realidad está accediendo a la matriz en el encabezado del bucle while cuando la incrementa. Vuelve a probar la matriz que causa months[12] que está fuera de límite.

Similar a la respuesta anterior cuando dice while(u<12&&day>months[u]) utiliza los métodos de prueba de cortocircuito. Entonces, cuando u==12 cancela inmediatamente la entrada al bucle y también cancela la prueba de la segunda condición.

1
arc 27 feb. 2018 a las 04:39

Esto se debe a su condición de tiempo.

int monthsLength = months.length()-1;
// So it contains 0-11 index values

// Pero en su condición comprueba el índice 12 en meses [u]. Esto arroja la excepción de índice fuera de límites. Modifique su condición while a: while (día> meses [u] && u

0
gnana jeyam95 27 feb. 2018 a las 05:00

Probablemente esta no sea una respuesta a la pregunta, pero. He mirado este ejemplo de código y tengo algunas notas.

  1. No está claro qué hace este código.
  2. Cuando trabaje con date, le recomendamos utilizar clases especiales: Calendar o YodaTime.
  3. No sé por qué, pero no te preocupes por los diferentes días en Febriary en el año bisiesto.
  4. System.currentTimeMillis() devuelve milisegundos entre la hora actual y la medianoche, January 1, 1970 UTC: por lo que no está claro por qué usa 1970 en el código.

Como ejemplo de código, mira este. Quizás te pueda ayudar.

public static int getDays(int yearFrom, int yearTo) {
    Calendar calendar = Calendar.getInstance();
    int days = getTotalDays(yearFrom, yearTo, calendar);

    for (int year = yearFrom; year < yearTo; year++) {
        calendar.set(Calendar.YEAR, year);

        for (int month = Calendar.JANUARY; month <= Calendar.DECEMBER; month++) {
            calendar.set(Calendar.MONTH, month);
            int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

            if (days <= maxDayOfMonth)
                break;

            days -= maxDayOfMonth;
        }
    }

    return days;
}

private static int getTotalDays(int yearFrom, int yearTo, Calendar calendar) {
    calendar.set(Calendar.DAY_OF_MONTH, 1);

    int days = 0;

    for (int year = yearFrom; year < yearTo; year++) {
        calendar.set(Calendar.YEAR, year);
        days += calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
    }

    return days;
}

P.S. No conozco el contexto de esta tarea, pero según el código, podría evitar todos los bucles entre 1970 y 1917 años y trabajar solo con el año actual.

0
oleg.cherednik 27 feb. 2018 a las 06:01