我已经做了4个月的java,所以我还是个业余爱好者。只是想完成一些hwk。似乎无法通过拒绝文本数据和零来找到正确的提示,让我的分母运行良好,同时保持与错误消息的循环。另一个问题是,无论我的分子/分母是什么,我的商都是0.0。很多问题,任何建议表示赞赏。方向如下:
- 该程序获取(int)分子和的用户输入 (int)分母然后计算并显示(双)商。
- 如果用户为分子输入文本而不是数字,则显示解释问题的错误消息并使用户循环,直到输入正确的数据。
- 如果用户为分母输入文本或零而不是数字,则显示解释问题的错误消息并使用户保持循环,直到输入正确的数据。
- 有关问题的信息应该是描述性的。
public static void main(String[] args) throws Exception {
Scanner console = new Scanner(System.in);
int n1 = 0; //number 1
int n2 = 1; //number 2..
double r = (double) n1 / n2; //quotient
String n1Str = "Please enter a real number for the numerator";
String n2Str = "Please enter a real number greater than zero for the denominator";
String errMsg = "Please enter a real number.";
String notZero = "Denominator cannot equal zero."; // not all string msgs are used, just there in case i need them.
try {
n1 = getInteger(n1Str); // validates against alphabet
if (hasNextInt()) { // working
n1 = console.nextInt();
}
} catch (InputMismatchException ime) {
}
try {
n2 = getInteger2(n2Str); // trying to validate against alphabet & zero
if (hasNextInt()) { // not working though...
n2 = console.nextInt();
}
} catch (InputMismatchException ime) {
}
System.out.println("Fraction result is " + r);
}
public static int getInteger(String message) {
Scanner console = new Scanner(System.in);
int count = 0;
boolean isValidInteger = false;
do {
System.out.println(message);
if (console.hasNextInt()) {
isValidInteger = true;
count = console.nextInt();
} else {
console.nextLine();
}
} while (!isValidInteger);
return count;
}
public static int getInteger2(String message) {
Scanner console = new Scanner(System.in);
int count = 0;
boolean isValidInteger = false;
do {
System.out.println(message);
if (console.nextInt() != 0 || console.hasNextInt()) { // validates against zero but
isValidInteger = true; // can't get it to validate against text.
count = console.nextInt(); //tried switching statements and using && but get thrown into endless loop
}
} while (!isValidInteger);
return count;
}
private static boolean hasNextInt() {
return false;
}
}
答案 0 :(得分:0)
你的商“r”始终为0.0的事实是因为你将n1初始化为0并且n2 = 1;您应该只声明变量并在代码中初始化它们;即当你想从用户那里获得价值时。
答案 1 :(得分:0)
您的代码存在很多问题。
对于初学者,您应该只有一个Scanner
,它将在您的应用程序的整个生命周期中存在。无需实例化多个扫描仪。
public class SomeClass {
private static Scanner console;
public static void main(String[] args) throws Exception {
console = new Scanner(System.in);
(...)
console.close();
}
}
现在让我们来看看有问题的getInteger2
方法。
如果输入是整数,您应该像在getInteger
方法上那样简单验证。如果是,则进行处理;否则,您可以使用next()
(而不是nextLine()
)跳过它,因为您想跳过此扫描仪的下一个完整令牌。
public static int getInteger2(String message) {
int count = -1;
boolean isValidInteger = false;
do {
System.out.println(message);
if (console.hasNextInt()) {
count = console.nextInt();
if (count != 0) {
isValidInteger = true;
} else {
System.out.println("Denominator cannot equal zero.");
}
} else {
console.next();
}
} while (!isValidInteger);
return count;
}
最后,您的商始终被打印0.0
,因为您在输出之前未更新其值:
r = (double) n1 / n2;
System.out.println("Fraction result is " + r);
答案 2 :(得分:0)
您的代码/逻辑似乎有两个“主要”问题......
问题1)获得输入后,您没有计算r
(你的商)。
所以线条:
} catch (InputMismatchException ime) {
}
System.out.println("Fraction result is " + r);
可以改为:
} catch (InputMismatchException ime) {
}
r = (double) n1 / n2; //calculate the quotient
System.out.println("Fraction result is " + r);
问题2)
你的代码:
do {
System.out.println(message);
if (console.nextInt() != 0 || console.hasNextInt()) { // validates against zero but
isValidInteger = true; // can't get it to validate against text.
count = console.nextInt(); //tried switching statements and using && but get thrown into endless loop
}
} while (!isValidInteger);
return count;
如果您不想在代码中进行太多更改,可以将其更改为此类内容:
do {
System.out.println(message);
try {
if ((count = console.nextInt()) != 0) {
isValidInteger = true;
}
} catch (InputMismatchException ime) {
return getInteger2(message);
}
} while (!isValidInteger);
return count;
因此,只有当console
中的输入为int
时,才会使用nextInt()
将其读取并将其存储在count
中。在您的代码中,您将使用int
阅读nextInt()
,如果是int
,则会使用nextInt()
再次阅读,这会导致用户写入int
在检查int
是否int
导致InputMismatchException
被抛出之前,您已阅读int
的问题。在我发送给您的代码中,如果读取的数字是0
而不是0
则会返回,如果int
您的循环再次运行且它不是{{1}} {1}}只需再次调用该方法(参见Recursion)。
我希望这有助于您了解问题。
然而,最好的方法是重新设计你的代码。