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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

6463閲覧

Java 文字列を入力されたときの処理

michael-ilcsy

総合スコア180

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/04/30 10:56

編集2018/04/30 12:51

前提・実現したいこと

プログラム暦一ヶ月の初心者です。
JavaのCUIで動くローグライクもどきのゲームを作っています。
選択肢を数字で選んでもらうようにしているのですが、文字列が入ったときに「やりなおしてください」のような処理をするようなコードを書きました。以下そのコード

java

1 public static int test() { 2 int test= 0; 3 boolean a = true; 4 while (a == true) { 5 String str = new Scanner(System.in).nextLine(); 6 try { 7 test= Integer.parseInt(str); 8 a = false; 9 } catch (NumberFormatException e) { 10 System.out.println("数字を入力してください"); 11 } 12 } 13 return test; 14 }

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

しかし、一回目は文字列を打っても上手くいくのですが、さらに1~4でないときにもう一回入力してもらうとき(二回目)に文字列を打つとエラーが出ます↓
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 MysteryDungeon.Battle.BattleManager(Battle.java:45)
at MysteryDungeon.Process.Floor(Process.java:45)
at MysteryDungeon.Process.Start(Process.java:27)
at MysteryDungeon.MysteryDungeon.main(MysteryDungeon.java:34)
一回目はちゃんと動くのに二回目でエラーが出る理由が分かりません。理由(初心者でも理解できるなら)と解決法をお教えいただけると幸いです

java

1public static void BattleManager(Hero h, Monster m){ 2  int b = 0; 3 int Action = 0; 4 while(h.HP>0 && m.HP>0){ 5 System.out.println("行動を数字で選んでください。"); 6 b = 0; 7 while(b == 0) { 8 System.out.println("☆1.たたかう 2.アイテム 3.装備 4.にげる☆"); 9 Action = test(); //一回目 10 if (Action>0 && Action<5){ 11 b = 1; 12 } else { 13 boolean c = true; 14 while(c == true){ 15 System.out.println(); 16 System.out.println("1~4の中から選んでください"); 17 Action = test(); //二回目 18 if (Action>0 && Action<5){ 19 c = false; 20 } 21 } 22 } 23      if(Action==1) { 24 } else { 25 System.out.println("実装されていません"); 26 b = 0; 27 } 28 } 29 if (Action==1) { 30 h.attack(m); //Heroのattackメソッド呼び出し 31 } 32 if (m.HP>0) { 33 m.attack(h); //Monsterのattackメソッド呼び出し 34 } 35 36 } 37}

##追記
nextIntを使用しているFloorメソッド(BattleManagerの呼び出し元)のソースです

java

1 public static void Floor(Hero h) { 2 ++FloorCount; 3 int d= 0; 4 for(int i=0; i<5; i++) { 5 d= new SecureRandom().nextInt(100); 6 if(d<(50-i*10)) { 7 Slime slime = new Slime(); 8 Battle.BattleManager(h,slime); 9 } else if (d>79+(i*10)) { 10 Drakee drakee = new Drakee(); 11 Battle.BattleManager(h,drakee); 12 } else { 13 BigSlug bigSlug = new BigSlug(); 14 Battle.BattleManager(h,bigSlug); 15 } 16 } 17 }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/04/30 11:09 編集

そもそもこのコードでInputMismatchExceptionが発生するのはおかしい。例外メッセージ全体を掲載してください。あと後半のコードの、外側のwhile文が閉じるところまでのコードも。
pepperleaf

2018/04/30 11:59 編集

エラーログを見ると、 > at MysteryDungeon.Battle.BattleManager(Battle.java:45) ここは具体的にはどこになるでしょうか? ここでエラーが出ていると思います。ここで、 java.util.Scanner.nextInt の呼び出し。
michael-ilcsy

2018/04/30 12:04

> at MysteryDungeon.Battle.BattleManager(Battle.java:45) --> ちょうどAction = test(); //二回目のところです。エラー自体もここの入力で文字列を打つと発生します
swordone

2018/04/30 12:22

だとすると、testメソッドがそもそも本物か怪しい
michael-ilcsy

2018/04/30 12:25

本物か怪しいとはどういうことでしょう? 命名がお粗末なので変数名やメソッド名は自分のコードからは変えていますが、そこ以外は全く同じです。
swordone

2018/04/30 12:39

nextIntで例外というログなのに、このコードではそんなメソッド使っていないため、おかしいという話です。
michael-ilcsy

2018/04/30 12:54

エラー文にあるFloorメソッドでnextIntを使ってる場所がありましたので、追記しました。ここ以外のエラー文にあるメソッド内では使っていません。
退会済みユーザー

退会済みユーザー

2018/04/30 12:58

ランダムのnextInt じゃなく Scanner の nextInt な BattleManager の中で呼ばれてる
michael-ilcsy

2018/04/30 13:07

ScannerのnextIntでいろいろ考えてみた結果ただの大チョンボだったことが判明しました。コメントくださった皆様本当に申し訳ありませんでした
guest

回答1

0

自己解決

元々改変前はAction = new Scanner(System.in).nextInt()で数字を受け取っていました。
今回このようにソースを変えましたがmainがあるMysteryDungeon「だけ」をコンパイルした状況でテストしていたためコンパイルされていないnextIntが反応してエラーが出てたものと思われます。
mainをコンパイルしたら呼び出しているクラスは芋蔓式に勝手にコンパイルされるものと思っていましたが、ためしにBattle.java単体でコンパイルしてみたらあっさりとエラーが出なくなりました。
自分のケアレスミスによりコメントをくださった皆様やわざわざ見に来ていただいた皆様にお手数おかけしたこと深くお詫び申し上げます。

投稿2018/04/30 13:14

michael-ilcsy

総合スコア180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/05/27 23:17

ずいぶん遅いコメントで恐縮です。 少なくともクラスファイルが全くない状況だったりデフォルトパッケージに全てのソースファイルがあるような場合(?)mainメソッドがあるソースだけコンパイルすると芋づる式に必要なソースがコンパイルされるように見えますが、javacが実際にどこまでコンパイルしなおしに配慮してくれるか正直自分もわかりません。 もしjavacで複数のソースファイルがあるようなプログラムをコンパイルするなら手作業でコンパイルするのではなくなんらかのビルドツール(makeなど)でコンパイルするとよいかも知れません。しかしいずれにせよ手作業だと作業ミス(コンパイルし忘れ)なんてことも起きます。 よってできるだけIDEを導入して開発するのがよいと思います。IDEは大抵実行ボタンを押すと自動的にコンパイルしてくれるような機能がついてます。
michael-ilcsy

2018/05/27 23:40

コメントありがとうございます 自分もeclipseを早く導入したいと思っているのですが、いかんせんpcが10年くらい前のオンボロpcなのでスペックが… 出来る限り早く新しいpcを買ってIDEを導入したいと思います。
KSwordOfHaste

2018/05/28 00:10

でしたか・・・しかしメモリーさえ8GBぐらいあれば多分IDEなんかも大丈夫と思います。自分のPCは低めのスペック(64bit, 2コア,SSDとかなしの4万円台のデスクトップ)ですがメモリーだけは8GBにしてあります。あまり髙い性能を望まなければIDEやらVirtualBoxなど普通に動きますのでプログラミングの勉強にはまぁまぁと思ってます。Win10上でプログラミングやろうとすると4GBでは少々つらい印象です。
退会済みユーザー

退会済みユーザー

2018/05/28 00:39

KSwordOfHaste A.class (10:00) / A.java (11:00) B.class (10:00) / B.java (11:00) C.class (10:00) / C.java (09:00) D.class (10:00) / D.java (11:00) A->B->C->D という関係で javac A.java とすると A.class (10:00) / A.java (11:00) : コンパイルする B.class (10:00) / B.java (11:00) : コンパイルする C.class (10:00) / C.java (09:00) : コンパイルしない D.class (10:00) / D.java (11:00) : コンパイルしない となるのが芋づる式の仕様
KSwordOfHaste

2018/05/28 00:43 編集

asahina1979さん、コメントありがとうございます。 なるほど納得です!javac使うならmakefile書いた方がよさそうですねw; もしくは毎回全てコンパイルするか...
退会済みユーザー

退会済みユーザー

2018/05/28 01:59

一応補足 compile不要のクラスをみつけるとその先は最新だよねってことで確認を放棄する
michael-ilcsy

2018/05/28 11:01

asahina1979さん、コメントありがとうございます そういう仕組みでコンパイルされるんですね! 今回の質問も真ん中のProcessをいじってなかったのでコンパイルされなかったんですね。 勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問