variable utilizo una programacion inicializar inicializacion float ejemplos contpaqi como java

utilizo - Los miembros de la clase sin inicializar en Java no emiten ningún error de compilación. Las variables locales sin embargo hacen. ¿Por qué?



se utilizo la variable local sin inicializar c++ (5)

Considere el siguiente fragmento de código en Java. No compilará.

package temppkg; final public class Main { private String x; private int y; private void show() { String z; int a; System.out.println(x.toString()); // Causes a NullPointerException but doesn''t issue a compiler error. System.out.println(y); // Works fine displaying its default value which is zero. System.out.println(z.toString()); // Causes a compile-time error - variable z might not have been initialized. System.out.println(a); // Causes a compile-time error - variable a might not have been initialized. } public static void main(String []args) { new Main().show(); } }

¿Por qué los miembros de la clase ( x e y ) declarados en el fragmento de código anterior no emiten ningún error en tiempo de compilación a pesar de que no están explícitamente inicializados y solo las variables locales deben inicializarse?


¿Por qué emitirían una advertencia de compilación ?, ya que las variables de instancia Cadena obtendrán un valor predeterminado de nulo e int obtendrán un valor predeterminado de 0.

El compilador no tiene forma de saber que x.toString () causará una excepción de tiempo de ejecución, porque el valor de nulo no se establece realmente hasta después del tiempo de ejecución.


En caso de duda, verifique la especificación del lenguaje Java (JLS).

En la introducción encontrarás:

El Capítulo 16 describe la manera precisa en que el idioma garantiza que las variables locales se establezcan definitivamente antes de su uso. Mientras que todas las demás variables se inicializan automáticamente a un valor predeterminado, el lenguaje de programación Java no inicializa automáticamente las variables locales para evitar el enmascaramiento de los errores de programación.

El primer párrafo del capítulo 16 declara,

Cada variable local y cada campo final en blanco deben tener un valor definitivamente asignado cuando se produce cualquier acceso a su valor ... Un compilador de Java debe realizar un análisis de flujo conservador específico para asegurarse de que, para cada acceso de una variable local o en blanco el campo final f, f se asigna definitivamente antes del acceso; de lo contrario debe ocurrir un error en tiempo de compilación.

Los valores predeterminados están en la sección 4.12.5 . La sección se abre con:

Cada variable de clase, variable de instancia o componente de matriz se inicializa con un valor predeterminado cuando se crea.

... y luego continúa con una lista de todos los valores predeterminados.

El JLS realmente no es tan difícil de entender y me he encontrado usándolo cada vez más para comprender por qué Java hace lo que hace ... después de todo, ¡es la Biblia de Java!


En general, el compilador no podía saber con seguridad si un miembro de la clase se había inicializado o no. Por ejemplo, podría tener un método de establecimiento que establezca el valor para un miembro de la clase y otro método que acceda a ese miembro. El compilador no puede emitir una advertencia al acceder a esa variable porque no puede saber si el configurador ha sido llamado antes o no.

Estoy de acuerdo en que en este caso (el miembro es privado y no hay un método único que escriba la variable) parece que podría generar una advertencia desde el compilador. Bueno, de hecho, todavía no está seguro de que la variable no se haya inicializado, ya que podría haberse accedido a través de la reflexión.

Las variables locales son mucho más fáciles, ya que no se puede acceder a ellas desde fuera del método, ni tampoco a través de la reflexión (afaik, corríjame si está mal), por lo que el compilador puede ser un poco más útil y advertirnos de las variables no inicializadas.

Espero que esta respuesta te ayude :)


Las variables miembro se inicializan automáticamente a sus valores predeterminados cuando construye (crea una instancia) de un objeto. Esto es cierto incluso cuando los haya inicializado manualmente, primero se inicializarán a los valores predeterminados y luego a los valores que proporcionó.

Este es un artículo un poco largo pero lo explica: Inicialización de objetos en Java

Mientras que para las variables locales (las que se declaran dentro de un método) no se inicializan automáticamente, lo que significa que debe hacerlo manualmente, incluso si desea que tengan sus valores predeterminados.

Puede ver cuáles son los valores predeterminados para las variables con diferentes tipos de datos here .

El valor predeterminado para las variables de tipo de referencia es null . Es por eso que está lanzando NullPointerException en lo siguiente:

System.out.println(x.toString()); // Causes a NullPointerException but doesn''t issue a compiler error.

En el siguiente caso, el compilador es lo suficientemente inteligente como para saber que la variable no está inicializada todavía (porque es local y no la ha inicializado), por eso es un problema de compilación:

System.out.println(z.toString()); // "Cuases a compile-time error - variable z might not have been initialized.


Los miembros de la clase podrían haberse inicializado en otra parte de su código, por lo que el compilador no puede ver si se inicializaron en el momento de la compilación.