Em vez de criar um Scanner
toda vez que os métodos de ler opções são chamados, você pode fazer com que os métodos recebam este Scanner
:
public static int lerOpcao(Scanner scan) {
while (true) {
try {
System.out.println("======CONVERSOR DE CALOR======\n\n" + "Digite o valor da conversão a seguir:\n" + "(1) De Celsius para Kelvin; \n"
+ "(2) De Kelvin para Celsius; \n" + "(3) De Celsius para Fahrenheit; \n" + "(4) De Fahrenheit para Celsius; \n"
+ "(5) De Kelvin para Fahrenheit; \n" + "(6) De Fahrenheit para Kelvin.\n");
int opcao = Integer.parseInt(scan.nextLine());
if (opcao < 1 || opcao > 6) {
System.out.println("Opção inválida");
} else {
return opcao;
}
} catch (NumberFormatException e) {
System.out.println("Você não digitou um número");
}
}
}
public static double lerTemperatura(Scanner scan) {
while (true) {
try {
System.out.println("Digite o valor para ser convertido:");
return Double.parseDouble(scan.nextLine());
} catch (NumberFormatException e) {
System.out.println("Você não digitou um número");
}
}
}
Aí, no main
basta criar o Scanner
apenas uma única vez e passar para os métodos:
Scanner scan = new Scanner(System.in);
int opcao = lerOpcao(scan);
double temp = lerTemperatura(scan);
Repare também que cada método valida se o valor digitado está de acordo com o que cada um espera (qualquer valor inválido mostra uma mensagem de erro e pede que digite novamente).
Já para converter as temperaturas, você pode dar nomes mais claros (eu pelo menos demorei pra perceber que eram nomes diferentes), e também dá para reaproveitar a lógica de um em outro:
public static double celsiusToKelvin(double celsius) {
return celsius + 273.15;
}
public static double kelvinToCelsius(double kelvin) {
return kelvin - 273.15;
}
public static double celsiusToFahrenheit(double celsius) {
return ((9 * celsius) / 5) + 32;
}
public static double fahrenheitToCelsius(double fahrenheit) {
return (5 * (fahrenheit - 32)) / 9;
}
public static double kelvinToFahrenheit(double kelvin) {
// converte Kelvin para Celsius, e depois converter para Fahrenheit
return celsiusToFahrenheit(kelvinToCelsius(kelvin));
}
public static double fahrenheitToKelvin(double fahrenheit) {
// converte Fahrenheit para Celsius, e depois para Kelvin
return celsiusToKelvin(fahrenheitToCelsius(fahrenheit));
}
Repare também que, em vez de:
double valor = cálculo;
return valor;
Eu posso fazer simplesmente:
return cálculo;
Se a variável não vai ser usada para mais nada, ela é desnecessária e posso retornar o valor direto.
Também mudei os nomes das variáveis para ficar mais claro o que estou convertendo. Pode parecer um detalhe besta, mas dar nomes melhores ajuda na hora de programar.. O mesmo vale para os métodos.
Enfim, o programa completo ficaria:
public class LAB_58 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int opcao = lerOpcao(scan);
double temp = lerTemperatura(scan);
converte(opcao, temp);
}
public static int lerOpcao(Scanner scan) {
while (true) {
try {
System.out.println("======CONVERSOR DE CALOR======\n\n" + "Digite o valor da conversão a seguir:\n" + "(1) De Celsius para Kelvin; \n"
+ "(2) De Kelvin para Celsius; \n" + "(3) De Celsius para Fahrenheit; \n" + "(4) De Fahrenheit para Celsius; \n"
+ "(5) De Kelvin para Fahrenheit; \n" + "(6) De Fahrenheit para Kelvin.\n");
int opcao = Integer.parseInt(scan.nextLine());
if (opcao < 1 || opcao > 6) {
System.out.println("Opção inválida");
} else {
return opcao;
}
} catch (NumberFormatException e) {
System.out.println("Você não digitou um número");
}
}
}
public static double lerTemperatura(Scanner scan) {
while (true) {
try {
System.out.println("Digite o valor para ser convertido:");
return Double.parseDouble(scan.nextLine());
} catch (NumberFormatException e) {
System.out.println("Você não digitou um número");
}
}
}
public static void converte(int opcao, double val) {
switch (opcao) {
case 1:
impressao(celsiusToKelvin(val));
break;
case 2:
impressao(kelvinToCelsius(val));
break;
case 3:
impressao(celsiusToFahrenheit(val));
break;
case 4:
impressao(fahrenheitToCelsius(val));
break;
case 5:
impressao(kelvinToFahrenheit(val));
break;
case 6:
impressao(fahrenheitToKelvin(val));
break;
default:
System.out.println("Incorrespondente às opções.");
}
}
public static double celsiusToKelvin(double celsius) {
return celsius + 273.15;
}
public static double kelvinToCelsius(double kelvin) {
return kelvin - 273.15;
}
public static double celsiusToFahrenheit(double celsius) {
return ((9 * celsius) / 5) + 32;
}
public static double fahrenheitToCelsius(double fahrenheit) {
return (5 * (fahrenheit - 32)) / 9;
}
public static double kelvinToFahrenheit(double kelvin) {
// converte Kelvin para Celsius, e depois converter para Fahrenheit
return celsiusToFahrenheit(kelvinToCelsius(kelvin));
}
public static double fahrenheitToKelvin(double fahrenheit) {
// converte Fahrenheit para Celsius, e depois para Kelvin
return celsiusToKelvin(fahrenheitToCelsius(fahrenheit));
}
public static void impressao(double result) {
System.out.println(result);
}
}