Tips: Modo Debugger - Depuracion en NetBeans

Al intentar crear un programa-aplicación se nos presentan 3 tipos de errores:

  • Errores de sintaxis:
    • Por ejemplo al tipear mal una sentencia, un problema que nuestra IDE facilmente detecta y nos advierte con una linea roja debajo y hasta suguiere como solucionarlo.
  • Errores en tiempo de ejecución:
    • Cuando la sintaxis esta bien puesta pero la máquina virtual no puede ejecutar nuestras operaciones porque se le pide algo que no puede hacer como por ejemplo mostrar un indice de un array por el cual no esta definido o asignarle a un objeto un espacio de memoria que es nulo en lugar de de asignarle al espacio nulo lo que vale el objeto en su definicion clase.
      Algunos problemas puede identificarlo el IDE o nos arroja el nombre del problema y estos se tratan con bloques try-catch
  • Errores de lógica
    • No hay errores de tipeo, no hay errores de ejecucion, pero "simplemente el programa no hace lo que yo quiero que haga".

Para este tipo de problema existe el debug (Depuración) que permite compilar, ejecutar el programa y pararlo cuando se lo indiquemos para poder analizar paso a paso los valores de las variables y objetos para poder detectar algun problema.

Para hacer uno o varios Breakpoint no hace falta ser rafa Nadal, basta con hacer click izquierdo sobre el número de la linea donde queremos que el programa se detenga para ver que valores obtiene cada variable del programa (Es siempre asi en cualquier IDE).
Luego podemos continuar el programa hasta el siguiente breakponit si lo hubiera o lo termina de ejecutar hasta el fin.


Me imagino que quiero crear una aplicacion que sume 2 números dados cualesquiera y soy tan jodido que en mi método en lugar de poner el signo de sumar "+", me distraigo y pongo el de restar "-", claramente despues de unas prueba noto que 2 y 2 son 0 en lugar de 4. Mi código es el siguiente:

  1. package Depurar;
  2.  
  3. import java.util.Random;
  4.  
  5. /* @author {Darío José Zubaray} */
  6.  
  7. public class Depurar {
  8.     public static void main(String[] args) {
  9.         System.out.println(sumar(5,6));
  10.     }
  11.     public static int sumar(int num1, int num2){
  12.         int aux = num1 - num2;
  13.         return aux;
  14.     }
  15. }
  • Hay que tener en cuenta que java ejecuta nuestro codigo linea tras linea, hasta que en alguna de ellas nombre metodos o variables y salta a esas linea de codigo par a luego seguir.
  • Tambièn podemos cambiar los valores de estas variables en tiempo de ejecución.

Tips: Como reproducir sonidos en java

Para poder reproducir sonidos en java, por ejemplo al presionar un boton, tendremos que agregar el siguiente método en alún lugar de nuestra clase:

  1.     public void ReproducirSonido(String nombreSonido){
  2.        try {
  3.         AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(nombreSonido).getAbsoluteFile());
  4.         Clip clip = AudioSystem.getClip();
  5.         clip.open(audioInputStream);
  6.         clip.start();
  7.          System.out.println("Error al reproducir el sonido.");
  8.        }
  9.      }

Luego dejamos que nuestro IDE arregle las importaciones necesarias

  1. import java.awt.FlowLayout;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import javax.sound.sampled.AudioInputStream;
  7. import javax.sound.sampled.AudioSystem;
  8. import javax.sound.sampled.Clip;
  9. import javax.sound.sampled.LineUnavailableException;
  10. import javax.sound.sampled.UnsupportedAudioFileException;

Y ya simplmente ejecutamos el método pasando como parámetro un String con la dirección de directorio del archivo (solo lo he probado con archivos "wav").

Como antes es preferible contar con nuestro archivo dentro "TuEquipo / MisDocumentos/ NetBeansProjects/ TuProyecto/ Tupaquete" que va a ser el String del parametro para que se pueda encontrar y ejecutar el archivo.

Y Por ejemplo al crear una ventana con un boton que reproduzca algun sonido en particular(en la web hay cientos de paginas que brindan sonidos libres de derechos de autor para que puedan ser utilizados por cualquier usuario), en mi caso es un sonido de un disparo... el código es el siguiente:

  1. import java.awt.FlowLayout;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import javax.sound.sampled.AudioInputStream;
  7. import javax.sound.sampled.AudioSystem;
  8. import javax.sound.sampled.Clip;
  9. import javax.sound.sampled.LineUnavailableException;
  10. import javax.sound.sampled.UnsupportedAudioFileException;
  11. import javax.swing.JButton;
  12. import javax.swing.JFrame;
  13.  
  14. public class Sonido extends JFrame implements ActionListener{
  15.     JButton boton1 = new JButton("Pulsame");
  16.     public Sonido(){
  17.         super("Pulse el boton");
  18.         setSize(400,80);
  19.         setLocationRelativeTo(null);
  20.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21.         setLayout(new FlowLayout());
  22.         add(boton1);
  23.         boton1.addActionListener(this);
  24.         setVisible(true);
  25.     }
  26.     public static void main(String[] Dar10){
  27.         new Sonido();
  28.     }
  29.     public void ReproducirSonido(String nombreSonido){
  30.        try {
  31.         AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(nombreSonido).getAbsoluteFile());
  32.         Clip clip = AudioSystem.getClip();
  33.         clip.open(audioInputStream);
  34.         clip.start();
  35.          System.out.println("Error al reproducir el sonido.");
  36.        }
  37.      }
  38.     @Override
  39.     public void actionPerformed(ActionEvent e) {
  40.         if(e.getSource() == boton1){
  41.             ReproducirSonido("src/tiro.wav");
  42.         }
  43.     }
  44. }

El resultado visual es (no se llega a apreciar el momento de hacer click y escuchar el sonido, pero es asi)

Puedes escuchar y/o descargar el sonido que elegi puedes hacerlo en el siguiente en el enlace

Tips: Cómo poner un icono a una ventana JFrame

Este breve tutorial es para explicar como poner un icono propio en una ventana JFrame. Es aquel que vemos en la parte superior izquierda y tambien en la barra de tarea, generalmente en la parte inferior.
Por defecto nuestro IDE nos ejecuta el icono de aplicación java:

Antes de Comenzar vamos a necesitar tener nuestro icono de tamaño 16x16 en formato png:

Y ubicarlo, de ser posible para facilitar el código dentro del mismo paquete:

Cree un nuevo projecto: "Blog15" con un paquete y clase principal del mismo nombre.

Luego dentro del constructor de mi clase agrego estas 2 líneas de código:

  1. Image iconoPropio = Toolkit.getDefaultToolkit().getImage(getClass().getResource("carita.png"));
  2. setIconImage(iconoPropio);

Será necesario la importación de: "java.awt.*" para que "Image" y "toolkit" puedan funcionar correctamente.

Finalmente el código completo se verá asi:

  1. package blog15;
  2.  
  3. import java.awt.*;
  4. import javax.swing.*;
  5.  
  6. public class Blog15 extends JFrame {
  7.  
  8.     public Blog15(){
  9.         super("Cambiar Icono Personalizado");
  10.         setSize(400,100);
  11.         setLocationRelativeTo(null);
  12.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13.         Image iconoPropio = Toolkit.getDefaultToolkit().getImage(getClass().getResource("carita.png"));
  14.         setIconImage(iconoPropio);
  15.         setVisible(true);
  16.     }
  17.     public static void main(String[] args) {
  18.         new Blog15();
  19.     }
  20. }

Y el resultado final será:

Para hacerlo un poco mas divertido intentaremos hacer esto: la misma ventana JFrame pero con 2 botones que al ir presionandolos afectara al icono de la propia ventana.

  1. package blog15;
  2.  
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import javax.swing.*;
  7.  
  8. public class Blog15 extends JFrame implements ActionListener{
  9.  
  10.     JButton boton1 = new JButton("Personalizado");
  11.     JButton boton2 = new JButton("Estandar");
  12.     Image iconoPropio = Toolkit.getDefaultToolkit().getImage(getClass().getResource("carita.png"));
  13.  
  14.     public Blog15(){
  15.         super("Cambiar Icono Personalizado");
  16.         setSize(400,100);
  17.         setLocationRelativeTo(null);
  18.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  19.         setLayout(new FlowLayout());
  20.         boton1.addActionListener(this);
  21.         boton2.addActionListener(this);
  22.         boton2.setEnabled(false);
  23.         add(boton1);
  24.         add(boton2);
  25.         setVisible(true);
  26.     }
  27.     public static void main(String[] args) {
  28.         new Blog15();
  29.     }
  30.  
  31.     @Override
  32.     public void actionPerformed(ActionEvent e) {
  33.         if(e.getSource() == boton1){
  34.             setIconImage(iconoPropio);
  35.             boton1.setEnabled(false);
  36.             boton2.setEnabled(true);
  37.  
  38.         }
  39.         if(e.getSource() == boton2){
  40.             setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getClass().getName()));
  41.             boton1.setEnabled(true);
  42.             boton2.setEnabled(false);
  43.         }
  44.     }
  45. }