Java 程序不连续运行
我正在编写一个聊天机器人程序,如果聊天机器人没有回答用户问题的信息,它会询问用户如何回答问题,然后将其存储在txt文件中。稍后,当问到另一个问题时,从txt文件中检索信息,然后整个过程重新开始(或者至少应该重新开始) 然而,在用户发出一个查询后,程序可以运行,我再次按enter键进行第二次尝试,结果什么也没发生 这是我的密码:Java 程序不连续运行,java,while-loop,java.util.scanner,user-input,filereader,Java,While Loop,Java.util.scanner,User Input,Filereader,我正在编写一个聊天机器人程序,如果聊天机器人没有回答用户问题的信息,它会询问用户如何回答问题,然后将其存储在txt文件中。稍后,当问到另一个问题时,从txt文件中检索信息,然后整个过程重新开始(或者至少应该重新开始) 然而,在用户发出一个查询后,程序可以运行,我再次按enter键进行第二次尝试,结果什么也没发生 这是我的密码: import java.io.*; import java.util.*; import java.nio.file.*; import java.util.stream
import java.io.*;
import java.util.*;
import java.nio.file.*;
import java.util.stream.Stream;
public class Main {
public static void main(String args[]) {
System.out.println("Bot: Hello!! My name's HiBot! What's up?");
System.out.print("You: ");
Scanner input = new Scanner(System.in).useDelimiter("\\n");
String response = input.next();
if (response.toLowerCase().contains("bye") || response.toLowerCase().contains("see ya")
|| response.toLowerCase().contains("gtg")) {
System.out.println("Bot: Ok, see ya. Nice talking to you!");
}
processor(response);
}
public static void processor(String reply) {
try {
BufferedReader reader = new BufferedReader(new FileReader("convos.txt"));
int count = 0;
try {
String line = reader.readLine();
while (line != null) {
count++;
if (line.toLowerCase().contains(reply.toLowerCase())) {
try (Stream<String> lines = Files.lines(Paths.get("convos.txt"))) {
line = lines.skip(count).findFirst().get();
System.out.println("Bot: " + line);
recur();
} catch (IOException e) {
System.out.println("Bot: Something happened Issue1 :
Initially file doesn't exist and you are not creating it. so it gave following error
Bot: Hello!! My name's HiBot! What's up?
You: hi
java.io.FileNotFoundException: convos.txt (The system cannot find the file specified)
import java.io.*;
导入java.util.*;
导入java.nio.file.*;
导入java.util.stream.stream;
公共班机{
公共静态void main(字符串参数[]){
System.out.println(“机器人:你好!!我叫HiBot!怎么了?”);
系统输出打印(“您:”);
扫描仪输入=新扫描仪(System.in).useDelimiter(\\n”);
字符串响应=input.next();
if(response.toLowerCase()包含(“bye”)| | response.toLowerCase()包含(“see ya”)
||response.toLowerCase()包含(“gtg”)){
System.out.println(“机器人:好的,再见,很高兴和你交谈!”);
}
处理器(响应);
}
公共静态无效处理器(字符串回复){
试一试{
BufferedReader=newBufferedReader(newFileReader(“convers.txt”);
整数计数=0;
试一试{
字符串行=reader.readLine();
while(行!=null){
计数++;
if(line.toLowerCase().contains(reply.toLowerCase())){
try(streamlines=Files.lines(path.get(“convals.txt”)){
line=lines.skip(count).findFirst().get();
System.out.println(“Bot:+行”);
复发();
}捕获(IOE异常){
System.out.println(“机器人:发生了什么事问题1:
最初文件不存在,并且您没有创建它
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.stream.Stream;
public class Main {
public static void main(String args[]) {
System.out.println("Bot: Hello!! My name's HiBot! What's up?");
while (true) {
System.out.print("You: ");
Scanner input = new Scanner(System.in).useDelimiter("\\n");
String response = input.next();
String lowercaseResponse = response.toLowerCase();
if (lowercaseResponse.contains("bye") || lowercaseResponse.contains("see ya")
|| lowercaseResponse.contains("gtg")) {
System.out.println("Bot: Ok, see ya. Nice talking to you!");
}
processor(response);
}
}
public static void processor(String reply) {
BufferedReader reader = null;
try {
File file = new File("convos.txt");
if (file.createNewFile())
System.out.println("Conversations file created");
reader = new BufferedReader(new FileReader(file.getName()));
int count = 0;
String line = reader.readLine();
while (line != null) {
count++;
if (line.toLowerCase().contains(reply.toLowerCase())) {
try (Stream<String> lines = Files.lines(Paths.get("convos.txt"))) {
line = lines.skip(count).findFirst().map(Object::toString).orElse("I don't know how to respond");
System.out.println("Bot: " + line);
} catch (IOException e) {
System.out.println("Bot: Something happened while reading conversation file I saw this question because someone edited the question.
Here's one test run. The "convos.txt" file exists and has a couple of response / reply text lines.
Bot: Hello! My name's HiBot! What's up?
You: hi
Bot: Hi
You: how are you
Bot: Fine. How are you?
You: Good
Bot: Sorry, I'm ignorant. How should I reply?
You: That's good to hear.
Bot: Thank you for teaching me a new reply! I'm smarter now!
You: bye
Bot: Ok, see ya. Nice talking to you!
第二期:
您正在使用recur
方法进行递归,在连续输入的情况下,这种方法可能会有风险,因为您的资源不会立即关闭,并可能导致进一步的资源匮乏问题。
您可以简单地使用infinite while
循环
改进1:
您不认为一旦用户输入bye/see ya/gtg
程序应该关闭吗
改进2:
重复调用main方法中的string.toLowerCase()
改进3:
这一行line=lines.skip(count).findFirst().get();
可能导致NoTouchElementException
我在下面的代码中添加了改进2和3
在这里,我更新了下面的代码,它根据您在问题中的详细信息工作
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
public class ChatbotExample {
public static void main(String[] args) {
new ChatbotExample().runChatbot();
}
public void runChatbot() {
Scanner scanner = new Scanner(System.in);
String[] exitResponses = { "bye", "see ya", "gtg" };
List<String> exitList = Arrays.asList(exitResponses);
boolean running = true;
System.out.println("Bot: Hello! My name's HiBot! What's up?");
ResponseMap responseMap = new ResponseMap();
FileHandler fileHandler = new FileHandler(responseMap);
fileHandler.readFile();
while (running) {
System.out.print("You: ");
String response = scanner.nextLine();
String lowercaseResponse = response.toLowerCase();
if (exitList.contains(lowercaseResponse)) {
System.out.println("Bot: Ok, see ya. Nice talking to you!");
running = false;
} else {
generateReply(scanner, responseMap, lowercaseResponse);
}
}
fileHandler.writeFile();
scanner.close();
}
private void generateReply(Scanner scanner, ResponseMap responseMap,
String lowercaseResponse) {
String text = responseMap.getResponse(lowercaseResponse);
if (text == null) {
System.out.println("Bot: Sorry, I'm ignorant. How should I reply?");
System.out.print("You: ");
String reply = scanner.nextLine();
responseMap.addResponse(lowercaseResponse, reply);
System.out.println("Bot: Thank you for teaching me a new reply! "
+ "I'm smarter now!");
} else {
System.out.println("Bot: " + text);
}
}
public class FileHandler {
private final File file;
private final ResponseMap responseMap;
private final String separator;
public FileHandler(ResponseMap responseMap) {
this.responseMap = responseMap;
this.separator = " ;;; ";
this.file = new File("convos.txt");
createFile(this.file);
}
private void createFile(File file) {
try {
if (file.createNewFile()) {
System.out.println("Conversations file created");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void readFile() {
try {
BufferedReader reader = new BufferedReader(
new FileReader(file));
String line = reader.readLine();
while (line != null) {
String[] parts = line.split(separator);
responseMap.addResponse(parts[0], parts[1]);
line = reader.readLine();
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void writeFile() {
try {
FileWriter writer = new FileWriter(file, false);
PrintWriter output = new PrintWriter(writer);
Map<String, List<String>> responses = responseMap.getResponses();
Set<String> responseSet = responses.keySet();
Iterator<String> iterator = responseSet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
List<String> text = responses.get(key);
for (String reply : text) {
String s = key + separator + reply;
output.println(s);
}
}
output.flush();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ResponseMap {
private final Map<String, List<String>> responses;
private final Random random;
public ResponseMap() {
this.responses = new HashMap<>();
this.random = new Random();
}
public Map<String, List<String>> getResponses() {
return responses;
}
public String getResponse(String key) {
List<String> possibleResponses = responses.get(key);
if (possibleResponses == null) {
return null;
} else {
int index = random.nextInt(possibleResponses.size());
return possibleResponses.get(index);
}
}
public void addResponse(String key, String text) {
List<String> possibleResponses = responses.get(key);
if (possibleResponses == null) {
possibleResponses = new ArrayList<>();
responses.put(key, possibleResponses);
}
possibleResponses.add(text);
}
}
}
import java.io.*;
导入java.nio.file.Files;
导入java.nio.file.path;
导入java.util.Scanner;
导入java.util.stream.stream;
公共班机{
公共静态void main(字符串参数[]){
System.out.println(“机器人:你好!!我叫HiBot!怎么了?”);
while(true){
系统输出打印(“您:”);
扫描仪输入=新扫描仪(System.in).useDelimiter(\\n”);
字符串响应=input.next();
String lowercasereresponse=response.toLowerCase();
if(lowercasereponse.contains(“bye”)| | lowercasereponse.contains(“see ya”)
||小写响应。包含(“gtg”)){
System.out.println(“机器人:好的,再见,很高兴和你交谈!”);
}
处理器(响应);
}
}
公共静态无效处理器(字符串回复){
BufferedReader reader=null;
试一试{
File File=新文件(“convas.txt”);
if(file.createNewFile())
System.out.println(“创建的对话文件”);
reader=newbufferedreader(newfilereader(file.getName());
整数计数=0;
字符串行=reader.readLine();
while(行!=null){
计数++;
if(line.toLowerCase().contains(reply.toLowerCase())){
try(streamlines=Files.lines(path.get(“convals.txt”)){
line=lines.skip(count).findFirst().map(Object::toString).orElse(“我不知道如何响应”);
System.out.println(“Bot:+行”);
}捕获(IOE异常){
System.out.println(“Bot:在读取对话文件时发生了一些事情问题1:
最初文件不存在,并且您没有创建它
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.stream.Stream;
public class Main {
public static void main(String args[]) {
System.out.println("Bot: Hello!! My name's HiBot! What's up?");
while (true) {
System.out.print("You: ");
Scanner input = new Scanner(System.in).useDelimiter("\\n");
String response = input.next();
String lowercaseResponse = response.toLowerCase();
if (lowercaseResponse.contains("bye") || lowercaseResponse.contains("see ya")
|| lowercaseResponse.contains("gtg")) {
System.out.println("Bot: Ok, see ya. Nice talking to you!");
}
processor(response);
}
}
public static void processor(String reply) {
BufferedReader reader = null;
try {
File file = new File("convos.txt");
if (file.createNewFile())
System.out.println("Conversations file created");
reader = new BufferedReader(new FileReader(file.getName()));
int count = 0;
String line = reader.readLine();
while (line != null) {
count++;
if (line.toLowerCase().contains(reply.toLowerCase())) {
try (Stream<String> lines = Files.lines(Paths.get("convos.txt"))) {
line = lines.skip(count).findFirst().map(Object::toString).orElse("I don't know how to respond");
System.out.println("Bot: " + line);
} catch (IOException e) {
System.out.println("Bot: Something happened while reading conversation file I saw this question because someone edited the question.
Here's one test run. The "convos.txt" file exists and has a couple of response / reply text lines.
Bot: Hello! My name's HiBot! What's up?
You: hi
Bot: Hi
You: how are you
Bot: Fine. How are you?
You: Good
Bot: Sorry, I'm ignorant. How should I reply?
You: That's good to hear.
Bot: Thank you for teaching me a new reply! I'm smarter now!
You: bye
Bot: Ok, see ya. Nice talking to you!
第二期:
您正在使用recur
方法进行递归,在连续输入的情况下,这种方法可能会有风险,因为您的资源不会立即关闭,并可能导致进一步的资源匮乏问题。
您可以简单地使用infinite while
循环
改进1:
您不认为一旦用户输入bye/see ya/gtg
程序应该关闭吗
改进2:
重复调用main方法中的string.toLowerCase()
改进3:
这一行line=lines.skip(count).findFirst().get();
可能导致NoTouchElementException
我在下面的代码中添加了改进2和3
在这里,我更新了下面的代码,它根据您在问题中的详细信息工作
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
public class ChatbotExample {
public static void main(String[] args) {
new ChatbotExample().runChatbot();
}
public void runChatbot() {
Scanner scanner = new Scanner(System.in);
String[] exitResponses = { "bye", "see ya", "gtg" };
List<String> exitList = Arrays.asList(exitResponses);
boolean running = true;
System.out.println("Bot: Hello! My name's HiBot! What's up?");
ResponseMap responseMap = new ResponseMap();
FileHandler fileHandler = new FileHandler(responseMap);
fileHandler.readFile();
while (running) {
System.out.print("You: ");
String response = scanner.nextLine();
String lowercaseResponse = response.toLowerCase();
if (exitList.contains(lowercaseResponse)) {
System.out.println("Bot: Ok, see ya. Nice talking to you!");
running = false;
} else {
generateReply(scanner, responseMap, lowercaseResponse);
}
}
fileHandler.writeFile();
scanner.close();
}
private void generateReply(Scanner scanner, ResponseMap responseMap,
String lowercaseResponse) {
String text = responseMap.getResponse(lowercaseResponse);
if (text == null) {
System.out.println("Bot: Sorry, I'm ignorant. How should I reply?");
System.out.print("You: ");
String reply = scanner.nextLine();
responseMap.addResponse(lowercaseResponse, reply);
System.out.println("Bot: Thank you for teaching me a new reply! "
+ "I'm smarter now!");
} else {
System.out.println("Bot: " + text);
}
}
public class FileHandler {
private final File file;
private final ResponseMap responseMap;
private final String separator;
public FileHandler(ResponseMap responseMap) {
this.responseMap = responseMap;
this.separator = " ;;; ";
this.file = new File("convos.txt");
createFile(this.file);
}
private void createFile(File file) {
try {
if (file.createNewFile()) {
System.out.println("Conversations file created");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void readFile() {
try {
BufferedReader reader = new BufferedReader(
new FileReader(file));
String line = reader.readLine();
while (line != null) {
String[] parts = line.split(separator);
responseMap.addResponse(parts[0], parts[1]);
line = reader.readLine();
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void writeFile() {
try {
FileWriter writer = new FileWriter(file, false);
PrintWriter output = new PrintWriter(writer);
Map<String, List<String>> responses = responseMap.getResponses();
Set<String> responseSet = responses.keySet();
Iterator<String> iterator = responseSet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
List<String> text = responses.get(key);
for (String reply : text) {
String s = key + separator + reply;
output.println(s);
}
}
output.flush();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ResponseMap {
private final Map<String, List<String>> responses;
private final Random random;
public ResponseMap() {
this.responses = new HashMap<>();
this.random = new Random();
}
public Map<String, List<String>> getResponses() {
return responses;
}
public String getResponse(String key) {
List<String> possibleResponses = responses.get(key);
if (possibleResponses == null) {
return null;
} else {
int index = random.nextInt(possibleResponses.size());
return possibleResponses.get(index);
}
}
public void addResponse(String key, String text) {
List<String> possibleResponses = responses.get(key);
if (possibleResponses == null) {
possibleResponses = new ArrayList<>();
responses.put(key, possibleResponses);
}
possibleResponses.add(text);
}
}
}
import java.io.*;
导入java.nio.file.Files;
导入java.nio.file.path;
导入java.util.Scanner;
导入java.util.stream.stream;
公共班机{
公共静态void main(字符串参数[]){
System.out.println(“机器人:你好!!我叫HiBot!怎么了?”);
while(true){
系统输出打印(“您:”);
扫描仪输入=新扫描仪(System.in).useDelimiter(\\n”);
字符串响应=input.next();
字符串小写字母response=respo