2011-12-04 1 views
1

これは宿題の問題です..私はQまたはqを入力し、投票数が停止されるまで、投票をカウントするJOptionPaneを使用するプログラムに取り組んでいます。その後、ユーザーに実際に終了したいかどうかを尋ねるshowConfirmDialogを起動します。プログラムの主なタスクは完了しましたが、showInputDialogではY、y、N、n、Q、またはq以外のエントリは無視されることが指示されています。java.lang.StringIndexOutOfBoundsExceptionとshowInputDialog

何らかの理由で、ダイアログボックス上の任意のボタンがクリックされるたびに、プログラムがシャットダウンした、ので、私はこれで問題を抱えています。プログラムの残りの部分は正常に動作しますが、実行するとコンパイルエラー通知が表示され、この問題が発生します。

ここに私のコードです。ここで何が起こっているか考えてみましょうか?ご協力いただきありがとうございます。

EDIT - ちょうどあなたが知っている通り、System.out.println("HI");行があったので、その問題がその場所にあるcontinue文のif文全体であるかどうかを判断できました。

EDIT#2 - 最初のプログラム(今はVoteCount2)の下にあなたのアドバイス(少なくとも私がそれをどのように解釈したか)を使ってコードの編集を掲載しました。

EDIT#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

あなたは中に何があるのか​​否かの文字列から文字を取得しよう文字列(ボタンがクリックされたときのような)。 1つの選択肢は、最初にボタン押下をチェックすることである。

もう一つは、例えば、"y"または"n"に対して、小文字、文字列をチェックするために、次のようになります。

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

ユーザーがダイアログボックスでキャンセルするときは、まだnull戻り値を処理する必要があります。彼らは、「OK」を選択した場合、それはnullではありませんが、それは範囲外の例外を発生させ、空になります。

+0

ありがとう、どうすれば修正できますか?ボタンの値を設定しようとしていますか? –

+0

もう一度ありがとうございます。 netBeansはただ凍っているので、私はこれでコンピュータを待っていますが、if文を自分のやり方で変更しようとしています。 –

+0

私はプログラムを編集しましたが、私はまだ問題をかなり解決していませんでしたが、あなたがアドバイスしたものに近くなっていますか? –

0

ここで唯一の問題は、「キャンセル」を押すとnullが入力として返されるため、最初の文字をフェッチしようとするため、NullPointerExceptionがあることです。さもなければ、私はそれをコンパイルして実行しなければなりません。

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

考えられる原因は2つありますこの2行で

ルック。まず、ユーザーが「キャンセル」を押すとします。その場合、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); 
} 

第2の問題は何も入力せずに「OK」を押すとどうなりますか。この場合、voteStringの長さは0文字です。インデックス0には文字がないため、を呼び出すとIndexOutOfBoundsExceptionが返されます。また、これを確認する必要があります。前の例に追加:

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

ありがとうございます。はい、すべてのボタンは、ループの残りの部分につながる唯一のものであるため無視してください。 –

+0

「OK」は空の文字列を返すが、nullではない:/ –

+0

私はそれを試してみるためにプログラムを編集した.Dave Nの方法で、私はまだエラーがある。少年は大量の括弧です。私はキャンセルすると、NullPointerException以外のエラーはありません。チェックのおかげです。 –

0

いくつかのことを:

他の人が述べたように、あなたが正しく入力テキストがない状況に対処していません。具体的には、「OK」をクリックすると、voteStringはそのフィールドにあるもの(つまり、空の文字列)になります。キャンセルをクリックすると、voteStringはnullになります。これらの条件のいずれかが検出された場合は、これを扱うことができ

一つの方法は、デフォルト値にvoteStringを設定することである:

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

いくつかの他の事:あなたは今までtotalVotesを更新しません。

あなたは、入力した文字を取得するために

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

を使用することができます。入力したテキストではなく、異なる種類のダイアログ(yes/no/cancelボタンの選択が可能)を使用することもできます。

スイッチ(投票)ブロックを使用して入力したテキストを選択できる場合は、

+0

アドバイスをいただきありがとうございます。私は、私が使用したダイアログボックスが割り当てによって必要とされ、デフォルトで "q"に設定されているのはおそらく私の教授が望むものではないと付け加えるべきです。しかし、私はそれを私のプログラムに入れましたが、それは問題を解決しませんでした(私はそこに何か間違っていましたか?)。 –

+0

また、私はtotalVotesを更新しないという意味を説明できますか?私は何をする必要がありますか?それは最後に票を集める。ありがとう。 –

+0

私はあなたが私が提案した変更を理解したとは思わない。第1に、バージョン2は、中かっこがどこにあるかに重大な問題があります。たとえば、キャラクタが「y」であると判断した後で、キャラクタが「n」であるかどうかをチェックするだけです。 第2に、ヌル/空文字列のハンドラを使用するという考えは、文字列の他のチェックを行う前にそれを使用することです。 第3に、文字を小文字に変換するという考え方は、y、n、qのチェックを行うだけでよいので、Y、N、Qをもうチェックする必要はありません。 最後に、問題が解決しなくても有益な回答を投稿してください – Trasvi