Erro no Try/Catch - Finalizando se começar com letra

Galera, estou tendo problema com o seguinte código:
[color=red] [/color][color=#444444] [/color]

import java.text.DecimalFormat;
import javax.swing.JOptionPane;
import java.util.*;

public class Exercicio_4 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here

DecimalFormat deci = new DecimalFormat("0.00");    
    
String entra_valor = "";  
double valor_total = 0, valor = 0;    
int contador = 0;


    do 
     
    {    
    
    try 

   { 
          
       entra_valor = JOptionPane.showInputDialog(null, "Digite o preço do produto:\n\n", "Dr. Shop", JOptionPane.PLAIN_MESSAGE);
       valor = Double.parseDouble(entra_valor.replace("," , ".")); 
       
     if ( valor >= 0.001 )   
    
     {
    
    valor_total = valor_total + valor;     
    contador++;
    
    }
       
                if ( valor < 0 )
        
                {    
   
                 JOptionPane.showMessageDialog(null, "Por favor, digite um valor válido", "Dr. Shop", JOptionPane.PLAIN_MESSAGE);
                     
                } 
       
   }
   catch(NumberFormatException erro) 

  { 

     JOptionPane.showMessageDialog(null, "Número inválido", "Dr.", JOptionPane.PLAIN_MESSAGE); 
  }
    
    
    }
    
    while(valor != 0);

    JOptionPane.showMessageDialog(null, "Quantidade de itens: " + contador + "\n\nValor total da compra: R$ " + deci.format(valor_total), "Dr. Shop", JOptionPane.PLAIN_MESSAGE);
    
     
     }

}

Se eu começo digitando um número, ele vai de boa, aí posso digitar letra e tudo mais depois que ele se comporta como deveria ser.

Mas se começo digitando uma letra direto, ele já vai mostrando a mensagem final, marcando 0 nas duas variáveis.

Sou bem noob na linguagem, parei nela no técnico e voltei agora com o início da faculdade.

Se alguém puder dar uma força, agradeço.

Valeu !!

Tá bem fácil pra resolver, então vou passar umas dicas pra ver se vc consegue descobrir o pq d estar acontecendo isso:

1° Vc criou e inicializou a variável “valor” com o valor 0.

double valor_total = 0, valor = 0; 

2° Vc tenta atribuir um valor digitado à sua variável “valor”, fazendo uma conversão de String para double. Importante: Caso ocorra uma exceção, o valor da variável “valor” não é alterado.

valor = Double.parseDouble(entra_valor.replace("," , ".")); 

3º Vc testa se o valor é diferente de 0 como condição do while.

 while(valor != 0);

Conseguiu enxergar o pq?
Vê se consegue resolver, se não é só falar.

Cara, se puder dar uma luz aí, agradeço.

To meio enrolado num monte aqui, e à essas horas, tá meio difícil analisar, rs

Fmz. rsrs

O q tá acontecendo é o seguinte: quando o código passa pelo “do” pela primeira vez, a variável “valor” vale zero. Caso vc digite uma letra já na primeira vez, ocorrerá uma exceção, então irá para o bloco catch, q apresentará uma mensagem. Após isso, será feito o teste para verificar se "valor’ é diferente de 0, q não é, pois ele continua valendo zero, portanto o while não será executado novamente.

Pra resolver vc pode tanto inicializar a variável “valor” com outro valor q não seja 0, ou então alterar o valor da variável “valor” no bloco catch (para um valor diferente de zero).

Valeu fera, agora foi que foi =D

Continuar sofrendo aqui com uns exercícios nada à ver que a professora passou, uahuhaaa

Ah, e mais uma coisa:

Como que faz pra mandar o texto com a identação normal, e não esse alinhado todo à esquerda?

Vc tem q colocar o seu código dentro das tags “[code]” e “[\code]” sem as aspas.

Boa sorte com os exercícios.