2013-10-04 97 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