Java try catch 块没有捕捉到异常

Java try catch block not catching an exception

我正在使用 JDA 发出清除消息的命令。 我做了这个代码

public class Main {
  public static JDA jda;
  public static void main(String[] args) throws LoginException {
  jda = JDABuilder.createDefault("OTM0ODA4NTY1ODYzMDM5MDA3.Ye1eUg.JExQxPx8UUli8YQfN7TfdbzLHqI").build();
  jda.addEventListener(new CommandExecutor());
} }

public class CommandExecutor extends ListenerAdapter {
    public static final String prefix = "!-";
    public void onMessageReceived(MessageReceivedEvent event) {
        String[] args = event.getMessage().getContentRaw().split(" ");
        if (args[0].equalsIgnoreCase(prefix + "clear"))
            new Clear(event, args);
} }

public class Clear {
    public Clear(MessageReceivedEvent event, String[] args) {
        try {
            int numberOfMessages = Integer.parseInt(args[1]);
            List<Message> messages = event.getChannel().getHistory().retrievePast(numberOfMessages + 1).complete();
            event.getChannel().purgeMessages(messages);
            event.getChannel().sendMessage("Messages have been deleted!").queue(m -> m.delete().queueAfter(5, TimeUnit.SECONDS));
        } catch (Exception e) {
            e.printStackTrace();
} } }

如果传递了有效参数,try 块中的代码将清除消息。如果传递了一个无效的参数,比如一个字符串,它应该转到 catch 块并打印异常的详细信息。然而,这并没有发生,而是产生了错误。
这是生成的错误

java.lang.NumberFormatException: For input string: "de"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    at java.base/java.lang.Integer.parseInt(Integer.java:668) 
    at java.base/java.lang.Integer.parseInt(Integer.java:786) 
    at JDA.TelevisionBot.Commands.Clear.<init>(Clear.java:24) 
    at JDA.TelevisionBot.CommandExecutor.onMessageReceived(CommandExecutor.java:26)
    at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:359)
    at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
    at net.dv8tion.jda.internal.hooks.EventManagerProxy.handleInternally(EventManagerProxy.java:88)
    at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:70)
    at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:164)
    at net.dv8tion.jda.internal.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:121)
    at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:36)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:952)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:839)
    at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:817)
    at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:991)
    at com.neovisionaries.ws.client.ListenerManager.callOnBinaryMessage(ListenerManager.java:385)
    at com.neovisionaries.ws.client.ReadingThread.callOnBinaryMessage(ReadingThread.java:276)
    at com.neovisionaries.ws.client.ReadingThread.handleBinaryFrame(ReadingThread.java:996)
    at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:755)
    at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:108)
    at com.neovisionaries.ws.client.ReadingThread.runMain(ReadingThread.java:64)
    at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)

提前致谢

自 e.printStackTrace() 以来,您得到您指示的所有内容是正常的,它是 Exception 实例上的一个方法,将实例的堆栈跟踪打印到 System.err。

这是一个非常简单但非常有用的异常诊断工具。它会告诉您发生了什么以及发生在代码中的什么位置。

try {
  throw new NullPointerException();
}
catch (NullPointerException e) {
  System.out.println(e);
}

try {
  throw new IOException();
}
catch (IOException e) {
   e.printStackTrace();
}
System.exit(0);

调用 println(e):

java.lang.NullPointerException

调用e.printStackTrace():

java.io.IOException
      at package.Test.main(Test.java:74)