Cara, tenta um jeito mais elegante de arrumar e não complicar sua vida, do jeito que você fez funciona, mas com o tempo o consumo de memória vai aumentar desnecessariamente, tente dessa forma:
...
try{
con = carrega.fazConexao();
stm = con.createStatement();
System.out.println("Informe o nome que procura");
String alterar = ler.next();
//aqui estou vendo se o nome existe no bando de dados
rs = stm.executeQuery(" SELECT * from cadastro where cad_nome = '"+alterar+"' ");
//aqui o while vai percorrer toda a tabela e ver se existe o banco de dados
//se o nome existe entra aqui no while e faz o update
while(rs.next()){
consulta = false;
System.out.println("Informe o nome para substituir");
String nome = ler.next();
stm.executeUpdate("UPDATE cadastro set cad_nome= '"+alterar+"' where cad_nome= '"+nome+"' ");
System.out.println("Dados Alterados com Sucesso");
// o problema pode estar aqui...
// stm.close();
// ler.close();
}
rs.close();
stm.close();
con.close();
if(consulta){
System.out.println("Nome não consta no banco");
}
}catch(Exception e){
e.printStackTrace();
}
...
Faça alguns testes pois aqui estou usando apenas a lógica, não testei seu código, mas perceba que eu só fecho o rs quanto o stm apenas depois de passar pelo while e não dentro dele.
Outra dica, como você está iniciando tudo bem, mas evite misturar query com variáveis, pesquise a respeito de PreparedStatement para fazer queries desse tipo:
PreparedStatement pstm = con.prepareStatement("UPDATE cadastro SET cad_nome = ? WHERE cad_nome = ?");
pstm.setString(1, "Nome"); // nesse caso começa por 1 e não por zero como em arrays
pstm.setString(2, "Nome");
pstm.executeUpdate();
...
Segue um tuto da própria oracle, está em inglês mas o que vale é estudar o código de início:
http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html