Conversão de moedas

Criei dois programas com a mesma finalidade. A questão é que o primeiro compilou da forma que eu esperava e o segundo só me retorna a primeira opção ainda que eu escolha outra. Gostaria de saber onde está o erro no segundo.

O primeiro é esse:

OBJETO:

package ac;

import javax.swing.JOptionPane;

public class Conversao1 {

private double vr, vd, cd;

public void setVr (double vr) {
    this.vr = vr;
}

public double getVr(){
    return vr;
}

public void setVd (double vd) {
    this.vd = vd;
}

public double getVd() {
    return vd;
}

public void setCd (double cd) {
    this.cd = cd;
}

public double getCd() {
    return cd;
}

public void escolherConversao() {
    
    String ec;
    
    ec = JOptionPane.showInputDialog("Digite DR para converter de Dólar para Real." + "\nDigite RD para converter de Real para Dólar." + "\nDigite C para cancelar.");
    
    if (ec.equalsIgnoreCase("RD")) {
        entradaReal();
        conversaoRD();
    } else if (ec.equalsIgnoreCase("DR")) {
        entradaDolar();
        conversaoDR();
    } else {
        JOptionPane.showMessageDialog(null, "Volte sempre.");
    }
}
public void entradaReal() {
    vr = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor em reais que deseja converter:"));
    cd = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor da cotação atual do Dólar:"));
}

public void entradaDolar() {
    vd = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor em dólares que deseja converter:"));
    cd = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor da cotação atual do Dólar:"));
}

public void conversaoDR() {
    vr = vd * cd;
    JOptionPane.showMessageDialog(null,"O valor de $" + vd + " em Real vale R$" + vr);
}

public void conversaoRD() {
    vd = vr / cd;
    JOptionPane.showMessageDialog(null,"O valor de R$" + vr + " em Dólar vale $" + vd);
}

}

INSTANCIAÇÃO DO OBJETO:

package ac;

public class Convertendo1 {

public static void main(String [] args) {
    
    Conversao1 c1 = new Conversao1 ();
    
    c1.escolherConversao();
}

}

O segundo é esse:

OBJETO:

package ac;

import javax.swing.JOptionPane;

public class Conversao {

private double vr, vd, cd;
int ec;

public void setVr (double vr) {
    this.vr = vr;
}

public double getVr(){
    return vr;
}

public void setVd (double vd) {
    this.vd = vd;
}

public double getVd() {
    return vd;
}

public void setCd (double cd) {
    this.cd = cd;
}

public double getCd() {
    return cd;
}

public void escolherConversao() {
    if (ec == 0) {
        ec = JOptionPane.showConfirmDialog(null, "Conversão de Real para Dólar:", "Opções", JOptionPane.YES_NO_CANCEL_OPTION);
        entradaReal();
        conversaoRD();
    } else if (ec == 1) {
        ec = JOptionPane.showConfirmDialog(null, "Conversão de Dólar para Real:", "Opções", JOptionPane.YES_NO_CANCEL_OPTION);
        entradaDolar();
        conversaoDR();
    } else {
        ec = JOptionPane.showConfirmDialog(null, "Volte sempre", "Opções", JOptionPane.CANCEL_OPTION);
    }
}

public void entradaDolar() {
    vd = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor em dólares que deseja converter:"));
    cd = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor da cotação atual do Dólar:"));
}

public void entradaReal() {
    vr = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor em reais que deseja converter:"));
    cd = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor da cotação atual do Dólar:"));
}

public void conversaoDR() {
    vr = vd * cd;
    JOptionPane.showMessageDialog(null,"O valor de $" + vd + " em Real vale R$" + vr);
}

public void conversaoRD() {
    vd = vr / cd;
    JOptionPane.showMessageDialog(null,"O valor de R$" + vr + " em Dólar vale $" + vd);
}

}

INSTANCIAÇÃO DO OBJETO:

package ac;

public class Convertendo {

public static void main(String [] args) {
    
    Conversao c1 = new Conversao ();
    
    c1.escolherConversao();
}

}

No momento em que a caixa de mensagens aparece e todas as vezes que eu clico em qualquer um dos três botões sempre me direciona pra opção de conversão de real para dólar, coisa que seria normal ao clicar o primeiro botão. E depois que eu clico o botão SIM me direciona para eu entrar com um valor e se eu quiser cancelar o programa clicando em CANCELAR, dá a mensagem de erro na saída do Java ao invés de aparecer a mensagem “Volte sempre.”.
Qual seria a solução pra eu usar o JOptionPaneConfirmDialog e clicar no botão NÃO e ser direcionado para os métodos entradaDolar(); e conversaoDR(); e ao clicar em CANCELAR o programa encerrar normalmente ao invés de apresentar mensagem de erro na saída?

Olha como você implementou seus if's.
Você está comparando o valor da variável ec antes te ter informado um valor pra ela.

Bom, eu fiz um programa onde eu usei o showConfirmDialog usando o laço de repetição while e funcionou do jeito como deveria. Eu fiz assim:

package aplicacaolpoo;

import javax.swing.JOptionPane;

public class TiposDeTriangulos {

public static void main(String[] args) {
    
    Triangulo t1 = new Triangulo();
    
    int e = 0;
    
    while (e == 0) {
        t1.dadosTriangulo();
        t1.tipificarTriangulo();
        e = JOptionPane.showConfirmDialog(null, "Deseja continuar?", "Opções", JOptionPane.YES_NO_OPTION);
    }
}

}

E segundo o que eu sei o showConfirmDialog sempre retorna inteiro, que nesse caso seria 0 e 1 que são os botões SIM e NÃO. Então a minha ideia seria se o usuário escolher o SIM que é o botão 0, a variável ec receberia esse valor 0 e direcionaria o usuário pra opção de conversão de real para dólar e assim seria para as outras escolhas. Mas somente quando a variável ec recebe 0 que seria o botão SIM, funciona bem, mas quando se escolhe outro valor pra variável, o programa direciona como se tivesse sido escolhido o SIM.
Deu pra entender o problema?

Agora entendi seu raciocínio e consertei o código e agora está funcionando do jeito como deveria. Agradeço pela atenção e pela paciência.
Abraços

Sim, entendi perfeitamente, creio que você não entendeu minha resposta.
Veja o que você fez:

public void escolherConversao() {
    // aqui está comparando
    if (ec == 0) {
        // o valor que lê aqui
        ec = JOptionPane.showConfirmDialog(null, "Conversão de Real para Dólar:", "Opções", JOptionPane.YES_NO_CANCEL_OPTION);
        entradaReal();
        conversaoRD();
    }
    // aqui está comparando
    else if (ec == 1) {
        // o valor que lê aqui
        ec = JOptionPane.showConfirmDialog(null, "Conversão de Dólar para Real:", "Opções", JOptionPane.YES_NO_CANCEL_OPTION);
        entradaDolar();
        conversaoDR();
    } else {
        ec = JOptionPane.showConfirmDialog(null, "Volte sempre", "Opções", JOptionPane.CANCEL_OPTION);
    }
}

Você precisa perguntar antes de comparar.

Outra coisa, se abre um diálogo com JOptionPane.YES_NO_CANCEL_OPTION, não deveria verificar se é 0 ou 1 e sim verificar se o resultado é JOptionPane.YES_OPTION, JOptionPane.NO_OPTION ou JOptionPane.CANCEL_OPTION.

Sua variável ec, também não precisa ser uma variável de instância.

Veja:

public void escolherConversao() {
	int opcao = ec = JOptionPane.showConfirmDialog(null, "Conversão de Real para Dólar:", "Opções", JOptionPane.YES_NO_CANCEL_OPTION);
	if (opcao == JOptionPane.YES_OPTION) {
		entradaReal();
		conversaoRD();
		return;
	}
	opcao = JOptionPane.showConfirmDialog(null, "Conversão de Dólar para Real:", "Opções", JOptionPane.YES_NO_CANCEL_OPTION);
	if (opcao == JOptionPane.NO_OPTION) {
		entradaDolar();
		conversaoDR();
		return;
	}
	JOptionPane.showMessageDialog(null, "Volte sempre");
}

Agora esclareceu mais ainda. Se antes eu já tinha entendido, agora imagina com esse exemplo. Muito obrigado mesmo. Valeu pela paciência.

Eu fiz o método dessa maneira e funcionou:

public void escolherConversao() {

    ec = JOptionPane.showConfirmDialog(null, "Conversão de Real para Dólar:", "Opções", JOptionPane.YES_NO_CANCEL_OPTION);

    switch (ec) {
        case 0:
            entradaReal();
            conversaoRD();
            break;
        case 1:
            ec = JOptionPane.showConfirmDialog(null, "Conversão de Dólar para Real:", "Opções", JOptionPane.YES_NO_OPTION);
        
            if (ec == 0) {
                entradaDolar();
                conversaoDR();
            } else {
                JOptionPane.showMessageDialog(null, "Volte sempre.");
            }
            break;
        case 2:
            JOptionPane.showMessageDialog(null, "Volte sempre");
            break;
    }
}