Java 用一个扫描仪读取两个字符串

Java 用一个扫描仪读取两个字符串,java,java.util.scanner,Java,Java.util.scanner,我有一台扫描仪,它首先读取标题,然后读取用户键入的两个单词,用空格分隔,并将它们放入导演姓名和导演姓氏中:但根据下面的代码,我得到了错误: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at MainSystem.addBook(MainSystem.java:57) at MainSystem.main(MainSystem.java:35) at sun.reflect.NativeMethodA

我有一台扫描仪,它首先读取标题,然后读取用户键入的两个单词,用空格分隔,并将它们放入导演姓名和导演姓氏中:但根据下面的代码,我得到了错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at MainSystem.addBook(MainSystem.java:57)
at MainSystem.main(MainSystem.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
代码:

private static void addBook() {

    System.out.println("\nEnter title: ");
    title = scanner.next();

    System.out.println("\nEnter director: ");
    String[] parts = scanner.next().split(" ");
    directorName = parts[0];
    directorSurname = parts[1];
}

编辑: 为了调用方法add book I,也在前面使用了扫描仪-可能是问题:

 System.out.println("\nEnter 0 for loading the Library." +
                            "\nEnter 1 for save and quit" +
                            "\nEnter 2 for list all the Books in the Library." +
                            "\nEnter 3 for add Book to the Library.");

int answer = scanner.nextInt();
Scanner.next()
将只提供一个单词,请改用
Scanner.nextLine()

所以你最终得到了

String[]parts=scanner.nextLine().split(“”)

另外,将标题输入修改为:

title=scanner.nextLine()

Scanner.next()
将只提供一个单词,请改用
Scanner.nextLine()

所以你最终得到了

String[]parts=scanner.nextLine().split(“”)

另外,将标题输入修改为:


title=scanner.nextLine()

除了使用
scanner.nextLine()
来使用整行之外,还应该使用适当的正则表达式来表示至少一个空白字符

String[] parts = scanner.nextLine().split("\\s+");

除了使用
scanner.nextLine()
来使用整行之外,还应该使用适当的正则表达式来表示至少一个空白字符

String[] parts = scanner.nextLine().split("\\s+");

您需要使用nextLine方法获取输入。下面是我在eclipse中尝试的工作版本

编辑:根据问题中的新编辑更新代码。每当整数作为输入并点击回车键时,换行符作为输入进入下一个扫描仪。因此,在获取输入后编写一个nextLine()。更新的代码根据编辑的问题工作

import java.util.Scanner;

public class Snippet {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
    System.out.println("Enter 0 for loading the Library."
            + "\nEnter 1 for save and quit"
            + "\nEnter 2 for list all the Books in the Library."
            + "\nEnter 3 for add Book to the Library.");

    int answer = scanner.nextInt();
    scanner.nextLine();
    if(answer == 3)
        addBook();
}

private static void addBook() {
    System.out.println("Enter title: ");
    String title = scanner.nextLine();
    System.out.println("Enter director: ");
    String[] parts = scanner.nextLine().split(" ");
    String directorName = parts[0];
    String directorSurname = parts[1];
    System.out.println("title : " + title);
    System.out.println("directorname : " + directorName);
    System.out.println("directorsurname : " + directorSurname);
}
}

您需要使用nextLine方法获取输入。下面是我在eclipse中尝试的工作版本

编辑:根据问题中的新编辑更新代码。每当整数作为输入并点击回车键时,换行符作为输入进入下一个扫描仪。因此,在获取输入后编写一个nextLine()。更新的代码根据编辑的问题工作

import java.util.Scanner;

public class Snippet {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
    System.out.println("Enter 0 for loading the Library."
            + "\nEnter 1 for save and quit"
            + "\nEnter 2 for list all the Books in the Library."
            + "\nEnter 3 for add Book to the Library.");

    int answer = scanner.nextInt();
    scanner.nextLine();
    if(answer == 3)
        addBook();
}

private static void addBook() {
    System.out.println("Enter title: ");
    String title = scanner.nextLine();
    System.out.println("Enter director: ");
    String[] parts = scanner.nextLine().split(" ");
    String directorName = parts[0];
    String directorSurname = parts[1];
    System.out.println("title : " + title);
    System.out.println("directorname : " + directorName);
    System.out.println("directorsurname : " + directorSurname);
}
}

您的解决方案会起作用,但正如您所看到的,我编辑了这个问题,问题是我之前使用了相同的扫描仪来调用addBook方法

 int answer = scanner.nextInt();
 scanner.nextLine();


 System.out.println("\nEnter title: ");

    title = scanner.nextLine();

    System.out.println("\nEnter director: ");
    String[] parts = scanner.nextLine().split(" ");
    directorName = parts[0];
    directorSurname = parts[1];

您的解决方案会起作用,但正如您所看到的,我编辑了这个问题,问题是我之前使用了相同的扫描仪来调用addBook方法

 int answer = scanner.nextInt();
 scanner.nextLine();


 System.out.println("\nEnter title: ");

    title = scanner.nextLine();

    System.out.println("\nEnter director: ");
    String[] parts = scanner.nextLine().split(" ");
    directorName = parts[0];
    directorSurname = parts[1];

next()读取到下一个空格,因此数组将只包含一个元素,而您尝试读取第二个元素。试试scanner.nextLine()instead@Dawid请检查我下面的答案,如果您遇到任何问题,请告诉我。next()读取到下一个空格,因此您的数组将只包含一个元素,而您尝试读取第二个元素。试试scanner.nextLine()instead@Dawid请检查我下面的答案,并让我知道您是否面临任何问题。在这种情况下,我在键入title=scanner.nextLine();-它在运行时完全忽略了标题输入。在这种情况下,我在使用title=scanner.nextLine();-它在运行时完全忽略了标题输入,我仍然得到错误:在线程“main”java.lang.ArrayIndexOutOfBoundsException中输入标题:asd异常MainSystem.addBook(MainSystem.java:56)在MainSystem.main(MainSystem.java:35)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)中输入标题:1在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java:498)在com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)确保使用scanner.nextLine()我仍然得到错误:在线程“main”java.lang.ArrayIndexOutOfBoundsException中输入title:asd Exception:1在MainSystem.addBook(MainSystem.java:56)在MainSystem.main(MainSystem.java:35)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java:498)在com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)确保使用scanner.nextLine()我编辑了我的问题-可能是因为我尝试了你的解决方案,但在编辑过程中忽略了标题输入runtime@Dawid更新了我的答案,适合您的要求。如果您还有任何问题,请告诉我。我编辑了我的问题-可能是因为我尝试了您的解决方案,但在编辑过程中忽略了标题输入runtime@Dawid更新了我的答案,适合您的要求。如果你还有什么问题,请告诉我。