Scanner.nextLine() 当我尝试使用它两次时没有返回任何内容
Scanner.nextLine() is returning nothing when I try to use it twice
我正在为我的 class 决赛制作一个 8 球程序,并且我使用的 nextLine() 函数使 运行 出错。起初,在没有用户输入的情况下,它在回答任何问题之前一直在打印答案,我以为我已经弄明白了,但是当我把它们放在同一个 for() 循环中时,它什么也没有返回。我在这里做错了什么?这是我的代码。
import java.util.Random;
import java.util.Scanner;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
Scanner reader = new Scanner(new File("8ball.txt"));
Scanner reader2 = new Scanner(new File("medievalball.txt"));
System.out.println("Welcome to 8 ball! You can choose a theme: Medieval or Normal, or type 'quit' to quit at any time.");
Scanner input = new Scanner(System.in);
String inInput = input.nextLine();
String[] normal = new String[12];
String[] medieval = new String[10];
Random random = new Random();
int randomNum = random.nextInt(10)+1;
Random random2 = new Random();
int randomNum2 = random2.nextInt(12)+1;
while (true)
{
if (inInput.equals("Normal"))
{
System.out.println("You've selected Normal. Preparing... ");
System.out.println("Ask me something, I can answer.");
Scanner normalInput = new Scanner(System.in);
for (int i=0; i < normal.length;i++)
{
normal[i] = normalInput.nextLine();
}
for (int i=0; i < normal.length;)
{
normal[i] = reader.nextLine();
System.out.println(normal[randomNum]);
break;
}
}
else if (inInput.equals("Medieval"))
{
System.out.println ("You hath selected Medieval. Preparing...");
System.out.println("I have unbearable knowledge of the world, ask me thine question.");
Scanner medievalInput = new Scanner(System.in);
for (int i=0; i < medieval.length;i++)
{
medieval[i] = medievalInput.nextLine();
}
for (int i=0; i < medieval.length;i++)
{
System.out.println(medieval[randomNum2]);
break;
}
}
else if (inInput.equals ("quit"))
{
System.out.println ("See you next time!");
System.exit(0);
}
else
{
System.out.println("Sorry, that's not a choice.");
}
}
}
}
在尝试解决此问题之前,您需要对基础知识有很好的理解。我已经强调了您程序中的一些问题:
如果值为normal.length >= 1
,下面的语句会造成死循环。您需要在循环语句的最后一部分放置表达式来更改值 i
(例如 i++
)。
for (int i=0; i < normal.length;)
您不需要 Random
的多个实例来生成多个随机数。下面给出了如何使用 Random
.
的相同实例生成多个随机数的示例
Random random = new Random();
int randomNum = random.nextInt(10) + 1;
int randomNum2 = random.nextInt(12) + 1;
每当您使用扫描仪从文件中读取内容时,您应该始终使用 Scanner::hasNextLine
以避免 NoSuchElementException
例如以下代码块
for (int i=0; i < normal.length; i++) {
normal[i] = reader.nextLine();
//...
}
应该写成
for (int i=0; i < normal.length && reader.hasNextLine(); i++) {
normal[i] = reader.nextLine();
//...
}
没有条件的break
在循环中是没有意义的,例如以下块中的 break
语句将导致循环在第一次迭代后终止使用循环的目的。
for (int i=0; i < medieval.length;i++) {
System.out.println(medieval[randomNum2]);
break;
}
我正在为我的 class 决赛制作一个 8 球程序,并且我使用的 nextLine() 函数使 运行 出错。起初,在没有用户输入的情况下,它在回答任何问题之前一直在打印答案,我以为我已经弄明白了,但是当我把它们放在同一个 for() 循环中时,它什么也没有返回。我在这里做错了什么?这是我的代码。
import java.util.Random;
import java.util.Scanner;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
Scanner reader = new Scanner(new File("8ball.txt"));
Scanner reader2 = new Scanner(new File("medievalball.txt"));
System.out.println("Welcome to 8 ball! You can choose a theme: Medieval or Normal, or type 'quit' to quit at any time.");
Scanner input = new Scanner(System.in);
String inInput = input.nextLine();
String[] normal = new String[12];
String[] medieval = new String[10];
Random random = new Random();
int randomNum = random.nextInt(10)+1;
Random random2 = new Random();
int randomNum2 = random2.nextInt(12)+1;
while (true)
{
if (inInput.equals("Normal"))
{
System.out.println("You've selected Normal. Preparing... ");
System.out.println("Ask me something, I can answer.");
Scanner normalInput = new Scanner(System.in);
for (int i=0; i < normal.length;i++)
{
normal[i] = normalInput.nextLine();
}
for (int i=0; i < normal.length;)
{
normal[i] = reader.nextLine();
System.out.println(normal[randomNum]);
break;
}
}
else if (inInput.equals("Medieval"))
{
System.out.println ("You hath selected Medieval. Preparing...");
System.out.println("I have unbearable knowledge of the world, ask me thine question.");
Scanner medievalInput = new Scanner(System.in);
for (int i=0; i < medieval.length;i++)
{
medieval[i] = medievalInput.nextLine();
}
for (int i=0; i < medieval.length;i++)
{
System.out.println(medieval[randomNum2]);
break;
}
}
else if (inInput.equals ("quit"))
{
System.out.println ("See you next time!");
System.exit(0);
}
else
{
System.out.println("Sorry, that's not a choice.");
}
}
}
}
在尝试解决此问题之前,您需要对基础知识有很好的理解。我已经强调了您程序中的一些问题:
如果值为
normal.length >= 1
,下面的语句会造成死循环。您需要在循环语句的最后一部分放置表达式来更改值i
(例如i++
)。for (int i=0; i < normal.length;)
您不需要
的相同实例生成多个随机数的示例Random
的多个实例来生成多个随机数。下面给出了如何使用Random
.Random random = new Random(); int randomNum = random.nextInt(10) + 1; int randomNum2 = random.nextInt(12) + 1;
每当您使用扫描仪从文件中读取内容时,您应该始终使用
Scanner::hasNextLine
以避免NoSuchElementException
例如以下代码块for (int i=0; i < normal.length; i++) { normal[i] = reader.nextLine(); //... }
应该写成
for (int i=0; i < normal.length && reader.hasNextLine(); i++) { normal[i] = reader.nextLine(); //... }
没有条件的
break
在循环中是没有意义的,例如以下块中的break
语句将导致循环在第一次迭代后终止使用循环的目的。for (int i=0; i < medieval.length;i++) { System.out.println(medieval[randomNum2]); break; }