Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

312
Vistas
Error de asignación definitiva con bucles for anidados

EDITAR No importa, resuelto. Ver solución en la parte inferior.

El siguiente ejemplo es una pregunta de prueba que necesito ayuda para comprender, y sé que no es una práctica estándar declarar e inicializar la variable de contador de bucle for por separado.

 int j,k; for(j=0; j<4; j++) { for(k = 0; k < 10; k++) { } } System.out.println(k);

Esto da un error de compilación de Java "k puede no haberse inicializado", específicamente llamado error de asignación definitiva . Java tiene un documento de Oracle sobre este error 16-2: https://docs.oracle.com/javase/specs/jls/se8/html/jls-16.html

Sin embargo, en esos ejemplos, la asignación de variables está dentro de algún condicional como un bucle if o while.

 if(true) k = 0;

Esto también daría el mismo error de compilación de inicialización porque Java no está 100% seguro de que se asignará k. Sin embargo, en mi código original, el bucle k for no está dentro de un condicional si o mientras. Como está escrito, ambos bucles siempre deben ejecutarse. Además, si el bucle k se escribiera sin anidarlo, se compilaría normalmente.

El problema es claramente que el anidamiento del ciclo k conduce a un error de inicialización. Sin embargo, mi confusión radica en por qué habría incertidumbre por parte del compilador con la asignación de "k". ¿Qué / por qué exactamente sobre un bucle for anidado (no calificado por un condicional) "ocultaría" la asignación de k?

Gracias.

EDITAR El bucle for externo también se puede considerar como una declaración if. j se inicializa, pero no es una garantía de que ejecutará su bloque de código, es decir, ingresará al bucle k interno. Por ejemplo, si la instrucción condicional en el ciclo j era for(j = 0; j < 0; j++) , j se inicializará pero no ingresará a su bloque de código y, por lo tanto, k no se inicializará. Por lo tanto, esta posibilidad de incertidumbre conduce a un error de compilación.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Tienes razón en que hay incertidumbre: k definitivamente se va a inicializar. Pero para entender esto, el compilador tendría que entender realmente (o evaluar alternativamente) su código.

Un compilador puede ser lo suficientemente inteligente para hacer esto para construcciones muy simples, pero en general esto es imposible, y el compilador de Java no es lo suficientemente inteligente para comprender su código particular (el ciclo externo, para ser precisos).

Para corregir el error del compilador, puede agregar una inicialización de k :

 int j, k = 0;
over 4 years ago · Santiago Trujillo Denunciar

0

Creo que es posible, que k no se inicialice. JVM podría verificar que el segundo ciclo esté vacío y nunca lo invocará. Es decir, podría verse así:

 for(j=0; j<4; j++) {}

No estoy seguro de haber descrito el comportamiento correcto de JVM, pero creo que tiene sentido.

De todos modos, creo que es una buena práctica (de C++ ): definir una variable e inicializarla allí mismo.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda