質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.07%

NumberFormatExceptionを解決したい

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 241

Rivermouth

score 7

サイトURL

上記のサイトを参考にし、簡単なゲームを作っているのですが、例外が発生し、自分では対処できないと思いこちらで質問させていただきます。

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "judge"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at net.sougetu.third.CodeBreakerThird.actionPerformed(CodeBreakerThird.java:119)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

package net.sougetu.third;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.DefaultTableModel;

import net.sougetu.second.GameEngine;

public class CodeBreakerThird extends JFrame implements ActionListener {
    private JPanel panel;
    private JPanel southPanel;
    private JPanel centorPanel;
    private JScrollPane sc;
    private DefaultTableModel dtm;
    private JTable resultTable;
    private JComboBox[] inputBox = new JComboBox[3];
    private String[] selector = {"1", "2", "3", "4", "5", "6"};
    private JButton judge;
    private GameEngine ge = new GameEngine();

    public CodeBreakerThird() {
        panel = new JPanel(new BorderLayout());
        centorPanel = new JPanel();
        southPanel = new JPanel();
        dtm = new DefaultTableModel();
        dtm.addColumn("1");
        dtm.addColumn("2");
        dtm.addColumn("3");
        dtm.addColumn("HIT");
        dtm.addColumn("BLOW");

        resultTable = new JTable(dtm);
        resultTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        sc = new JScrollPane(resultTable, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                                            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        centorPanel.add(sc);

        for(int i=0; i<3; i++) {
            inputBox[i] = new JComboBox(selector);
            inputBox[i].setActionCommand("" + i);
            inputBox[i].addActionListener(this);
            southPanel.add(inputBox[i]);
        }
        judge = new JButton("JUDGEボタン");//テキスト付きのボタン生成
        judge.setActionCommand("judge");
        judge.addActionListener(this);
        southPanel.add(judge);

        panel.add(centorPanel, BorderLayout.CENTER);
        panel.add(southPanel, BorderLayout.SOUTH);
        this.getContentPane().add(panel);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(100, 100, 400, 500);
        this.pack();
        this.setTitle(ge.getTitle());
        this.setVisible(true);

        JOptionPane.showMessageDialog(this, ge.getRule(), ge.getTitle(), JOptionPane.INFORMATION_MESSAGE);

        ge.setInput(new int[] {1, 1, 1});
    }

    public void actionPerformed(ActionEvent arg0) {
        System.out.println(arg0.getActionCommand());
        if(arg0.getActionCommand().equalsIgnoreCase("judge")) {

            boolean judge = ge.judge();

            int[] ans = ge.getAnswer();
            System.out.println("答え");
            for(int i=0; i<ans.length; i++) {
                System.out.print(ans[i]);
            }
            System.out.println();
            System.out.println("入力");
            int[] input = ge.getInput();
            for(int i=0; i<input.length; i++) {
                System.out.print(input[i]);
            }
            System.out.println();
            System.out.println("hit" + ge.getHit() + "blow" + ge.getBlow());

            Object[] row = new Object[5];
            for(int i=0; i<3; i++) {
                row[i] = Integer.valueOf(input[i]);
            }
            row[3] = Integer.valueOf(ge.getHit());
            row[4] = Integer.valueOf(ge.getBlow());
            dtm.addRow(row);
            if(judge) {
                int res = JOptionPane.showConfirmDialog(this, "まだ続けますか?", "おめでとう", JOptionPane.YES_NO_OPTION);
                if(res == JOptionPane.YES_OPTION) {
                    int count = dtm.getRowCount();
                    for(int i=0; i<count; i++) {
                        dtm.removeRow(0);
                    }
                    ge.makeAnswers();
                    ge.setInput(new int[] {1, 1, 1});
                    ge.judge();

                    for(int i=0; i<inputBox.length; i++) {
                        inputBox[i].setSelectedIndex(0);
                    }
                }else {
                    System.exit(0);
                }
            }else {
                int input2 = Integer.parseInt(arg0.getActionCommand());
                ge.inputAnswer(input2, (String) inputBox[input2].getSelectedItem());
            }
        }
    }
    public static void main(String[] args) {
        new CodeBreakerThird();
    }
}
package net.sougetu.second;

import java.util.Scanner;

public class GameEngine {
    Scanner std = new Scanner(System.in);
    private String title = "***CoderBreaker***";
    private String rule = "隠された3つの数字を当てます。\n"
                        + "1つの数字は1から6の間です。\n"
                        + "3つの答えの中に同じ数字はありません。\n"
                        + "入力した数字の位置と数字があっていたらヒット\n"
                        + "数字だけあっていたらブローとします。\n"
                        + "全部当てたら終了です。";
    private int[] answer;
    private int[] input;
    private int numberOfAnswers = 3;
    private int widthOfRandom = 6;
    private int hit = 0;
    private int blow = 0;

    public GameEngine() {
        answer = new int[numberOfAnswers];
        input = new int[numberOfAnswers];
        makeAnswers();
    }

    public GameEngine(int numverOfAnswers) {
        this.numberOfAnswers = numberOfAnswers;
        answer = new int[numberOfAnswers];
        input = new int[numberOfAnswers];
        makeAnswers();
    }

    public void makeAnswers() {
        if(answer.length != numberOfAnswers) {
            answer = new int[numberOfAnswers];
            input = new int[numberOfAnswers];
        }
        for(int i=0; i<answer.length; i++) {
            boolean flag = false;
            answer[i] = (int)(Math.random() * 6 + 1);
            do {
                flag = false;
                for(int j=i-1; j>=0; j--) {
                    if(answer[i] == input[j]) {
                        flag = true;
                        answer[i] = (int)(Math.random() * 6 + 1);
                    }
                }
            }while(flag == true);
        }
    }

    public void inputAnswer(int index, int answer) {
        if(index > -1 && index < numberOfAnswers) {
            if(answer > 0 && answer <= widthOfRandom) {
                input[index] = answer;
            }
        }
    }

    public void inputAnswer(int index, String string) {
        int answer;
        answer = Integer.parseInt(string);
        inputAnswer(index, answer);
    }

    public boolean judge() {
        hit = 0;
        blow = 0;
        for(int i=0; i<answer.length; i++) {
            for(int j=0; j<answer.length; j++) {
                if(i == j && answer[i] == input[j]) {
                    hit++;
                }else if(answer[i] == input[j]) {
                    blow++;
                }
            }
        }
        return (hit == numberOfAnswers);
    }
    public int getNumberOfAnswers() {
        return numberOfAnswers;
    }
    public int getWidthOfRandom() {
        return widthOfRandom;
    }
    public int[] getAnswer() {
        return answer;
    }
    public int[] getInput() {
        return input;
    }
    public void setInput(int[] input) {
        for(int i=0; i<input.length; i++) {
            inputAnswer(i, input[i]);
        }
    }
    public int getHit() {
        return hit;
    }
    public int getBlow() {
        return blow;
    }
    public String getRule() {
        return rule;
    }
    public void setRule() {
        this.rule = rule;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle() {
        this.title = title;
    }

}

スタックトレースを見ると、CodeBreakerThirdクラスの119行目で問題が発生していると分かりました。原因としては、parseIntメソッドは文字列を10進数の整数に変換するものであるが、引数として与えているorg0.getActionCommand()の戻り値はString型で"judge"だったので、不一致が起きていると思われます。
ここからどのように訂正すれば良いのでしょうか?
分かりやすくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

java.lang.NumberFormatException: For input string: "judge"

"judge"という文字列を数値変換しようとしてエラーが出てます。
その例外(エラー)が出る行を特定して、変数の内容を確認してみよう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/30 15:10

    問題の行は
    int input2 = Integer.parseInt(arg0.getActionCommand());
    だと思っています。

    これは、judge.setActionCommand("judge");でjudgeをActionCommandとして設定しているので、エラーが出てしまっていると思うのですが、ここからどのように訂正したら良いのかが分からずに困っています。

    キャンセル

  • 2020/06/30 15:25

    そこでなにをどうしたいんでしょうか。
    間違ってjudgeになってしまってるならそれを修正すればいいだけですが、それがあってると言うなら数値変換してるのが間違いってことになりますが

    キャンセル

  • 2020/06/30 15:35

    getActionCommand()の戻り値を"0"として試したところ、例外は起きなくなりました。
    ただ、入力した数字を正しく読み込まず、ゲームとして成立しなくなってしまいました。。

    このサイトのソースコードを実行すると、"judge"なのにも関わらず正常に動くんですよね、、

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る