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

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

ただいまの
回答率

87.37%

javaで電卓を作りたいが、少数を入力すると例外(?)を出す

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 6,927

score 18

前提・実現したいこと

javaで、コマンドライン上で動く簡単な電卓を作っています。

発生している問題・エラーメッセージ

入力させるときにdouble型を使って少数も計算できるようにしたいのですが、少数を入力すると例外(たぶん)を吐き出してしまいます(詳しくはコードをご覧ください)。
初心者ですので、みなさんからしたら考えられないミスかもしれないですが、ご教授よろしくお願いいたします。

ソースコード

public class dentaku{
    public static void main(String[] args){

        System.out.println("操作を選択し、入力してください。");
        System.out.println("加算:1 減算:2 乗算:3 除算:4");
        int keisan = new java.util.Scanner(System.in).nextInt();
        if( keisan == 1 ){
                System.out.println("足される数を入力してください");
                double tasareru = new java.util.Scanner(System.in).nextInt();
                System.out.println("+");
                System.out.println("足す数を入力してください");
                double tasu = new java.util.Scanner(System.in).nextInt();
                double kekka = tasareru + tasu;
                System.out.println(kekka);
                }
                
}
}



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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

少数値を整数値としてスキャンしようとしているのが原因ではないでしょうか?
new java.util.Scanner(System.in).nextInt(); 
これは入力を整数値として受け取りますので、
new java.util.Scanner(System.in).nextDouble(); 
としてみてはいかがでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/03 11:41

    早速のご回答ありがとうございます。
    ご教授いただきました通りに修正したところ、無事小数値での入力が行われました。
    とても助かりました!

    キャンセル

+1

せっかくですから例外メッセージの読み方を知っておきましょう.
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at dentaku.main(dentaku.java:9)
1行目は例外のクラス名です.どういう種類の例外が発生したかがわかります.
クラス名だけででも検索すればJavaのドキュメントが見つかると思うので,それを読めば原因がわかることもあります(特にRuntimeException系は).
2行目以降はその例外が発生した場所を示しています.括弧内はソースのjavaファイル名とその行数を示しています.
2行目は例外が発生したまさにその場所で,その下は上のメソッドを呼び出した場所です.
つまり,dentakuクラスのmainメソッドがScanner.nextIntメソッドを呼び出し,内部で別のnextIntを呼び出し,nextを呼び,throwForというメソッドを呼んだその中でこの例外が発生していることになります.
といっても,ScannerクラスはJavaの公開ライブラリなのでいじることができません.
なので,ここでは自作のクラスdentakuに問題がある,ということになります.その9行目でScanner.nextIntメソッドを使っていますが,Scannerのドキュメント(katoyさんご提示のもの)のnextIntメソッドを読むと,「例外」の項目に
InputMismatchException - 次のトークンがInteger正規表現に一致しないか範囲外である場合
とあります.難しい表現をしていますが,要は「Integerで表せる数字じゃない文字が入った」ということです.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/03 16:38

    ご回答ありがとうございます!
    これまでこのようなプログラムを開発したことがなかったので例外メッセージの読み方がわからず混乱してしまいました。ご丁寧に読み方を教えていただきましたので、これからは例外で悩むことがかなり減りそうです!

    キャンセル

0

動作させると次のようになったはずです。

$ java dentaku 
操作を選択し、入力してください。
加算:1 減算:2 乗算:3 除算:4
1
足される数を入力してください
2.3
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at dentaku.main(dentaku.java:9)

ここで Exception のメッセージを google で検索してみます。
"ava.util.InputMismatchException" と "  で囲って google の検索エリアや、ブラウザの URL エリアに入力します。
私の場合、上位こんな検索結果が出ました。
イメージ説明最初のページを読んでみると、
Scanner の使い方の例がいろいろ載っています。
float や double を読む例もありました。

Scanner の使い方が正しくなかったのだとわかります。
web 上のページをそのまま信用せずに、java の API 文書で確認をするとよいです。
- クラスScanner https://docs.oracle.com/javase/jp/8/api/java/util/Scanner.html

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/03 12:57

    ご回答ありがとうございます。
    検索しても出てこないのかなー、と思ってこちらで質問した次第でしたが、ちゃんとあるんですねw
    エラーの解決方法まで教えていただき、ありがとうございました!

    キャンセル

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

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

関連した質問

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