Como saber onde está o erro?

Tenho essa exception que está sendo camptada por um Thread.UncaughtExceptionHandler, mas como não dá o número da linha onde está o erro não tem como eu saber onde é o erro.

java.lang.IllegalArgumentException: Cannot format given Object as a Date at java.text.DateFormat.format(Unknown Source) at java.text.Format.format(Unknown Source) at javax.swing.JTable$DateRenderer.setValue(Unknown Source) at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(Unknown Source) at javax.swing.JTable.prepareRenderer(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source) at javax.swing.plaf.ComponentUI.update(Unknown Source) at javax.swing.JComponent.paintComponent(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JViewport.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JLayeredPane.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintToOffscreen(Unknown Source) at javax.swing.BufferStrategyPaintManager.paint(Unknown Source) at javax.swing.RepaintManager.paint(Unknown Source) at javax.swing.JComponent._paintImmediately(Unknown Source) at javax.swing.JComponent.paintImmediately(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source) at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at com.sikgraf.lib.contextmenu.MyEventQueue.dispatchEvent(MyEventQueue.java:29) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) java.lang.NullPointerException at com.sikgraf.lib.MinhaMyUncaughtExceptionHandler$1.run(MinhaMyUncaughtExceptionHandler.java:73)

Alguém teria alguma idéia como eu posso fazer?

javer ta claro o erro nas primeiras linhas

# java.lang.IllegalArgumentException: Cannot format given Object as a Date  
# at java.text.DateFormat.format(Unknown Source)  
# at java.text.Format.format(Unknown Source) 

tem algo a ver com o formato do seu objeto DATE

T+

Mesmo que você tivesse o número da linha, não iria adiantar muito, pela análise de seu stack trace. Em vez disso, ponha seus músculos cerebrais para serem exercitados - pelo jeito, em algum lugar você tenta usar um DateFormat para formatar algo que não é um java.util.Date. Por acaso você está tentando formatar uma String com um DateFormat? Olhe o model de seu JTable.

Sim, mas é um módulo com vários JTables que tem colunas data mas não dá para saber em qual, segue meu CellRenderer para datas:

[code]public class DateCellRenderer extends DefaultTableCellRenderer {

protected SimpleDateFormat dateFormat;
boolean controle = false;

public DateCellRenderer() {
    this("dd/MM/yyyy");
}

public DateCellRenderer(String format) {
    dateFormat = new SimpleDateFormat(format);
}

public DateCellRenderer(String format, boolean controle) {
    this.controle = controle;
    dateFormat = new SimpleDateFormat(format);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    if (value == null) {
        setValue("");
    } else {
        if (value instanceof Date) {
            setValue(dateFormat.format((Date) value));
        } else {
            Lib.log("Tipo = "+value.getClass());
            setValue("");
        }
    }

    setHorizontalAlignment(SwingConstants.CENTER);
    if (value != null && controle) {
        Date dataPrevisao = (Date) value;
        Calendar calendarioPrevisao = new GregorianCalendar();
        calendarioPrevisao.setTimeInMillis(dataPrevisao.getTime());

        Calendar calendarioAgora = new GregorianCalendar();
        if (calendarioAgora.after(calendarioPrevisao)) {
            setBackground(new Color(255, 63, 63)); // vermelho
            setForeground(Color.white);
        } else {
            setBackground(new Color(143, 152, 255)); // azul claro
            setForeground(Color.black);
        }
    }
    return this;
}

}[/code]

Acho que meus músculos cerebrais estão mesmo péssimos, estou desde de sexta-feira tentando encontrar esse problem e não consigo.

Veja a parte do model que seta os valores das colunas datas:

@Override public void setValueAt(Object value, int row, int col) { if (lista == null && lista.size() == 0) { return; } BaixaProducao item = this.lista.get(row); switch (col) { case 1: Date dataBaixa = null; try { dataBaixa = (Date) value; } catch (Exception ex) { Lib.log(ex.getMessage()); ex.printStackTrace(); } item.setDataBaixa(dataBaixa); break; case 2: Date horaBaixa = null; try { horaBaixa = (Date) value; } catch (Exception ex) { Lib.log(ex.getMessage()); ex.printStackTrace(); } item.setHoraBaixa(horaBaixa); break; case 3: ...
Nunca cai no catch.

Já tentou usar um breakpoint e ir debugando linha por linha?

É uma boa idéia, eu até poderia fazer isso se o problema não corresse apenas na máquina do cliente, na minha o problema não acontece.

Hum… isso é um bocadinho suspeito. Será que os .class na máquina do cliente estão exatamente iguais aos arquivos .class da sua máquina? Pode ser que seja uma versão mais antiga, que não tinha todas essas verificações para ver se o dado é um Date ou não.

Hum, agora só falta você me falar que sua aplicação não gera LOG nas entradas e saidas dos métodos? Por que gerar, você pode pegar no LOG em qual método ele está entrando e dando o erro…

Desculpe mas não entendi, entrada e saída do método? Que log voê se refere? Pode dar um exemplo?

Se você não sabe o que é, então é bem provavel que você não implementou isso…

Existem várias maneiras de fazer LOG… Exemplo usando o java.util.logging.Logger

public void metodoQualquer() {
  LOGGER.entering("log de entrada do método");
  //faz as operações
  LOGGER.exiting("log de saida do método");
}

Acima foi só um exemplo. Fazer isso método por método é um saco, por isso você pode usar AOP para facilitar a sua vida.

Em produção, qualquer exception que ocorre, você pode consultar o LOG e ter certeza em qual método houve a exception.

Abusando mais um pouco da sua paciência, o que é esse OAP? Como posso implementar isso somente com Java em uma aplicação Java Swing?
Dei uma procurada mas parece que são Frameworks para web.