Java 为用户显示更好的错误消息

Java 为用户显示更好的错误消息,java,command,Java,Command,我无法向用户提供更具体的错误消息。例如,我有命令addtrack和addswitch。如果用户只是键入“add”,他就不会得到错误消息“invalid arguments”。相反,它应该是“无效命令:使用add track或add switch)。因为relatedCommand()是一个布尔值。如何有效地实现它?如您所述,当前该方法返回一个布尔值,这是一个两状态结果。同时,您正在寻找三状态结果: 命令是已知的 命令未知 前缀有几个已知的命令 对于返回正确结果的方式,一个选项是返回可能的命令集合

我无法向用户提供更具体的错误消息。例如,我有命令
addtrack
addswitch
。如果用户只是键入“add”,他就不会得到错误消息“invalid arguments”。相反,它应该是“无效命令:使用add track或add switch)。因为relatedCommand()是一个布尔值。如何有效地实现它?

如您所述,当前该方法返回一个
布尔值,这是一个两状态结果。同时,您正在寻找三状态结果:

  • 命令是已知的
  • 命令未知
  • 前缀有几个已知的命令
  • 对于返回正确结果的方式,一个选项是返回可能的命令集合,它可以表示所需的三种状态:

  • 集合由一个元素组成
  • 集合为空
  • 集合由多个元素组成
  • 对原始代码的更改可以如下所示:

    
         private boolean relatedCommand(String input) {
                // make sure the split afterwards has at least size one
                if (input.matches(" .*")) {
                    return false;
                }
                final String command = input.split(" ".toString())[0];
                return COMMAND_PACKAGE
                        .keySet()
                        .stream()
                        .map(Pattern::toString)
                        .anyMatch(patternText -> patternText.startsWith(command + " "));
          }
    
    
        public Command getCommand(final String input) throws InvalidInputException {
                if (relatedCommand(input)) {
                    Terminal.printError("test");
                    throw new InvalidInputException("invalid arguments");
                } else {
                    throw new InvalidInputException("unknown command");
                }
                ...
         }
    
    
    private Collection related命令(字符串输入){
    //确保以后的拆分至少有一个大小
    if(input.matches(“.*)){
    返回集合。emptyList();
    }
    最后一个字符串命令=input.split(“.toString())[0];
    返回命令包
    .keySet()
    .stream()
    .map(模式::toString)
    .filter(patternText->patternText.startsWith(comman))
    .collect(Collectors.toList());
    }
    公共命令getCommand(最终字符串输入)引发InvalidInputException{
    集合命令=相关命令(输入)
    if(commands.size()==1){
    终端打印错误(“测试”);
    抛出新的InvalidInputException(“无效参数”);
    }else if(commands.isEmpty()){
    抛出新的InvalidInputException(“未知命令”);
    }否则{
    ...
    }
    }
    
    非常感谢您的帮助。但是如果用户只是键入“add”怎么办?那么输出的参数无效。它应该告诉用户他键入的命令不正确或“unknown command”“。您的意思是,由于没有空格符号,
    relatedCommand
    方法将很快退出,返回空集合吗?在这种情况下,应该注意不同的逻辑:检查空间存在和检查
    COMMAND\u包
    COMMAND+“”
    的原因是什么?如果你愿意,我们可以继续讨论。是的,我很乐意。我怎样才能加入?抱歉,看起来我没有足够的声誉,所以我们必须在这里继续评论。只要您需要映射任何命令的第一个单词,就不应该在匹配中包含空格符号,我将更新建议的解决方案。问题是有一个单词、两个单词甚至三个单词的命令。例如“添加轨道”、“退出”、“删除车辆”。我不知道如何获得每个命令的单词amount。我创建了方法“getCommandNumber”,在“addTrack”的情况下返回2。但是,我不知道如何在上述方法中实现这一点。因此,如果您只是在寻找解析用户输入命令的方法,请查看以下问题:
    private Collection<String> relatedCommand(String input) {
            // make sure the split afterwards has at least size one
            if (input.matches(" .*")) {
                return Collections.emptyList();
            }
            final String command = input.split(" ".toString())[0];
            return COMMAND_PACKAGE
                    .keySet()
                    .stream()
                    .map(Pattern::toString)
                    .filter(patternText -> patternText.startsWith(comman))
                    .collect(Collectors.toList());
      }
    
    
    public Command getCommand(final String input) throws InvalidInputException {
            Collection<String> commands = relatedCommand(input)
            if (commands.size() == 1) {
                Terminal.printError("test");
                throw new InvalidInputException("invalid arguments");
            } else if (commands.isEmpty()) {
                throw new InvalidInputException("unknown command");
            } else {
                ...
            }
     }