Erro retornado pela pesquisa com LIKe

Olá estou com um erro sempre que tento fazer a pesquisa no banco
“Parameter index out of range (1 > number of parameters, which is 0)”
como posso resolver isso?
Esse é o metodo de pesquisa

 public List<Cliente> getLista(String valor) throws SQLException{
        System.out.println(valor);
        String sql="SELECT * FROM tabcliente where nome like '%" + valor + "%'";
       
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, valor);
        ResultSet rs = stmt.executeQuery(sql);
        List<Cliente> retorno = new ArrayList<Cliente>();

        while(rs.next()){
            Cliente cli = new Cliente();
            cli.setIdCliente(Integer.valueOf(rs.getString("idCliente")));
            cli.setNome(rs.getString("nome"));
            cli.setBairro(rs.getString("bairro"));
            cli.setCpf(rs.getString("cpf"));
            cli.setEndereço(rs.getString("endereco"));
            cli.setIdentidade(rs.getString("identidade"));
            cli.setMunicipio(rs.getString("municipio"));
            cli.setNumero(rs.getInt("Numero"));
            cli.setTelefone(rs.getString("telefone"));

            retorno.add(cli);
         



        }
        rs.close();
        stmt.close();
        return retorno;
    }

Os demais metodos



    private void jBpesquisaActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try {
            
            listarCliente();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro na pesquisa." + ex);
        }
    } 

 public void listarCliente() throws Exception{
        Contatodao dao = new Contatodao();
        cli = dao.getLista(jTpesquisa.getText());
        mostraPesquisa(cli);
    }

    public void mostraPesquisa(List <Cliente> cli){
        if(cli.size() ==0){
            JOptionPane.showMessageDialog(null, "Nenhum valor encontrado.");
        }else{
            String[] linha =new String[]{null,null,null};
            for(int i =0;i<=cli.size();i++){
                dtCliente.addRow(linha);
                dtCliente.setValueAt(cli.get(i).getIdCliente(), i, 0);
                dtCliente.setValueAt(cli.get(i).getNome(), i, 1);
                dtCliente.setValueAt(cli.get(i).getTelefone(), i, 2);
            }
        }

    }

O problema é que você está setando um parametro no prepareted statement, mas não há nenhum parâmetro para setar.

Troque:

String sql="SELECT * FROM tabcliente where nome like '%" + valor + "%'";

Por:

String sql="SELECT * FROM tabcliente where nome like ? ";

e sete o parametro assim:

stmt.setString(1, "%"+valor+"%");

Desta forma ele retornou erro de sintaxe do mysql olha só.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘?’

tenta colocar o ? entre aspas simples assim: ‘?’

Desta forma ele me retorna o mesmo erro anterior
Parameter index out of range (1 > number of parameters, which is 0)

Outra solução não recomendável seria deixar como estava antes, mas não setar o parametro no prepareted statement assim:

 public List<Cliente> getLista(String valor) throws SQLException{
        System.out.println(valor);
        String sql="SELECT * FROM tabcliente where nome like '%" + valor + "%'";
       
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        //stmt.setString(1, valor); NAO FAÇA NADA AQUI
        ResultSet rs = stmt.executeQuery(sql);
        List<Cliente> retorno = new ArrayList<Cliente>();

        while(rs.next()){
            Cliente cli = new Cliente();
            cli.setIdCliente(Integer.valueOf(rs.getString("idCliente")));
            cli.setNome(rs.getString("nome"));
            cli.setBairro(rs.getString("bairro"));
            cli.setCpf(rs.getString("cpf"));
            cli.setEndereço(rs.getString("endereco"));
            cli.setIdentidade(rs.getString("identidade"));
            cli.setMunicipio(rs.getString("municipio"));
            cli.setNumero(rs.getInt("Numero"));
            cli.setTelefone(rs.getString("telefone"));

            retorno.add(cli);
         



        }
        rs.close();
        stmt.close();
        return retorno;
    }

Esta forma não é recomendável pois permite SQL injection (http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_SQL)

Desta forma deu certo…mas está me dando uma resposta de erro também…
Como resolvo esse?

Isso ocorre quando mando buscar todos
IndexOutOfBoundsException:Index:20,Size:20

Tem certeza que dessa forma abaixo da erro?

String sql="SELECT * FROM tabcliente where nome like ? "; stmt.setString(1, "%"+valor+"%");
Eu testei aqui no MySql e não aparece erro algum.