1

我有一小段 Java 代码,它首先检查您在 IRC 命令中输入的参数是否存在,然后再选择要运行的代码段。我正在通过 PircBotX 收听命令,下面描述的命令是一个命令,它基本上要么列出服务器上的所有人员,要么通过 command 列出频道中的所有人员:? list (all)

if ( argments[1].equalsIgnoreCase( "list" ) ) {
  CyniChat.printDebug( "Listing chosen..." );
  if ( argments[2] != null && argments[2].equalsIgnoreCase( "all" ) ) {
    CyniChat.printDebug( "You've either got 'all' as parameter..." );
    CyniChat.printDebug( event.getUser().getNick()+" : "+thisChan.getName() );
    ircResponses.listOutput( event.getUser(), event.getBot(), thisChan.getName(), true );
    return;
  } else {
    CyniChat.printDebug( "Or you don't...." );
    CyniChat.printDebug( event.getUser().getNick()+" : "+thisChan.getName() );
    ircResponses.listOutput( event.getUser(), event.getBot(), thisChan.getName(), false );
    return; 
  }
}

现在,这个语句的奇怪之处在于,虽然第一个调试语句被执行,所以控制台输出“Listing selected...”,这是它唯一输出的东西。:? list每当我在 IRC 中运行时,都不会执行其他任何调试语句。然而,当我运行时:? list all,一切似乎都运行良好,语句按正常方式执行。

很可能,我可能只是在某个地方犯了一个非常小的逻辑错误,我发现它是不可能发现的。如果有人对如何解决这种情况有任何想法,我们将不胜感激。

谢谢。

4

2 回答 2

2

如果您输入:? list,则为 2 个参数。但是如果你通过做检查第三个argments[2],这将抛出一个索引越界异常。您没有看到错误消息的原因是您可能有一个catch块忽略它而不打印错误。您需要找到它catch并至少将其放入其中:

catch (Exception e) {
    e.printStackTrace();
}

将来,永远不要将 catch 块留空。总是记录一些东西,否则当错误发生时你将无法注意到。

于 2013-10-04T21:24:32.070 回答
1

代替

if ( argments[2] != null && argments[2].equalsIgnoreCase( "all" ) ) {
    ...
}

if (arguments.length > 2 && argments[2] != null && argments[2].equalsIgnoreCase( "all" ) ) {
    ...
}

这可确保在您尝试访问数组之前,数组中有第三个元素。

于 2013-10-04T21:29:39.533 回答