import java.util.Scanner;
public class Power1Eng {
public static void main(String[] args) {
double x, prod = 1;
int n;
String s;
Scanner input = new Scanner(System.in);
System.out.print("This program prints x(x is a real number) raised to the power of n(n is an integer).\n");
outer_loop:
while (true) {
System.out.print("Input x and n: ");
x = input.nextDouble();
n = input.nextInt();
for (int i = 1; i <= n; i++) {
prod *= x;
}
System.out.printf("%.1f raised to the power of %d is %.4f. Do you want to continue?(Y/N) ", x, n, prod);
s = input.nextLine();
if (s.charAt(0) == 'Y')
continue;
else if (s.charAt(0) == 'N')
break;
else {
inner_loop:
while (true) {
System.out.print("Wrong input. Do you want to continue?(Y/N) ");
s = input.nextLine();
if (s.charAt(0) == 'Y')
continue outer_loop;
else if (s.charAt(0) == 'N')
break outer_loop;
else
continue inner_loop;
}
}
}
}
}
当我只使用next()
方法时,只有微不足道的逻辑错误,但是当我改变时
next()
方法的nextLine()
方法,此错误显示。
如何解决此问题?
答案 0 :(得分:3)
有两个问题。第一个是你的字符串可能是空的,然后获取第一个字符会产生异常。
if (s.charAt(0) == 'Y') // This will throw if is empty.
测试字符串的长度以查看是否至少有一个字符,或者只使用String.startsWith
而不是charAt
:
if (s.startsWith('Y'))
第二个问题是您在第一次输入后输入了一个新行,而nextLine只读取了下一个新行字符。
答案 1 :(得分:0)
您可以检查初始字符数,以确保您预期的字符数正确。即:
while (true)
{
// ... some code ...
if (s.length() < 1)
{
continue;
}
// ... some code ...
}
这样,您甚至不必继续运行其余代码,如果代码库较大,则有助于优化性能。
答案 2 :(得分:0)
您在控制台中看到的“红色文本”表示文本被发送到标准错误。在这种情况下,它表示您的程序已崩溃。
您遇到的主要问题是这个逻辑:
System.out.print("Input x and n: ");
x = input.nextDouble();
n = input.nextInt();
for (int i = 1; i <= n; i++) {
prod *= x;
}
System.out.printf("%.1f raised to the power of %d is %.4f. Do you want to continue?(Y/N) ", x, n, prod);
s = input.nextLine();
假设用户输入为:
2.1 4(输入)
input.nextDouble()
将2.1
,4(enter)
留在标准输入流上
input.nextInt()
将4
(enter)
,将input.nextLine()
留在标准输入流上
""
将(enter)
(空字符串),最后从x
和n
的初始用户输入中清除{{1}}。