2013-10-04 61 views
1

我有一小段Java代码首先检查您输入到IRC命令中的参数是否存在,然后它会选择要运行的代码段。我正在通过PircBotX收听命令,下面描述的命令基本上是通过命令:? list (all)列出服务器上的所有人员或通道中的所有人员的命令。一个if ... else语句不会返回任何内容

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; 
    } 
} 

现在,关于这个陈述奇怪的是,在执行第一调试语句,以便在控制台输出“清单选择......”,那就是它输出的唯一的事情。当我在IRC中运行:? list时,没有其他调试语句被执行。然而当我运行:? list all时,一切似乎都运行良好,这些语句按照常规和东西执行。

在所有可能性中,我可能只是在某处发现了一个非常小的逻辑错误,而我发现这是不可能发现的。如果任何人有任何想法如何解决这种情况,帮助将不胜感激。

谢谢。

+3

我怀疑是抛出了一个错误,并且你有一个“catch”块,在不打印错误的情况下忽略它。你能证明情况并非如此吗? –

+0

我的猜测是日志不是“冲洗”。你有没有尝试登录到另一个框架,或诉诸System.out.println()? – JustinKSU

+2

我同意tieTYT。我的猜测是参数的长度为2,因此参数[2]抛出一个ArrayIndexOutOfBoundsException,并且你有一个catch(Exception){},它会捕获它并忽略它。永远不要发生异常永远不要忽视它们。如果你不能处理例外,让它冒泡。使用调试器一步一步地执行代码将确认它。 –

回答

2

如果您输入:? list,那是2个参数。但是,如果您通过执行argments[2]来检查第三项,则会引发索引超出范围异常。你没有看到错误信息的原因是你可能有一个catch块,如果不打印错误就会忽略它。你需要找到这个catch和至少是把这个里面:

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

在未来,永远不会离开catch块空。总是记录一些事情,否则当错误发生时你将无法注意到。

+0

感谢您指引我朝着正确的方向发展。尽管如此,为了更直接的结果和理由,再次尝试/捕捉声明同样有价值,并且使我能够修复我的代码(而不是寻找可能的try/catch没有在那里)。 – M4Numbers

+0

@ M477h3w1012这是一个有效的观点,可能值得短期做,因此您可以找出症状的原因。但请注意,你只是把一个乐队援助放在一个严重的问题上(你有一个无声的catch块)。你应该尝试找到并长期解决它,否则将来会出现像这样奇怪的错误。 –

1

更换

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

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

这将确保有阵列中的第三个元素您尝试访问它。

+0

不应该是> = 2或> 1吗?如果只有两个元素,您的评估将失败。另外,为什么有点解释会帮助OP决定答案是否有价值,导致复制粘贴代码会导致更多问题,然后解决;) – MadProgrammer

+0

我会说我使用了一些代码,但不是全部。如果参数的长度大于2,那么您确实有一段冗余代码,那么我们刚刚确认存在的第三个段不能为空。除此之外......我借用了'arguments.length> 2'位,大拇指指向正确的方向,而另一个答案给了我背后的原因。 – M4Numbers

+0

@MadProgrammer:要点添加一些解释。但是'> = 2'并不意味着你只确保元素在0和1之间。它需要'> 2'。 – BanksySan