Insert com chave estrangeira

Estou tentando fazer um insert com chave estrangeira porém nao estou conseguindo, dando o seguinte erro

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException at Model.DAO.AgendamentoDAO.insert(AgendamentoDAO.java:44) at Controller.AgendaController.agendar(AgendaController.java:71) at View.Agenda.ButtonAgendarActionPerformed(Agenda.java:180) at View.Agenda.access$300(Agenda.java:22) at View.Agenda$4.actionPerformed(Agenda.java:148) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6533) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6298) at java.awt.Container.processEvent(Container.java:2237) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2295) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4526) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467) at java.awt.Container.dispatchEventImpl(Container.java:2281) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

segue o meu método de insert

public void insert(Agendamento agendamento) throws SQLException{

    String sql = "insert into agendamento(id_cliente,id_servico,valor,data,observacao)values('" + agendamento.getCliente().getId() + "','" + agendamento.getServico().getId() + "','" + agendamento.getValor() + "','" + agendamento.getData() + "','" + agendamento.getObservacao() + "')";

    PreparedStatement statement = connection.prepareStatement(sql);
    statement.execute();
    connection.close();
}

O que tem nesta linha?

Você está passando uma String literal ao invés do id do cliente e do serviço.

Uma dica pra ver se a query montada está correta é pegar a query e jogar no console SQL do SGBD que está usando e executar pra ver se dar certo ou errado.

Outro detalhe é ter cuidado pra não usar palavras reservadas como data. É uma data de cadastro, de vencimento? Se for utilize “data_cadastro” ou “data_nascimento” pra não correr o risco citado antes.

De antemão, a query seria montada assim:

INSERT INTO agendamento (id_cliente, id_servico, valor, data, observacao) VALUES (agendamento.getCliente().getId(), agendamento.getServico().getId(), agendamento.getValor(), agendamento.getData(), agendamento.getObservacao());

Nada disso explica o nullpointerexception que é o erro apresentado.

Realmente não explica. Com o código da classe que está indicando o erro ficaria mais fácil.
Pode ser que cliente, servico ou agenda ainda não foram criados. Pode ser essa a causa do NullPointerException.

Model.DAO.AgendamentoDAO.insert(AgendamentoDAO.java:44) at Controller.AgendaController.agendar(AgendaController.java:71) at