“线程中的异常”等等

时间:2011-10-28 07:03:58

标签: java

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;
            }   
        }   
    }       
}

}

enter image description here

当我只使用next()方法时,只有微不足道的逻辑错误,但是当我改变时 next()方法的nextLine()方法,此错误显示。

如何解决此问题?

3 个答案:

答案 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.14(enter)留在标准输入流上 input.nextInt()4 (enter),将input.nextLine()留在标准输入流上 ""(enter)(空字符串),最后从xn的初始用户输入中清除{{1}}。