【问题标题】:Display better error messages for the user为用户显示更好的错误消息
【发布时间】:2020-02-17 20:01:45
【问题描述】:

     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");
            }
            ...
     }

我无法向用户提供更具体的错误消息。例如,我有命令add track <argument1>add switch <argument1>。如果用户只是键入“添加”,他不应该收到错误消息“无效参数”。相反,它应该是“无效命令:使用添加轨道或添加开关)。由于relatedCommand() 是一个布尔值。我如何有效地实现这个?

【问题讨论】:

标签: java command


【解决方案1】:

正如您所提到的,目前该方法返回一个boolean,这是一个两种状态的结果。同时你也在寻求三态结果:

  1. 命令已知
  2. 命令未知
  3. 有几个已知的前缀命令。

对于有关返回正确结果的方式的问题,一种选择是返回可能的命令集合,它可以表示所需的三种状态:

  1. 集合由一个元素组成
  2. 集合为空
  3. 集合包含多个元素。

对原始代码的更改可能如下所示:

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 {
            ...
        }
 }

【讨论】:

  • 感谢您的帮助。但是如果用户只是输入“add”呢?那么输出是无效的参数。它应该告诉用户他输入了错误的命令或“未知命令”。
  • 你的意思是,因为没有 空格 符号,relatedCommand 方法将很快退出,返回空集合?在这种情况下,应该注意不同的逻辑:检查空间存在和检查COMMAND_PACKAGEcommand + " " 的原因是什么?如果您愿意,我们可以在Stack Overflow Chat 继续讨论。
  • 是的,我很乐意。如何加入?
  • 对不起,看来我没有足够的声誉,所以我们必须在 cmets 继续。只要你需要映射任何命令的第一个单词,你不应该在匹配中包含空格符号,我会更新我建议的解决方案。
  • 问题是有一个字、两个字甚至三个字的命令。例如“添加轨道”、“退出”、“删除机车车辆”。我不知道如何获取每个命令的字数。我创建了方法“getCommandNumber”,在“添加轨道”的情况下将返回 2。但是,我不确定如何在上述方法中实现它
猜你喜欢
  • 2010-10-14
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多