2011-12-04 59 views
1

這是一個家庭作業問題..我正在使用JOptionPane來計算投票的程序,直到輸入Q或q並且投票計數停止。然後它啓動一個showConfirmDialog,詢問用戶他們是否真的想要退出。該程序的主要任務已經完成,但其中一條指令指出,在showInputDialog中,不是Y,y,N,n,Q或q的任何條目都將被忽略。java.lang.StringIndexOutOfBoundsException和showInputDialog

我遇到了麻煩,因爲由於某種原因,任何時候點擊對話框上的任何按鈕,程序都會關閉。程序的其餘部分工作正常,但是當我運行它時,它會給出編譯錯誤通知,並最終出現此問題。

這是我的代碼。任何想法這裏發生了什麼?感謝您的幫助。

編輯 - 就這麼你知道,System.out.println("HI");線就在那裏,所以我可以確定問題是否與繼續聲明的整個if語句相同。

編輯#2 - 我在第一個程序下面(現在是VoteCount2),使用您的建議(至少是如何解釋它)發佈我的代碼編輯。

編輯#3 - 我重新格式化它,並試圖按照您的建議。如果我做錯了,我很抱歉,但我不知道該怎麼做。

編輯#4 - 這是我如何得到它的工作..

Do { String voteString = ""; 
voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION); 
if (voteString == null || voteString.length() == 0) continue; 
else if(voteString.toLowerCase().equals("y")) 
yesVotes++; 
else if (voteString.toLowerCase().equals("n")) 
noVotes++; 

休息舊程序的

  package javaapplication16; 

      import javax.swing.JOptionPane; 

      public class VoteCount { 

      public static void main(String[] args) { 

      int yesVotes = 0, noVotes = 0, totalVotes = 0; 
      totalVotes = yesVotes + noVotes; 
      char vote; 
      int reply = 1; 
      int option = 0; 
      { 
      do { 
      String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION); 
      vote = voteString.charAt(0); 
      if (vote == 'Y' || vote == 'y') 
      yesVotes++; 
      if (vote == 'N' || vote == 'n') 
      noVotes++; 
      if (option == JOptionPane.OK_OPTION) 
      System.out.println("HI"); 
      if (option == JOptionPane.CANCEL_OPTION) 
      continue; 
      if (option == JOptionPane.CLOSED_OPTION) 
      continue; 
      { 
      } 

      if (vote == 'Q' || vote == 'q') 
      { 
      reply = JOptionPane.showConfirmDialog(null, "Quit?", "Warning!", JOptionPane.YES_NO_OPTION); 
      if (reply == JOptionPane.YES_OPTION) 
       JOptionPane.showMessageDialog(null, "yes " + yesVotes + " no " + noVotes + " total " + totalVotes); 
      else if (reply != JOptionPane.YES_OPTION); 
    continue; 
      } 
      } while (reply != JOptionPane.YES_OPTION); 

      } 
     } 
    } 


package javaapplication16; 

import javax.swing.JOptionPane; 

public class VoteCount { 

public static void main(String[] args) { 

int yesVotes = 0, noVotes = 0, totalVotes = 0; 
totalVotes = yesVotes + noVotes; 
char vote; 
    int reply = 1; 
{ 
    do { 
String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION); 
vote = voteString.charAt(0); 
if (voteString == null || voteString.length() == 0) 
vote = 'q'; 
if (voteString.toLowerCase().equals("y")) 
    yesVotes++; 
if (voteString.toLowerCase().equals("n")) 
     noVotes++; 

     { 
    } 

if (voteString.toLowerCase().equals("q")) 
{ 
    reply = JOptionPane.showConfirmDialog(null, "Quit?", "Warning!", JOptionPane.YES_NO_OPTION); 
    if (reply == JOptionPane.YES_OPTION) 
     JOptionPane.showMessageDialog(null, "yes " + yesVotes + " no " + noVotes + " total " + totalVotes); 
    else if (reply != JOptionPane.YES_OPTION); 
continue; 
     } 
    } while (reply != JOptionPane.YES_OPTION); 

    } 
    } 
} 
+0

家庭作業標籤,如果它是作業問題 –

+0

謝謝,我只是做了。 –

+0

你在哪裏設置選項,而不是在開始? –

回答

0

您嘗試從字符串獲得一個字符是否有什麼事,在字符串(就像點擊按鈕時)。一種選擇是首先檢查按鈕按壓。

另一個辦法是檢查字符串,小寫,對"y""n",例如:

if (voteString.toLowerCase().equals("y")) { 
    // etc. 

你仍然需要當用戶取消了對話框來處理null返回值。如果他們選擇「確定」,它將不會是null,但它爲空,導致出界異常。

+0

謝謝,我該如何糾正?我是否嘗試設置按鈕的值? –

+0

再次感謝。 netBeans只是凍結,所以我在電腦上等待這個,但我會嘗試改變我的if語句的方式。 –

+0

我編輯的程序,我還沒有完全解決這個問題,但看起來更接近你的建議? –

0

我在這裏看到的唯一的問題是,如果你按「取消」,有NullPointerException因爲對話框將返回null在這種情況下,輸入,但你仍會嘗試獲取第一個字符。否則它應該(並且 - 我編譯並運行它)工作得很好。

看看這兩條線:

String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION); 
vote = voteString.charAt(0); 

有兩個可能的問題。首先,讓我們說用戶按'取消'。在這種情況下,showInputDialog()返回null,所以voteStringnull。這意味着只需撥打voteString.charAt(0)就會拋出NullPointerException。您必須首先檢查null - 即,

String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION); 
if (voteString == null) { 
    // User has cancelled; let's quit 
    System.exit(0); 
} 

第二個問題是如果您按下'確定'而不輸入任何內容會發生什麼。在這種情況下,voteString的字符長度爲零,並且調用charAt(0)將拋出IndexOutOfBoundsException,因爲在索引0處沒有字符。同樣,您需要檢查這一點。添加到前面的例子:

String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION); 
if (voteString == null) { 
    // User has cancelled; let's quit 
    System.exit(0); 
} else if (voteString.length() == 0) { 
    // This will just skip to the next go-round of the do/while loop, and prompt again 
    continue; 
} 
+0

謝謝。是的,每個按鈕都應該被​​忽略,因爲q是唯一可以導致循環其餘部分的按鈕。 –

+0

「確定」返回一個空字符串,不爲空:/ –

+0

我編輯過程序來嘗試它戴夫N的方式,我仍然有錯誤。男孩,這是很多括號。我沒有任何錯誤,除了NullPointerException,當我點擊取消,感謝檢查。 –

0

有幾件事情:

正如其他人所說,你不能夠正確處理在沒有輸入的文本的情況。具體來說,如果您單擊'ok',那麼voteString將是字段中的任何內容(即空字符串)。如果您單擊取消,則voteString將爲空。你可以處理這個

一種方式是通過voteString設置爲默認值,如果檢測到以下任一條件:

if (voteString == null || voteString .equals("")) voteString = "q"; 

一些其他的東西:你永遠不要更新totalVotes。

你可以使用

vote = Character.toLowerCase(voteString.charAt(0)) 

讓輸入的字符。您甚至可以使用不同類型的對話框(允許選擇是/否/取消按鈕),而不是輸入的文本。

如果您可以使用開關(投票)塊來選擇輸入的文本。

+0

感謝您的建議。我應該補充一點,我使用的對話框是分配所必需的,而默認情況下將voteString設置爲「q」可能不是我的教授想要的。爲了做到這一點,我把它放到我的程序中,並沒有解決問題(我在那裏做錯了什麼?)。 –

+0

另外,你能否解釋我的意思是不更新totalVotes?我還需要做什麼?它在最後加起了票。謝謝。 –

+0

我不相信你瞭解我建議的更改。首先,你的第二版在右花括號的地方存在着嚴重的問題。例如,在確定字符爲'y'後,只檢查字符是否爲'n'。 其次,有一個空/空字符串處理程序的想法是使用它之前,你對字符串做任何其他檢查。 第三,將字符轉換爲小寫的想法是,您只需對y,n,q執行檢查:您不必再檢查Y,N,Q。 最後,即使它們沒有解決問題,也可以投票給有幫助的答案 – Trasvi

相關問題