¿ Cada programador Java finalmente escribe un programa que produce el mensaje de error " NullPointerExceptions " . Es particularmente críptica para los que comienzan sus carreras de programación por aprendizaje de Java, que no expone a los programadores el concepto de un puntero. Punteros
Un puntero es un término informático para una variable que , en lugar de mantener un poco de información , mantiene un discurso a donde esa información se puede encontrar en la memoria de un ordenador. Se puede imaginar la variable como una señal de que " apunta" a que la información se puede encontrar . En lenguajes como C + + , el programador tiene que tomar una decisión explícita sobre si una determinada variable mantendrá la información directa o se mantenga en su lugar un puntero a la información y esta elección puede tener un profundo efecto en la eficiencia del programa . Por ejemplo, si una determinada clase tiene pocos megabytes de información que se debe pasar a una función , es mucho más eficaz para dar a la función un puntero que copiar toda la información directamente .
Repuestos programadores Java este dilema y los errores que se pueden producir al ocultar punteros del programador .
Null
Null es otro término especial en la informática. Hace referencia a una variable que contiene literalmente no hay información. Hasta que cierta información se asigna a la misma, que se dice que es igual a un valor nulo. Por ejemplo , en el siguiente código :
String s ; s = new String () ;
Una vez finalizada la primera línea, " s " es igual a null. Una vez finalizada la segunda línea, " s " es igual a una cadena vacía.
Punteros nulos
Aunque Java intenta ocultar punteros del programador, hay un caso en el que no puede hacerlo. Todas las clases son en realidad punteros a posiciones de memoria donde se pueden encontrar los datos de la clase. Esto hace que sea más rápido cuando las clases se deben pasar dentro y fuera de funciones . Sin embargo, en el ejemplo anterior, después de ejecutar la primera línea, un puntero se ha reservado para la " s ", pero no hay datos se ha creado. " s " no tiene reservado para que la memoria, por lo que es un " puntero nulo. "
excepciones de puntero nulo
Ahora que ya sabe lo que es un puntero nulo es , considere las siguientes dos líneas de código :
string s ; s.charAt ( 0 ) ; //Obtener el primer caracter de la cadena
el código está pidiendo el primer carácter de . un objeto de cadena que simplemente no existe . En otras palabras, se está pidiendo lo imposible. Tan pronto como esto ocurre , Java se da cuenta del problema y lanza una " NullPointerException " para que el usuario o el programador sabe que algo ha salido mal.
Ejemplo
más los programadores de Java nunca cometa el error anterior : saben objetos como cuerdas deben inicializar con el "nuevo " comando . Sin embargo , tenga en cuenta la siguiente función :
público impresión void (String s ) { System.out.println ( s ) ;}
Inicialmente , este código se ve bien : la función recibe una cadena de en otras partes del programa y lo imprime a la pantalla . Sin embargo , ¿qué pasa si la persona que ejecuta la función que se envía es una cadena que no se ha inicializado correctamente? A NullPointerException sería arrojado .
Depuración y Prevención
El primer paso para prevenir NullPointerExceptions es garantizar que los nuevos objetos de clase son siempre inicializado correctamente . Sin embargo , nadie es perfecto , por lo que el segundo paso es adquirir el hábito de realizar los datos policiales para las funciones. Los datos de entrada deben ser tratados siempre como indignos de confianza , por lo que la siguiente modificación se podría hacer :
impresión public boolean (String s ) { try { System.out.println ( s ) ; return true ; //Deja que el resto del programa saben que la operación fue exitosa } catch ( NullPointerException e) {return false; . . //Deja que el resto del programa conoce la operación falló } }
la ventaja de este enfoque proactivo es que el resto del programa se puede escribir para juzgar qué tan serio es el problema, en lugar de dejar inmediatamente y dar al usuario un mensaje de error feo y críptico .