O problema ocorre quando você lê um valor double usando nextDouble() ou int usando nextInt() e, em seguida, lê uma linha inteira usando nextLine().
Para corrigir esse problema, você pode adicionar um leitura.nextLine() logo após a leitura do valor double para consumir a quebra de linha pendente. Assim, a leitura da próxima linha será realizada corretamente.
public static void main(String[] args) {
Scanner leitura = new Scanner(System.in);
System.out.println("Digite seu nome: ");
String nome = leitura.nextLine();
System.out.println("Digite seu saldo: ");
double novoLimite = leitura.nextDouble();
leitura.nextLine();
Conta conta1 = new Conta(nome,novoLimite);
conta1.mostraInfo();
String menu = "-- Menu de interação -- \n1- Nova compra \n2- Sair";
int sair = 0;
while (sair != 2) {
System.out.println("Novo produto: ");
String novoProduto = leitura.nextLine();
System.out.println("Valor: ");
double novoValor = leitura.nextDouble();
leitura.nextLine();
Compra compra1 = new Compra(novoProduto, novoValor);
boolean compraRealizada = conta1.lancaCompra(compra1);
if (compraRealizada) {
System.out.println("Compra realizada!\n");
System.out.println(menu);
sair = leitura.nextInt();
leitura.nextLine();
} else {
System.out.println("Saldo insuficiente!\n");
sair = 2;
leitura.close();
}
}
System.out.println("*******************************");
if(conta1.getCompras().size() > 0) {
System.out.println("COMPRA FINALIZADA: \n");
Collections.sort(conta1.getCompras());
for (Compra compra : conta1.getCompras()) {
System.out.println(compra);
}
} else {
System.out.println("NENHUMA COMPRA REALIZADA!");
}
System.out.println("*******************************\n");
System.out.printf("Saldo atual: R$%.2f \n",conta1.getSaldo());
}
Para não ter essa necessidade de ter que ficar chamando o método nextLine(), você deve sempre utilizar o método nextLine() para ler os valores, fazendo a conversão quando não forem String:
public static void main(String[] args) {
Scanner leitura = new Scanner(System.in);
System.out.println("Digite seu nome: ");
String nome = leitura.nextLine();
System.out.println("Digite seu saldo: ");
double novoLimite = Double.parseDouble(leitura.nextLine());
Conta conta1 = new Conta(nome,novoLimite);
conta1.mostraInfo();
String menu = "-- Menu de interação -- \n1- Nova compra \n2- Sair";
int sair = 0;
while (sair != 2) {
System.out.println("Novo produto: ");
String novoProduto = leitura.nextLine();
System.out.println("Valor: ");
double novoValor = Double.parseDouble(leitura.nextLine());
Compra compra1 = new Compra(novoProduto, novoValor);
boolean compraRealizada = conta1.lancaCompra(compra1);
if (compraRealizada) {
System.out.println("Compra realizada!\n");
System.out.println(menu);
sair = Integer.parseInt(leitura.nextLine());
} else {
System.out.println("Saldo insuficiente!\n");
sair = 2;
leitura.close();
}
}
System.out.println("*******************************");
if(conta1.getCompras().size() > 0) {
System.out.println("COMPRA FINALIZADA: \n");
Collections.sort(conta1.getCompras());
for (Compra compra : conta1.getCompras()) {
System.out.println(compra);
}
} else {
System.out.println("NENHUMA COMPRA REALIZADA!");
}
System.out.println("*******************************\n");
System.out.printf("Saldo atual: R$%.2f \n",conta1.getSaldo());
}
}