Autor Tema: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException error  (Leído 8249 veces)

Gabriel69

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Hola a todos! Estoy comenzando a aprender a programar java, tengo 2 dudas; consiste en introducir 3 notas, redondearlas para luego sacar un promedio. Este código se puede volver mas eficiente y eficaz? Tengo problemas para que los datos pasen al txtArea, se que usa "setText" para agregar el texto, "append"para añadir. Pero aun asi no me sale :(


Código: [Seleccionar]
package JAVA;

import java.awt.EventQueue;

import javax.swing.JDialog;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTextField;

import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;

public class Catorce extends JDialog {

/**
*
*/
private static final long serialVersionUID = 2409303291509567329L;
private JTextField textField_Nota1;
private JTextField textField_Nota2;
private JTextField textField_Nota3;
private JTextArea txtS;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Catorce dialog = new Catorce();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the dialog.
*/
public Catorce() {
getContentPane().setFont(new Font("Tahoma", Font.PLAIN, 14));
setTitle("Reportes");
setBounds(100, 100, 450, 300);
getContentPane().setLayout(null);

JLabel lblNota_1 = new JLabel("Nota 1");
lblNota_1.setFont(new Font("Tahoma", Font.PLAIN, 13));
lblNota_1.setBounds(10, 11, 46, 14);
getContentPane().add(lblNota_1);

JLabel lblNota_2 = new JLabel("Nota 2");
lblNota_2.setFont(new Font("Tahoma", Font.PLAIN, 13));
lblNota_2.setBounds(10, 36, 46, 14);
getContentPane().add(lblNota_2);

JLabel lblNota_3 = new JLabel("Nota 3");
lblNota_3.setFont(new Font("Tahoma", Font.PLAIN, 13));
lblNota_3.setBounds(10, 61, 46, 14);
getContentPane().add(lblNota_3);

textField_Nota1 = new JTextField();
textField_Nota1.setBounds(83, 9, 86, 20);
getContentPane().add(textField_Nota1);
textField_Nota1.setColumns(10);

textField_Nota2 = new JTextField();
textField_Nota2.setBounds(83, 34, 86, 20);
getContentPane().add(textField_Nota2);
textField_Nota2.setColumns(10);

textField_Nota3 = new JTextField();
textField_Nota3.setBounds(83, 59, 86, 20);
getContentPane().add(textField_Nota3);
textField_Nota3.setColumns(10);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 92, 414, 158);
getContentPane().add(scrollPane);

JTextArea txtS = new JTextArea();
txtS.setBackground(Color.WHITE);
scrollPane.setViewportView(txtS);

JButton btnProcesar = new JButton("Procesar");
btnProcesar.addActionListener(new ActionListener() {


public void actionPerformed(ActionEvent arg0) {
double nota1 = 0, nota2 = 0, nota3=0;
long rpt1 = 0, rpt2 = 0, rpt3 = 0 ;
int suma;
nota1 = leerNota1();
nota2 = leerNota2();
nota3 = leerNota3();
rpt1 = Redondear1(nota1);
rpt2 = Redondear2(nota2);
rpt3 = Redondear3(nota3);
suma = Suma( rpt1, rpt2, rpt3);
//System.out.println(rpt1);
//System.out.println(rpt2);
//System.out.println(rpt3);
//System.out.println(suma);
mostrarResultado(rpt1, rpt2, rpt3, suma);
}
});
btnProcesar.setBounds(322, 8, 89, 23);
getContentPane().add(btnProcesar);
}

double leerNota1(){
return Double.parseDouble(textField_Nota1.getText());
}
double leerNota2(){
return Double.parseDouble(textField_Nota2.getText());
}
double leerNota3(){
return Double.parseDouble(textField_Nota3.getText());
}

long Redondear1(double nota1){
return Math.round(nota1);
}
long Redondear2(double nota2){
return Math.round(nota2);
}
long Redondear3(double nota3){
return Math.round(nota3);
}
int Suma(long rpt1, long rpt2, long rpt3){
//Se añade int para transformar de long a int
return (int)((rpt1 + rpt2 + rpt3)/3);
}
void mostrarResultado(long rpt1, long rpt2, long rpt3, int suma){
[color=blue][u]txtS.setText("Reporte");[/u][/color]
txtS.append("Nota 1 es: " + rpt1 + "\n");
txtS.append("Nota 2 es: " + rpt2 + "\n");
txtS.append("Nota 3 es: " + rpt3 + "\n");
txtS.append("Promedio: " + suma+ "\n");


}
}

Cuando ejecuto me sale error en la línea <<txtS.setText("Reporte");>> y en <<mostrarResultado(rpt1, rpt2, rpt3, suma);>>.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Apreciaría mucho su ayuda para entender en qué fallé.
« Última modificación: 16 de Abril 2021, 19:31 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Como paso los resultados de un método a el TxtArea en java
« Respuesta #1 en: 06 de Enero 2021, 00:43 »
Hola.
Tu error está en el constructor.
Cuando inicias el JTextArea txtS que tienes declarado como atributo, por error en realidad estás declarando un JTextArea nuevo.
Tienen el mismo nombre, pero son distintos.

Citar
JTextArea txtS = new JTextArea();
      txtS.setBackground(Color.WHITE);
      scrollPane.setViewportView(txtS);

Entonces, cuando pulsas el botón, el método intenta agregar texto al "verdadero" txtS, al declarado como atributo de clase. Pero como no se ha llegado a iniciar, porque por error has inicializado otro distinto, te da error de NullPointerException, que viene a significar que el "verdadero" txtS está en estado null, porque no se ha inicializado.

Basta con quitar el nombre de clase JTextArea en el constructor, para que ahora sí se inicialice el "verdadero" txtS.

Citar
txtS = new JTextArea();
      txtS.setBackground(Color.WHITE);
      scrollPane.setViewportView(txtS);

A veces, para evitar estos fallos tontos pero que luego puede costar mucho descubrirlos, puede venir bien usar la palabra reservada this para asegurarte de que estás inicializando el atributo de tu clase principal, y no "otra cosa" por error.

Citar
this.txtS = new JTextArea();
      txtS.setBackground(Color.WHITE);
      scrollPane.setViewportView(txtS);

Sobre optimizar...
Bueno, en principio no necesitas tres métodos para redondear.
Te bastaría con uno, al que llamarías tres veces pasándole una nota distintas cada vez.
Pero es que de todos modos esos métodos lo que hacen es retornar el resultado que proporciona un método de la clase Math, así que en realidad directamente puedes llamarle a él sin necesitar de crear un método intermedio.
Lo mismo con las lecturas de los campos de texto.

Así ahorras líneas de código innecesarias:

Citar
public class Catorce extends JDialog {

   /**
    *
    */
   private static final long serialVersionUID = 2409303291509567329L;
   private JTextField textField_Nota1;
   private JTextField textField_Nota2;
   private JTextField textField_Nota3;
   private JTextArea txtS;
   
   /**
    * Launch the application.
    */
   public static void main(String[] args) {
      EventQueue.invokeLater(new Runnable() {
         public void run() {
            try {
               Catorce dialog = new Catorce();
               dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
               dialog.setVisible(true);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });
   }

   /**
    * Create the dialog.
    */
   public Catorce() {
      getContentPane().setFont(new Font("Tahoma", Font.PLAIN, 14));
      setTitle("Reportes");
      setBounds(100, 100, 450, 300);
      getContentPane().setLayout(null);
     
      JLabel lblNota_1 = new JLabel("Nota 1");
      lblNota_1.setFont(new Font("Tahoma", Font.PLAIN, 13));
      lblNota_1.setBounds(10, 11, 46, 14);
      getContentPane().add(lblNota_1);
     
      JLabel lblNota_2 = new JLabel("Nota 2");
      lblNota_2.setFont(new Font("Tahoma", Font.PLAIN, 13));
      lblNota_2.setBounds(10, 36, 46, 14);
      getContentPane().add(lblNota_2);
     
      JLabel lblNota_3 = new JLabel("Nota 3");
      lblNota_3.setFont(new Font("Tahoma", Font.PLAIN, 13));
      lblNota_3.setBounds(10, 61, 46, 14);
      getContentPane().add(lblNota_3);
     
      textField_Nota1 = new JTextField();
      textField_Nota1.setBounds(83, 9, 86, 20);
      getContentPane().add(textField_Nota1);
      textField_Nota1.setColumns(10);
     
      textField_Nota2 = new JTextField();
      textField_Nota2.setBounds(83, 34, 86, 20);
      getContentPane().add(textField_Nota2);
      textField_Nota2.setColumns(10);
     
      textField_Nota3 = new JTextField();
      textField_Nota3.setBounds(83, 59, 86, 20);
      getContentPane().add(textField_Nota3);
      textField_Nota3.setColumns(10);
     
      JScrollPane scrollPane = new JScrollPane();
      scrollPane.setBounds(10, 92, 414, 158);
      getContentPane().add(scrollPane);
     
      this.txtS = new JTextArea();
      txtS.setBackground(Color.WHITE);
      scrollPane.setViewportView(txtS);
     
      JButton btnProcesar = new JButton("Procesar");
      btnProcesar.addActionListener(new ActionListener() {
         

         public void actionPerformed(ActionEvent arg0) {
            double nota1 = 0, nota2 = 0, nota3=0;
            long rpt1 = 0, rpt2 = 0, rpt3 = 0 ;
            int suma;
            nota1 = Double.parseDouble(textField_Nota1.getText());
            nota2 = Double.parseDouble(textField_Nota2.getText());
            nota3 = Double.parseDouble(textField_Nota3.getText());
            rpt1 = Math.round(nota1);
            rpt2 = Math.round(nota2);
            rpt3 = Math.round(nota3);

            suma = Suma( rpt1, rpt2, rpt3);
            mostrarResultado(rpt1, rpt2, rpt3, suma);
         }
      });
      btnProcesar.setBounds(322, 8, 89, 23);
      getContentPane().add(btnProcesar);
   }
   
   private int Suma(long rpt1, long rpt2, long rpt3){
      //Se añade int para transformar de long a int
       return (int)((rpt1 + rpt2 + rpt3)/3);
      }
   private void mostrarResultado(long rpt1, long rpt2, long rpt3, int suma){
      txtS.setText("Reporte\n");
      txtS.append("Nota 1 es: " + rpt1 + "\n");
      txtS.append("Nota 2 es: " + rpt2 + "\n");
      txtS.append("Nota 3 es: " + rpt3 + "\n");
      txtS.append("Promedio: " + suma+ "\n");
   }
}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Gabriel69

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re: Como paso los resultados de un método a el TxtArea en java
« Respuesta #2 en: 10 de Enero 2021, 02:53 »
Muchas gracias, se logró resolver. Entiendo que son errores tontos, pero ya le estoy agarrando la maña. Otra vez! Muchas Gracias!  :)
« Última modificación: 16 de Abril 2021, 19:33 por Ogramar »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".