Alimentar ArrayList dentro de outra ArrayList

Boa noite, venho fazendo alguns projetos esses dias de OO, e gostaria de exibir os Veículos que meus Clientes(caso eles possuam algum), porém, na hora da exibição na jTable, ela dá exceção de “Index = 0, Size = 0”

minha classe básica:

import java.util.ArrayList;
import veiculo.Veiculo;

/**
 *
 * @author Matheus Prado
 */
public class Cliente {

    private ArrayList<Veiculo> veiculos;
    private String cpfCliente;
    private String nome;
    private String telefoneCliente;

    public Cliente() {
        this.veiculos = new ArrayList<>();
    }

    public ArrayList<Veiculo> getVeiculos() {
        return veiculos;
    }

    public void setVeiculos(ArrayList<Veiculo> veiculos) {
        this.veiculos = veiculos;
    }

    public String getCpfCliente() {
        return cpfCliente;
    }

    public void setCpfCliente(String cpfCliente) {
        this.cpfCliente = cpfCliente;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTelefoneCliente() {
        return telefoneCliente;
    }

    public void setTelefoneCliente(String telefoneCliente) {
        this.telefoneCliente = telefoneCliente;
    }

}

Meu método da classe de dados para realizar a pesquisa:

 @Override
    public ArrayList<Cliente> listarCliente(Cliente filtro) throws Exception, SQLException {
        int pos = 1;
        ArrayList<Cliente> retorno = new ArrayList<>();
        //instrução sql correspondente a inserção do aluno
        String sql = " SELECT c.cpf, c.nome, c.telefone from Cliente AS c LEFT JOIN Veiculo AS v ON c.cpf = v.cpf";

        //condicao para pesquisar cpf
        if (filtro.getCpfCliente().trim().length() > 0) {
            sql += " and c.cpf like ?";

        }

        //preparando a instrução
        PreparedStatement preparedStatement = super.conectar().prepareStatement(sql);

        //condicao para pesquisar cpf
        if (filtro.getCpfCliente().trim().length() > 0) {
            preparedStatement.setString(pos, filtro.getCpfCliente());
            pos++;

        }
        //executando a instrução sql
        ResultSet rs = preparedStatement.executeQuery();
        //lendo os resultados
        while (rs.next()) {
            Cliente a = new Cliente();
            a.setCpfCliente(rs.getString("cpf"));
            a.setNome(rs.getString("nome"));
            a.setTelefoneCliente(rs.getString("telefone"));
            filtro.getVeiculos().add(v);
            a.getVeiculos().get(i).setPlaca(rs.getString("placa"));
            retorno.add(a);
        }
        //fechando a conexão com o banco de dados
        super.desconectar();
        return retorno;
    }

Gostaria de saber se estou fazendo a alimentação de forma correta.

Minha exibição:

// Varável global
    ArrayList<Cliente> cli;

   private void jButtonPesAttCliActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        try {

            Cliente c = new Cliente();
            NegocioCliente dados = new NegocioCliente();
            c.setCpfCliente(jTextFieldCPFCliAtt.getText());
            this.cli = dados.listarCliente(c);
            DefaultTableModel modelo = new DefaultTableModel();
            String[] colunasDaTabela = {"CPF", "Nome", "Telefone", "Veículo"};
            modelo.setColumnIdentifiers(colunasDaTabela);
            for (Cliente cl : cli) {
                String[] linhas = {cl.getCpfCliente().trim(), cl.getNome().trim(), cl.getTelefoneCliente().trim(), cl.getVeiculo().get(/*qual index ?*/).getPlaca()};
                modelo.addRow(linhas);
            }

            jTable1.setModel(modelo);

        } catch (SQLException sq) {
            JOptionPane.showMessageDialog(rootPane, sq.getMessage());
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(rootPane, ex.getMessage());
        }

    }
        for (Cliente cl : cli) {
            for (Veiculo v: cl.getVeiculos()) {
                String[] linhas = {cl.getCpfCliente().trim(), cl.getNome().trim(), cl.getTelefoneCliente().trim(), v.getPlaca()};
                modelo.addRow(linhas);
            }
        }