Java - emoji4j 静态方法调用 ends/vanishes/dies 没有错误

Java - emoji4j static method call ends/vanishes/dies without error

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

问题:

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

似乎调用该方法就好像杀死它一样。永远不会打印第 1 步。

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

我试过了:

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

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

控制台输出

13:35:48 [INFO] [Core] Emoji manager exists.

13:35:48 [INFO] [Core] Attempting shortcodify (contains 1738 emojis)

13:35:48 [INFO] DEBUG: EventChat.java step 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;
}

我在似乎太长的时间后找到了答案。 (是的,2 个月大声笑)

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

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

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

所以,长话短说,我正在捕获异常,而 JDA 正在捕获指示缺少依赖项的 Throwable 并使错误消失而不是打印到控制台。

修复

try {

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