扫描仪无法读取输入

时间:2014-06-22 06:43:20

标签: java java.util.scanner

package algo.chapter1.Ex1_1_33;

import java.util.Scanner;
import edu.princeton.cs.introcs.StdIn;
import edu.princeton.cs.introcs.StdOut;


public class MatrixClient
{
    static Scanner scan = new Scanner(System.in);
    public static void main(String[] args)
    {
       while(true)
       {
        switch (getInput())
        {
            case 1:
                //Dot Product
                performDotProduct();
                break;

            case 2:
                performMatrixProduct();
                break;

            case 3:
                break;

            case 4:
                break;

            case 5:
                break;

            case 6:
                StdOut.println("Thank You!");
                System.exit(0);
                break;

            default:
                StdOut.println("Invalid Choice!!!");
        }
    }
}

public static int getInput()
{
    StdOut.println("******************************");
    StdOut.println("1.Dot Product");
    StdOut.println("2.Matrix-Matrix product");
    StdOut.println("3.Transpose");
    StdOut.println("4.Matrix-Vector Product");
    StdOut.println("5.Vector-Matrix product");
    StdOut.println("6.Exit");
    StdOut.println("******************************");
    StdOut.print("\nChoose one from the above: ");

    return StdIn.readInt();
}

public static void performDotProduct()
{
    StdOut.print("Enter elements of vector A: ");
    double[] A = readVector();

    StdOut.print("Enter elements of vector B: ");
    double[] B = readVector();

    StdOut.println("The dot product is: " + Matrix.dot(A, B));
}

public static void performMatrixProduct()
{
    StdOut.print("Enter the size of matrix A: ");
    int size = scan.nextInt();

    double[][] A = readMatrix(size);
    for (double[] row : A)
    {
        for (double item : row)
            StdOut.print(item + "\t");
        StdOut.println();
    }
}
public static double[] readVector()
{

    String[] input = scan.nextLine().split(" ");
    double[] x = new double[input.length];

    for (int i = 0; i < input.length; i++)
        x[i] = Double.parseDouble(input[i]);

    return x;
}

public static double[][] readMatrix(int N)
{
    int counter = 0;
    double[][] matrix = new double[N][N];
    while (counter < N)
    {
        StdOut.print("Enter elements of row " + (counter + 1) + ": ");
        matrix[counter] = readVector();
        counter++;
    }

    return matrix;
}
}

我正在使用readVector()方法读取一行双精度数并返回一个double数组。当它用于点积时,正在读取输入正常,但是当我使用矩阵乘法选项时,readVector()不等待输入。它抛出NumberFormatExcpetion:空字符串。

我不明白为什么readVector()表现不同。

2 个答案:

答案 0 :(得分:2)

问题出在这一行:

int size = scan.nextInt();

当您的代码要求输入矩阵的大小时,输入一个数字,然后按Enter键。但是,上面的代码只读取您输入的数字。它不使用enter(\n字符)。

在您的代码使用矩阵大小后,您的代码会执行:

String[] input = scan.nextLine().split(" ");

使用enter(\n字符),然后按空格分割。当然,这个(scan.nextLine())返回一个空字符串。

要修复它,而不是使用:

int size = scan.nextInt();

使用:

int size = scan.nextInt();
scan.nextLine();

答案 1 :(得分:0)

在您的代码更改中:

 int size = scan.nextInt();

 int size = scan.nextInt();
scan.nextLine();