Используйте код, который требуется повторить в случае ошибки внутри цикла while; что делает ваш код таким:
while (true) {
float value;
try {
// code to get proper value from user & store in `value`
return value;
} catch (InputMismatchException exception) {
System.out.println("Please enter number only!");
}
}
Теперь просто переместите этот код в метод:
float getFloatValue(String questionDescription){
while (true) {
float value;
try {
Scanner input = new Scanner(System.in);
System.out.println(questionDescription+": ");
value = input.nextFloat();
return value;
} catch (InputMismatchException exception) {
System.out.println("Please enter number only!");
}
}
return Float.NaN;
}
Итак, наконец, код для получения значений выглядит следующим образом:
float monthlyIncome = getFloatValue("Enter your monthly income (after tax and insurance)");
float monthlyFoods = getFloatValue("Enter monthly cost for food");
float monthlyRent = getFloatValue("Enter monthly cost for food");
// get other values same as above
monthlyExpenses(monthlyIncome, monthlyFoods, monthlyRent,
monthlyUtilities, monthlyHobbies, monthlySaving);
Преимущество этого подхода состоит в том, что будут приниматься только допустимые значения с плавающей точкой, и ваш код также выглядит чистым.