首页 > 解决方案 > Java - emoji4j 静态方法调用结束/消失/死亡而没有错误

问题描述

我正在编写一个插件,它从不和谐中获取消息并将其发送到我的世界服务器。Minecraft 客户端很难渲染表情符号。因此,我选择使用https://github.com/kcthota/emoji4j将所有表情符号转换为它们的简码(例如:-> :smile: ..或类似的)

问题:

调用静态方法shortCodify时,它永远不会返回。几乎就好像它杀死了它所在的代码并且永远不会继续。控制台没有错误。

似乎调用该方法就在那里杀死了它。永远不会打印第 1 步。

它能够多次运行(每次我发送不和谐消息时)。它还没有完全杀死这个过程。

我努力了:

到处添加调试打印以尝试追踪问题。

PS:不要恨我混合 logger.info 和系统 println,我稍后会删除所有这些 xD

控制台输出

13:35:48 [INFO] [Core] 表情管理器存在。

13:35:48 [INFO] [Core] 尝试短代码化(包含 1738 个表情符号)

13:35:48 [信息] 调试:EventChat.java 步骤 0

是的......它停在那里!

代码片段:

我的代码/EventChat.java

注:msg是一个String

if语句(您会看到else)只是检查表情符号数据是否已加载,因为我在单独的线程中运行配置加载。知道它能够到达这里并打印数据存在,这不是问题。

...
      } else {
        logger.info("Emoji manager exists.");
        try {
          logger.info("Attempting shortcodify (contains " + EmojiManager.data().size() + " emojis)");
          System.out.println("DEBUG: EventChat.java step 0");
          msg = EmojiUtils.shortCodify(msg);
          logger.info("new message: " + msg);
        } catch (Exception e) {
          logger.info("Catching exception");
          e.printStackTrace();
        }
      }
      logger.info("Emoji processed.");

Emoji4j / EmojiUtils.java

public static String shortCodify(String text) {
    System.out.println("DEBUG: EmojiUtils.java step 1");
    String emojifiedText = emojify(text);
    System.out.println("DEBUG: EmojiUtils.java step 2");

    
    for (Emoji emoji : EmojiManager.data()) {
        StringBuilder shortCodeBuilder = new StringBuilder();
        shortCodeBuilder.append(":").append(emoji.getAliases().get(0)).append(":");

        emojifiedText = emojifiedText.replace(emoji.getEmoji(), shortCodeBuilder.toString());
        System.out.println("DEBUG: EmojiUtils.java step 2.loop");
    }
    System.out.println("DEBUG: EmojiUtils.java step 3");
    return emojifiedText;
}

标签: javadiscordminecraftbungeecord

解决方案


在似乎太久之后,我找到了答案。(是的,2个月哈哈)

注意:这仅适用于使用 JDA 和 emoji4j 的任何人

JDA 默认捕获所有 Throwables 并尝试将其记录到控制台,但由于 bungeecord 未使用相同的记录器(或类似的东西,我真的不知道为什么)而失败。

我并不太愚蠢,因为我尝试捕获所有异常并记录它们。但是它抛出了一个可抛出而不是异常......无论出于何种原因......

因此,长话短说,我正在捕捉异常,而 JDA 正在捕捉 Throwable,它表明缺少依赖项并使错误消失而不是打印到控制台。

使固定

try {

} catch (Throwable t) {
  // error is now caught and can be logged using bungee's logger
}

推荐阅读