Java 程序不连续运行

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

我正在编写一个聊天机器人程序,如果聊天机器人没有回答用户问题的信息,它会询问用户如何回答问题,然后将其存储在txt文件中。稍后,当问到另一个问题时,从txt文件中检索信息,然后整个过程重新开始(或者至少应该重新开始)

然而,在用户发出一个查询后,程序可以运行,我再次按enter键进行第二次尝试,结果什么也没发生

这是我的密码:

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