stackoverflow community. I'm doing a java application that adds, updates, or deletes the cells of a jTable and then saves the values in a text file. When I open the application for the first time and make the respective modifications to the table, I find no problem saving the changes in the file. However, when I close the application and open it again, I get a nullpointerexception when I try to save any changes which ends up eliminating all the entries that were in the text file.
Only when the table is empty is it that it starts saving the changes again without any problem.
Here I pass my code:
package Frame;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
public class Registrar_herramienta extends javax.swing.JFrame {
Object[] row = new Object[6];
Object[] columns = {"CODIGO", "NOMBRE", "ESTADO", "DISPONIBILIDAD", "FECHA", "PERSONA"};
DefaultTableModel model = new DefaultTableModel();
public Registrar_herramienta() {
initComponents();
model.setColumnIdentifiers(columns);
jTableHerramientas.setModel(model);
CargarTabla();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
txt1 = new javax.swing.JLabel();
txt2 = new javax.swing.JLabel();
txt3 = new javax.swing.JLabel();
txtCodigo = new javax.swing.JTextField();
txtEstado = new javax.swing.JTextField();
txtNombre = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
jTableHerramientas = new javax.swing.JTable();
jButton1 = new javax.swing.JButton();
btnRegistrar = new javax.swing.JButton();
btnEliminar = new javax.swing.JButton();
btnActualizar = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel2.setBackground(new java.awt.Color(255, 255, 255));
jPanel2.setPreferredSize(new java.awt.Dimension(700, 600));
jPanel2.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
jLabel1.setFont(new java.awt.Font("Comic Sans MS", 0, 36)); // NOI18N
jLabel1.setForeground(new java.awt.Color(0, 102, 255));
jLabel1.setText("REGISTRAR HERRAMIENTA");
jPanel2.add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(200, 30, 530, 50));
txt1.setFont(new java.awt.Font("Comic Sans MS", 0, 14)); // NOI18N
txt1.setForeground(new java.awt.Color(0, 102, 255));
txt1.setText("Código de la herramienta");
jPanel2.add(txt1, new org.netbeans.lib.awtextra.AbsoluteConstraints(150, 110, 170, 40));
txt2.setFont(new java.awt.Font("Comic Sans MS", 0, 14)); // NOI18N
txt2.setForeground(new java.awt.Color(0, 102, 255));
txt2.setText("Nombre de la herramienta");
jPanel2.add(txt2, new org.netbeans.lib.awtextra.AbsoluteConstraints(340, 110, 180, 40));
txt3.setFont(new java.awt.Font("Comic Sans MS", 0, 14)); // NOI18N
txt3.setForeground(new java.awt.Color(0, 102, 255));
txt3.setText("Estado de la herramienta");
jPanel2.add(txt3, new org.netbeans.lib.awtextra.AbsoluteConstraints(560, 110, 180, 40));
txtCodigo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtCodigoActionPerformed(evt);
}
});
jPanel2.add(txtCodigo, new org.netbeans.lib.awtextra.AbsoluteConstraints(150, 160, 160, -1));
txtEstado.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtEstadoActionPerformed(evt);
}
});
jPanel2.add(txtEstado, new org.netbeans.lib.awtextra.AbsoluteConstraints(560, 160, 160, -1));
txtNombre.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtNombreActionPerformed(evt);
}
});
jPanel2.add(txtNombre, new org.netbeans.lib.awtextra.AbsoluteConstraints(340, 160, 170, -1));
jTableHerramientas.setAutoCreateRowSorter(true);
jTableHerramientas.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"codigo", "nombre", "estado", "disponibilidad"
}
));
jScrollPane1.setViewportView(jTableHerramientas);
jPanel2.add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 250, 640, 170));
jButton1.setText("MENÚ PRINCIPAL");
jButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jPanel2.add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(710, 490, 160, 60));
btnRegistrar.setText("Registrar");
btnRegistrar.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
btnRegistrar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRegistrarActionPerformed(evt);
}
});
jPanel2.add(btnRegistrar, new org.netbeans.lib.awtextra.AbsoluteConstraints(310, 200, -1, -1));
btnEliminar.setText("Eliminar");
btnEliminar.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
btnEliminar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnEliminarActionPerformed(evt);
}
});
jPanel2.add(btnEliminar, new org.netbeans.lib.awtextra.AbsoluteConstraints(510, 200, -1, -1));
btnActualizar.setText("Actualizar");
btnActualizar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnActualizarActionPerformed(evt);
}
});
jPanel2.add(btnActualizar, new org.netbeans.lib.awtextra.AbsoluteConstraints(410, 200, 80, -1));
jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/bloggif_5bf986ae7727a.png"))); // NOI18N
jPanel2.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(230, 450, 430, 120));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, 589, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Menu abrir = new Menu();
abrir.setVisible(true);
this.setVisible(false);
}
private void btnRegistrarActionPerformed(java.awt.event.ActionEvent evt) {
if(ValidarVacio() == true){
MensajeError();
}
else{
row[0] = txtCodigo.getText();
row[1] = txtNombre.getText();
row[2] = txtEstado.getText();
row[3] = "SI";
row[4] = "";
row[5] = "";
JOptionPane.showMessageDialog(null, "Registro Exitoso!");
model.addRow(row);
GuardarTabla();
}
}
private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) {
int i = jTableHerramientas.getSelectedRow();
if(i >= 0){
JOptionPane.showMessageDialog(null, "Registro Eliminado!");
model.removeRow(i);
GuardarTabla();
}
else{
JOptionPane.showMessageDialog(null, "Error al eliminar.");
}
}
private void btnActualizarActionPerformed(java.awt.event.ActionEvent evt) {
int i = jTableHerramientas.getSelectedRow();
if(ValidarVacio() == true){
MensajeError();
}
else{
if(i >= 0){
JOptionPane.showMessageDialog(null, "Actualizacion Exitosa!");
model.setValueAt(txtCodigo.getText(), i,0);
model.setValueAt(txtNombre.getText(), i,1);
model.setValueAt(txtEstado.getText(), i,2);
model.setValueAt("", i, 4);
model.setValueAt("", i, 5);
GuardarTabla();
}
else{
JOptionPane.showMessageDialog(null, "Error al actualizar.");
}
}
}
public static void main(String args[]) {
...
}
public static void MensajeError(){
JOptionPane.showMessageDialog(null, "Faltan llenar campos!");
}
public boolean ValidarVacio(){
boolean bool = false;
if(txtCodigo.getText().isEmpty()){
bool = true;
}
else if(txtNombre.getText().isEmpty()){
bool = true;
}
else if(txtEstado.getText().isEmpty()){
bool = true;
}
else {
bool = false;
}
return bool;
}
public void GuardarTabla(){
String filePath = "herramientas.txt";
File file = new File(filePath);
try{
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
for(int i = 0; i < jTableHerramientas.getRowCount(); i++){
for(int j = 0; j < jTableHerramientas.getColumnCount(); j++){
bw.write(jTableHerramientas.getValueAt(i,j).toString()+",");
}
bw.newLine();
}
bw.close();
fw.close();
JOptionPane.showMessageDialog(null, "Se ha guardadoo la tabla!");
}catch(Exception e){
JOptionPane.showMessageDialog(rootPane, e);
}
}
public void CargarTabla(){
String filePath = "herramientas.txt";
File file = new File(filePath);
try{
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
DefaultTableModel model = (DefaultTableModel) jTableHerramientas.getModel();
Object[] lines = br.lines().toArray();
for (Object line : lines) {
String[] row = line.toString().split(",");
model.addRow(row);
}
JOptionPane.showMessageDialog(null, "Se ha cargado la tabla!");
}catch(Exception e){
e.printStackTrace(System.out);
}
}
// Variables declaration - do not modify
private javax.swing.JButton btnActualizar;
private javax.swing.JButton btnEliminar;
private javax.swing.JButton btnRegistrar;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTableHerramientas;
private javax.swing.JLabel txt1;
private javax.swing.JLabel txt2;
private javax.swing.JLabel txt3;
private javax.swing.JTextField txtCodigo;
private javax.swing.JTextField txtEstado;
private javax.swing.JTextField txtNombre;
// End of variables declaration
}