不能一起使用Scanner.nextInt()和Scanner.nextLine()

我必须得到一个stringinput和一个整数input,但是input的顺序应该是那个整数先出现然后用户应该被要求stringinput

Scanner in = new Scanner(System.in); input = in.nextLine(); k = in.nextInt(); in.close(); 

上面的代码工作正常,但如果我采取一个整数input第一个像下面的代码

 Scanner in = new Scanner(System.in); k = in.nextInt(); input = in.nextLine(); in.close(); 

那么它会抛出java.lang.ArrayIndexOutOfBoundsException。

以下是我的源文件的完整代码:

 import java.util.Scanner; 

公共类StringSwap {

 public static void main(String args[]) { String input; int k; Scanner in = new Scanner(System.in); k = in.nextInt(); input = in.nextLine(); in.close(); int noOfCh = noOfSwapCharacters(input); originalString(input, noOfCh, k); } public static int noOfSwapCharacters(String s) { char cS[] = s.toCharArray(); int i = 0, postCounter = 0; while (cS[i] != '\0') { if (cS[i] != '\0' && cS[i + 1] != '\0') { cS[cS.length - 1 - postCounter] = '\0'; postCounter++; } i++; } return postCounter; } public static void originalString(String s, int noOfCh, int k) { int counter = 1, chCounter = 0; char cArray[] = s.toCharArray(); String post = ""; String pre = ""; String finalString = ""; char temp; for (int i = 1; i <= k; i++) { chCounter = 0; counter = 1; post = ""; pre = ""; for (int j = 0; j < cArray.length; j++) { if (counter % 2 == 0 && chCounter <= noOfCh) { temp = cArray[j]; post = temp + post; cArray[j] = '\0'; chCounter++; } counter++; } for (int h = 0; h < cArray.length; h++) { if (cArray[h] != '\0') pre = pre + cArray[h]; } finalString = pre + post; for (int l = 0; l < finalString.length(); l++) { cArray[l] = finalString.charAt(l); } } System.out.println(finalString); } 

}

请指出我在这里做错了什么。

问题是你的整数后面的'\n'字符。 当你调用nextInt ,扫描器读取int ,但不会消耗后面的'\n'字符; nextLine做到这一点。 这就是为什么你得到一个空行,而不是你期望得到的string。

假设您的input具有以下数据:

 12345 hello 

下面是input缓冲区最初看起来如何( ^表示Scanner读取下一条数据的位置):

 1 2 3 4 5 \nhello \n ^ 

nextInt之后,缓冲区看起来像这样:

 1 2 3 4 5 \nhello \n ^ 

第一个nextLine消耗\n ,让你的缓冲区如下所示:

 1 2 3 4 5 \nhello \n ^ 

现在nextLine调用将产生预期的结果。 因此,要修复程序, nextLinenextInt之后再次调用nextLine ,并放弃其结果:

 k = in.nextInt(); in.nextLine(); // Discard '\n' input = in.nextLine();