所以,我想两天前我问了一个关于输入验证的问题,以及如何循环程序直到用户给出有效的输入。。
所以我做了一个计算器,我想循环程序的每一步,这样,如果用户没有输入double
(69,42.0(或适当的运算符char
(/,*,+,-(,他们就会一直停留在这一步,直到他们做对了,或者以其他方式完全关闭应用程序。
所以我从最后一个问题中得到的一件事是,我可以使CCD_;重新启动";或者其他什么,并封装我的整个代码,显然除了main
method
,最后我可以提出一个问题,他们可以回答true
或false
,整个应用程序可以再次运行。虽然我承认有一个";"重新开始";我的应用程序上的按钮很酷,对我所有的其他a项目都很有用(可能不是,我相信这可以更有效地完成(,它仍然没有满足我和我最初的问题。
所以。。。
我尝试了我能尝试的一切(我知道stack喜欢那些表明自己至少尝试过的人(。
示例1
Scanner input = new Scanner(System.in);
double valX;
System.out.println("Calculator Activated.");
do
{
System.out.print("Value X: ");
valX = input.nextDouble();
}while (!input.hasNextDouble());
{
System.out.println("Invalid number!");
}
//Didn't work ¯_(ツ)_/¯
示例2
Scanner input = new Scanner(System.in);
double valX;
System.out.println("Calculator Activated.");
while (!input.hasNextDouble())
{
System.out.println("Value X: ");
valX = input.nextDouble();
}
//neither this one...
请注意,你们给我的解决方案必须适用于程序的每一步。
更清晰的是,整个src代码没有我尝试过的东西;重新启动";环
import java.util.Scanner;
public class CalTest
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
double valX, valY, divided, multiplied, added, subtracted; //Declared all my variables...
char operator;
boolean restart; //Didn't need to declare it true or false since I'm using a Scanner anyway
do //Start of the entire program
{
System.out.println("Calculator Activated.");
System.out.print("Value X: "); //I need a loop here...
valX = input.nextDouble();
System.out.print("Operator: "); //And here...
operator = input.next().charAt(0);
System.out.print("Value Y: "); //And here too..
valY = input.nextDouble();
divided = valX / valY;
multiplied = valX * valY;
added = valX + valY;
subtracted = valX - valY;
if (operator == '/')
System.out.println("Result: " + divided );
else if (operator == '*')
System.out.println("Result: " + multiplied); //<--Not sure if I need a loop with the if's
else if (operator == '+')
System.out.println("Result: " + added);
else if (operator == '-')
System.out.println("Result: " + subtracted);
else
System.out.println("Invalid operator!");
System.out.print("Try again? "); //I also need a loop here, I think.
restart = input.nextBoolean();
} while (restart); //End of it if you declared false.
System.out.println("Calculator terminated.");
}
}
有一次,我试着用同样的";重新启动应用程序";概念,并为代码中的每一步都制作了一个布尔变量,老实说,这很烦人,也不值得
在名为CalTest
的类中分配valX = input.nextDouble();
的最后一个代码示例中,您可以调用递归方法来处理异常,直到输入符合您的要求。类似这样的东西:
private static double getNextDouble(Scanner input) {
try {
return input.nextDouble();
} catch (InputMismatchException e) {
System.out.println("Value X must be a number: ");
input.next();
return getNextDouble(input);
}
}
您将用valX = getNextDouble(input);
替换valX = input.nextDouble();
。
您可以整理它,使其适用于其他潜在的错误情况,也许可以为输出消息创建一个参数并将其作为参数传入。
public static void main(String[] args) {
double valX=0,valY=0;
char operator='0';//dummy default
Scanner input = new Scanner(System.in);
System.out.println("Calculator Activated.");
Double dX = null;
do
{
System.out.print("Value X: ");
dX = getDouble(input.next());
}while (dX==null);
{
valX = dX;
}
Character op = null;
do
{
System.out.print("Operator: ");
op = getOperator(input.next());
}while (op==null);
{
operator=op;
}
Double dY = null;
do
{
System.out.print("Value Y: ");
dY = getDouble(input.next());
}while (dY==null);
{
valY = dY;
}
System.out.println("Done: "+ valX + " "+operator + " " +valY);
}
static Double getDouble(String input) {
Double d = null;
try {
d = new Double(input);
}catch(NumberFormatException ex){
}
return d;
}
static Character getOperator(String input) {
Character c = null;
if("+".equals(input) || "-".equals(input) || "*".equals(input) || "/".equals(input)){
c = input.charAt(0);
}
return c;
}