Java - emoji4j 静态方法调用结束/消失/死亡而没有错误

Posted

技术标签:

【中文标题】Java - emoji4j 静态方法调用结束/消失/死亡而没有错误【英文标题】:Java - emoji4j static method call ends/vanishes/dies without error 【发布时间】:2020-06-26 19:31:51 【问题描述】:

我正在编写一个插件,它从 discord 中获取消息并将其发送到我的世界服务器。 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 [INFO] 调试:EventChat.java 步骤 0

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

代码 sn-ps:

我的代码/EventChat.java

注意:msgString

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;

【问题讨论】:

您是否尝试过使用实际调试器而不是基于打印的调试? 在 bungeecord 服务器上运行时很难做到......它不是一个独立的程序。 【参考方案1】:

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

注意:这仅适用于将 JDA 与 emoji4j 一起使用的任何人

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

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

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

修复

try 

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

【讨论】:

以上是关于Java - emoji4j 静态方法调用结束/消失/死亡而没有错误的主要内容,如果未能解决你的问题,请参考以下文章

static

Java方法

java CountDownLatch 控制异步和同步

在java中,为啥类实例也能访问静态域?

静态方法怎么调用

Java中方法调用总结