Archivo

Archivo para la categoría ‘java’

Errores comunes al programar en JAVA

Monday, 23 de March de 2009
Comments Off

Si ha estado trabajando con Java por algún tiempo, es seguro que habrá cometido estos errores al menos un par de veces. Los errores de programación en Java, así como en otros lenguajes, ocurren más que todo en la sintaxis y errores en la lógica. Los errores en la sintaxis son causados cuando el compilar Java (javac) no puede reconocer la sentencia. Esto causa que el compilador devuelva un mensaje de error, usualmente con una línea de código de referencia. También se conoce a los errores de sintaxis como errores en tiempo de compilación.

Los errores de lógica son conocidos como BUGS. Estos son los errores que nos tomarán tiempo hasta encontrarlos. Si damos a elegir, cualquier programador elegiría los errores en tiempo de compilación. A mi me ha tomado hasta varios días hacer el debug cuando suceden errores de lógica, y eso, usando todas las herramientas disponibles: archivos logs, mensajes System.out, debuggers, etc.

Los siguientes errores aparecen en la mayoría de programadores cada cierto tiempo, pero podemos verlo regularmente en el código de los programadores novatos.

Tenemos que cuidarnos de estos errores para evitarlos y pulir nuestro código.

  • El nombre de la Clase pública no coincide con el nombre del archivo
    Cada archivo .java puede contener sólo una Clase pública. El nombre de esa Clase pública debe coincidir exactamente con el nombre del archivo antes de la extensión .java, respetando incluso las mayúsculas y minúsculas. Por ejemplo, una Clase pública llamada MyClass debe estar en un archivo MyClass.java y no en myclass.java. Este es un error de sintaxis.
  • Una Clase no está en el directorio correcto
    Este error de sintaxis ocurre si el comando javac no puede encontrar un archivo .java en el directorio esperado. Si una Clase está en el paquete por defecto (no tiene la declaración del package en la primera línea), entonces esta Clase pertenece al directorio actual de trabajo o al directorio donde apunta el flag sourcepath del javac. Si una Clase está a un paquete, entonces pertenece a un subdirectorio debajo del directorio actual de trabajo o a un subdirectorio debajo del directorio donde apunta el flan sourcepath del javac. Por ejemplo, si existe una Clase llamada com.hello.HelloWorld entonces su nombre es HelloWorld y su paquete es com.hello. Si el flan sourcepath está configurada a c:src, entonces el archivo HelloWorld.java debe estar ubicado en el subdirectorio: c:srccomhello.
  • Usando equals contra la asignación ( == versus = )
    En Java este error puede ser incluso un error de lógica o sintaxis. Para comparar 2 referencias para igualarlas se usa el operador == (el operador de igualdad). Para asignar el valor de la derecha a la variable de la izquierda se usa el operador = (operador de asignación). Los programadores novatos a veces escriben: if (miValor = valorEsperado) Este código intenta evaluar el valorEsperado como un valor booleano en lugar de intentar la evaluación de igualdad entre miValor y valorEsperado. Si valorEsperado es del tipo booleano, entonces el código tendrá un error de lógica y probará si el valorEsperado es verdadero o falso. Si valorEsperado no es del tipo booleano, entonces el código lanzará un error de compilación debido a que la estructura if requiere un valor booleano que sea retornado de la comparación (miValor = valorEsperado), pero en Java el operador = siempre retorna el valor de la derecha.
  • Error en mayúsculas y minúsculas.
    Java es un lenguaje case sensitive, esto es que debemos respetar las mayúsculas y minúsculas. (miVar no es igual a mivar). Si hacemos referencia a un identificador que no está bien escrito entonces obtendremos un error de sintaxis.
  • Olvidar que los índices en Java empiezan en 0.
    Los índices de los arreglos de Java y las listas empiezan en 0, myArray[0], o myList.get(0). Asegurarse que su loop for no cause errores por este motivo. Si hacemos más loops de los que son posibles, entonces obtendremos el error: ArrayIndexOutBounds exception. Si hacemos menos loops de los requeridos, entonces tendremos un error de lógica.
  • NullPointerException
    El NullPointerException, la maldición de los programadores en Java. Los NullPointerExceptions son errores de lógica causados cuando un programa intenta acceder a métodos o atributos en una referencia que está nula. Si nuestro objeto no ha sido inicializado o ha sido establecido a null con el operador =, entonces la llamada el método o el acceso a uno de sus atributos no es válido.

Espero que esta lista corta de errores de código le ayude a pensar de manera defensiva a la hora de escribir código. Mientras más errores evitemos, entonces más productivos seremos, tanto en tiempo de desarrollo como también el código más refinado.

VN:F [1.0.9_379]

Ancelot Programación, java , , ,

KeyEvent simple en java

Tuesday, 24 de February de 2009
Comments Off

Este código me fué de mucha ayuda cuando recién empecé a ver algo de java en el instituto, espero que le sirva a las nuevas generaciones de programadores.

Acá tenemos un keyListener, su función es captar los eventos del teclado,tanto con o sin modificadores, esto se refiere a si el usuario usa SHIFT o no.

El código está funcionando, es autónomo, para ejecutar el ejemplo se debe agregar al proyecto a darle RUN.

JAVA:
  1. package keyListener;
  2.  
  3. import javax.swing.*;
  4. import java.awt.event.*;
  5. import java.awt.BorderLayout;
  6. import java.awt.Dimension;
  7.  
  8. public class KeyEventDemo extends JPanel
  9. implements KeyListener,
  10. JTextArea displayArea;
  11. JTextField typingArea;
  12. static final String nuevaLinea = "\n";
  13.  
  14. public KeyEventDemo() {
  15. super(new BorderLayout());
  16.  
  17. JButton button = new JButton("Clear");
  18. button.addActionListener(this);
  19.  
  20. typingArea = new JTextField(20);
  21. typingArea.addKeyListener(this);
  22.  
  23. displayArea = new JTextArea();
  24. displayArea.setEditable(false);
  25. JScrollPane scrollPane = new JScrollPane(displayArea);
  26. scrollPane.setPreferredSize(new Dimension(375, 125));
  27.  
  28. add(typingArea, BorderLayout.PAGE_START);
  29. add(scrollPane, BorderLayout.CENTER);
  30. add(button, BorderLayout.PAGE_END);
  31. }
  32.  
  33. /** Handle the key typed event from the text field. */
  34. public void keyTyped(KeyEvent e) {
  35. displayInfo(e, "KEY TYPED: ");
  36. }
  37.  
  38. /** Handle the key pressed event from the text field. */
  39. public void keyPressed(KeyEvent e) {
  40. displayInfo(e, "KEY PRESSED: ");
  41. }
  42.  
  43. /** Handle the key released event from the text field. */
  44. public void keyReleased(KeyEvent e) {
  45. displayInfo(e, "KEY RELEASED: ");
  46. }
  47.  
  48. /** Handle the button click. */
  49. public void actionPerformed(ActionEvent e) {
  50. //Limpia los componentes de texto.
  51. displayArea.setText("");
  52. typingArea.setText("");
  53.  
  54. //Vuelve el foco al área de tipeo.
  55. typingArea.requestFocusInWindow();
  56. }
  57.  
  58. protected void displayInfo(KeyEvent e, String s){
  59. String keyString, modString, tmpString,
  60. actionString, locationString;
  61.  
  62. int id = e.getID();
  63. if (id == KeyEvent.KEY_TYPED) {
  64. char c = e.getKeyChar();
  65. keyString = "key character = '" + c + "'";
  66. } else {
  67. int keyCode = e.getKeyCode();
  68. keyString = "key code = " + keyCode
  69. + " ("
  70. + KeyEvent.getKeyText(keyCode)
  71. + ")";
  72. }
  73.  
  74. int modifiers = e.getModifiersEx();
  75. modString = "modificadores = " + modifiers;
  76. tmpString = KeyEvent.getModifiersExText(modifiers);
  77. if (tmpString.length()> 0) {
  78. modString += " (" + tmpString + ")";
  79. } else {
  80. modString += " (sin modificadores)";
  81. }
  82.  
  83. actionString = "¿Tecla de acción? ";
  84. if (e.isActionKey()) {
  85. actionString += "SI";
  86. } else {
  87. actionString += "NO";
  88. }
  89.  
  90. locationString = "Ubicación tecla: ";
  91. int location = e.getKeyLocation();
  92. if (location == KeyEvent.KEY_LOCATION_STANDARD) {
  93. locationString += "standard";
  94. } else if (location == KeyEvent.KEY_LOCATION_LEFT) {
  95. locationString += "izquierda";
  96. } else if (location == KeyEvent.KEY_LOCATION_RIGHT) {
  97. locationString += "derecha";
  98. } else if (location == KeyEvent.KEY_LOCATION_NUMPAD) {
  99. locationString += "numpad";
  100. } else {
  101. // (location == KeyEvent.KEY_LOCATION_UNKNOWN)
  102. locationString += "desconocido";
  103. }
  104.  
  105. displayArea.append(s + nuevaLinea
  106. + "    " + keyString + nuevaLinea
  107. + "    " + modString + nuevaLinea
  108. + "    " + actionString + nuevaLinea
  109. + "    " + locationString + nuevaLinea);
  110. displayArea.setCaretPosition(displayArea.getDocument().getLength());
  111. }
  112.  
  113. /**
  114. * Se crea la GUI y se muestra.
  115. */
  116. private static void createAndShowGUI() {
  117. //Se crea y setea la ventana.
  118. JFrame frame = new JFrame("KeyEventDemo");
  119. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  120.  
  121. //Se crea y setea el content pane.
  122. JComponent newContentPane = new KeyEventDemo();
  123. newContentPane.setOpaque(true); //content panes deben ser opacos
  124. frame.setContentPane(newContentPane);
  125.  
  126. //Muestra la ventana
  127. frame.pack();
  128. frame.setVisible(true);
  129. }
  130.  
  131. public static void main(String[] args) {
  132. //Creando y mostrando la gui de esta aplicación.
  133. javax.swing.SwingUtilities.invokeLater(new Runnable() {
  134. public void run() {
  135. createAndShowGUI();
  136. }
  137. });
  138. }
  139. }

VN:F [1.0.9_379]

Ancelot Programación, java , , ,

Calculadora simple con Java

Friday, 30 de January de 2009

Para todos nuestros amigos programadores que se setán recién iniciando en el tema, les tengo un pequeño tip para realizar una calculadora bastante simple, no me maten pero está hecha en una sola clase, les dije, es sólo un ejemplo.

Espero les sirva para poder hacer pruebas y familiarizarse con el lenguaje.

powered by Wordpress Multibox Plugin v1.3.5

calculadora simple en java

Leer más...

VN:F [1.0.9_379]

Ancelot Programación, java , ,

switch – case en java

Wednesday, 28 de January de 2009
Comments Off

Una de las mayores dificultades que yo mismo tengo es de recordar aquel código que casi nunca usamos, en mi caso es el switch-case, debido a mi costumbre a usar bloques for y la poca necesidad de usar switch-case, como me he dado cuenta que a muchos les pasa me dispuse a escribir un ejemplo acá.

EN JAVA la sentencia es Switch con la siguiente estructura

JAVA:
  1. switch (variable)
  2. {
  3. case valor_literal:
  4. codigo que ejecutamos;
  5. break;
  6. case otro_valor_literal:
  7. codigo que ejecutamos;
  8. break;
  9. default:
  10. codigo que ejecutamos;
  11. }

Si no les queda muy claro les pondré un ejemplo práctico :)

JAVA:
  1. int mes;
  2.  
  3. switch (mes) {
  4. case 1System.out.println("Enero"); break;
  5. case 2System.out.println("Febrero"); break;
  6. case 3System.out.println("Marzo"); break;
  7. case 4System.out.println("Abril"); break;
  8. case 5System.out.println("May0"); break;
  9. case 6System.out.println("Junio"); break;
  10. case 7System.out.println("Julio"); break;
  11. case 8System.out.println("Agosto"); break;
  12. case 9System.out.println("Septiembre"); break;
  13. case 10: System.out.println("Octubre"); break;
  14. case 11: System.out.println("Noviembre"); break;
  15. case 12: System.out.println("Diciembre"); break;
  16. }

Como podemos ver, la variable mes toma siempre solo un valor, por ejemplo 2, por lo tanto cae en el switch-case y cuando llega al case 2 imprime febrero y sale del bloque, es una forma más elegante y óptima de escribir nuestro código, dado que esta misma función la podemos hacer con un gran bloque de if y else.

VN:F [1.0.9_379]

Ancelot Programación, java , , ,

GWT : Google Web Toolkit

Tuesday, 27 de January de 2009

Como muchos saben hace un par de meses que estoy trabajando con GWT, lo que significa Google Web Toolkit, así que me decidí a escribir un poco sobre este tema, si bien esste blog ha sido concebido como una ayuda para la porgramación, se ha ido llenando de humor y anécdotas, si bien también era uno de los objetivos de este proyecto, empezaremos a equilibrar un poco la balanza.

powered by Wordpress Multibox Plugin v1.3.5

gwtGoogle Web Toolkit es una herramienta de desarrollo AJAX de Google destinada a desarrolladores Java. Las aplicaciones web (tanto GUI -Graphical User Interface- como RPC -Remote Procedure Call-) se escriben en Java usando el API GWT. Después los archivos Java se compilan en archivos JavaScript compactos, ofuscados y específicos del navegador. Un pequeño código de carga en JavaScript determina que archivos de script específico del navegador se deben utilizar dependiendo del navegador cliente. La librería API está licenciada bajo licencia Apache 2.0.

Leer más...

VN:F [1.0.9_379]

Ancelot Programación, java , , , , ,

Generador de Rut y Validador

Thursday, 22 de January de 2009

Muchos han esatdo buscando  una forma de validar si un RUT es válido o no, pero también hay muchos que necesitan probar sus aplicaciones y están usando sus propios RUTs, pero ¿qué pasa cuando necesitas hacer una prueba masivamente?, acá te traigo la solución...

Leer más...

VN:F [1.0.9_379]
Rating: 1.0/10 (1 voto cast)

Ancelot Programación, java , , , , , , ,