Erro de cast em enum - o retorno

Olá,

o problema:
quando eu altero a coluna status no grid funciona bem mas quando eu altero apenas outro(s) campo(s) do grid sem alterar o status dá o seguinte erro:

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: class br.com.alura.jdbc.modelo.Status cannot be cast to class java.lang.String (br.com.alura.jdbc.modelo.Status is in unnamed module of loader ‘app’; java.lang.String is in module java.base of loader ‘bootstrap’) at br.com.alura.jdbc.view.ProdutoCategoriaFrame2.alterar(ProdutoCategoriaFrame2.java:267)

segue o tercho de código do ProdutoCategoriaFrame2:

private void alterar() throws SQLException {
        Object objetoDaLinha = (Object) modelo.getValueAt(tabela.getSelectedRow(), tabela.getSelectedColumn());
        if (objetoDaLinha instanceof Integer) {
            Integer id = (Integer) objetoDaLinha;
            String nomeStr = (String) modelo.getValueAt(tabela.getSelectedRow(), 1);
            String nome = nomeStr.toUpperCase();
            String descricao = (String) modelo.getValueAt(tabela.getSelectedRow(), 2);
            Status status = Status.valueOf((String) modelo.getValueAt(tabela.getSelectedRow(), 3));
            Integer categoriaId =  Integer.parseInt(modelo.getValueAt(tabela.getSelectedRow(), 4).toString());
            this.produtoController.alterar(nome, descricao, status, id, categoriaId, null);
            JOptionPane.showMessageDialog(this, "Item alterado com sucesso!");
        } else {
            JOptionPane.showMessageDialog(this, "Por favor, selecionar o ID");
        }
    }

o enum:

package br.com.alura.jdbc.modelo;

public enum Status {

    EM_ESTOQUE, INDISPONIVEL, ENCOMENDADO; 

}

o DAO:

public void alterar(String nome, String descricao, Status status, Integer id, Integer categoriaId, String categoriaNome) throws SQLException {
        try (PreparedStatement stm = connection.prepareStatement("UPDATE PRODUTO SET NOME = ?, DESCRICAO = ?, STATUS=?, CATEGORIA_ID = ? WHERE ID = ?")) {
            stm.setString(1, nome);
            stm.setString(2, descricao);
            stm.setString(3, status.name().toString());
            stm.setInt(4, categoriaId);
            stm.setInt(5, id);
            stm.execute();
            connection.commit(); // controle da transação
        } 
        catch (SQLException e) {
            e.printStackTrace();
            connection.rollback();
            throw new RuntimeException(e);
        }
    }

toda ajuda é bem vinda! Valeu! :+1:

Status.valueOf((String) modelo.getValueAt(tabela.getSelectedRow(), 3));
Parece que a coluna 3 já está populada com o enum Status. Então não é necessário fazer cast para String.

Tente assim:
Status status = (Status) modelo.getValueAt(tabela.getSelectedRow(), 3);

Você tem várias chamadas a getSelectedRow, pode guardar numa variável local para o código ficar mais limpo.

fiz a alteração mas agora inverteu a situação: quando altero uma coluna que não seja a Status funciona ok e quando altero a coluna Status dá o erro abaixo:

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: class java.lang.String cannot be cast to class br.com.alura.jdbc.modelo.Status (java.lang.String is in module java.base of loader ‘bootstrap’; br.com.alura.jdbc.modelo.Status is in unnamed module of loader ‘app’)
at br.com.alura.jdbc.view.ProdutoCategoriaFrame2.alterar(ProdutoCategoriaFrame2.java:268)

Solução na classe ProdutoCategoriaFrame2:

	private void alterar() throws SQLException {
		Object objetoDaLinha = (Object) modelo.getValueAt(tabela.getSelectedRow(), tabela.getSelectedColumn());
		if (objetoDaLinha instanceof Integer) {
			Integer id = (Integer) objetoDaLinha;
			String nomeStr = (String) modelo.getValueAt(tabela.getSelectedRow(), 1);
			String nome = nomeStr.toUpperCase();
			String descricao = (String) modelo.getValueAt(tabela.getSelectedRow(), 2);
			Status status = Status.valueOf((String) modelo.getValueAt(tabela.getSelectedRow(), 3));

			Integer categoriaId =  Integer.parseInt(modelo.getValueAt(tabela.getSelectedRow(), 4).toString());
//			String categoriaIdStr = (String) modelo.getValueAt(tabela.getSelectedRow(), 4);
//			int categoriaId = Integer.parseInt(categoriaIdStr);			
			this.produtoController.alterar(nome, descricao, status, id, categoriaId, null);
			JOptionPane.showMessageDialog(this, "Item alterado com sucesso!");
		} else {
			JOptionPane.showMessageDialog(this, "Por favor, selecionar o ID");
		}
	}
	private void preencherTabela() {
		List<Produto> produtos = listarProduto();
		try {
			for (Produto produto : produtos) {
				modelo.addRow(new Object[] { produto.getId(), produto.getNome(), produto.getDescricao(), produto.getStatus().name(), produto.getCategoriaId(), produto.getCategoria() });
			}
		} catch (Exception e) {
			throw e;
		}
	}