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

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

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

Java Development Kit(JDK)とは、Javaでの開発のために要するソフトウェアをまとめたパッケージです。コンパイラの「Javac」やクラスライブラリの「jar」など、Java開発者向けツールが含まれています。

Java

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

VSCodeDevContainer

VSCode Dev Containerは、VSCodeの拡張機能の一つ。Dockerコンテナ上でVSCodeの機能が使える開発環境を構築できます。開発環境の可搬性や再現性が高く、ローカル環境への影響が低い点などが特徴です。

Q&A

解決済

2回答

454閲覧

vscodeのjavaにおいてscanner.nextInt() が飛ばされてしまう

wawakaza

総合スコア1

Java Development Kit

Java Development Kit(JDK)とは、Javaでの開発のために要するソフトウェアをまとめたパッケージです。コンパイラの「Javac」やクラスライブラリの「jar」など、Java開発者向けツールが含まれています。

Java

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

VSCodeDevContainer

VSCode Dev Containerは、VSCodeの拡張機能の一つ。Dockerコンテナ上でVSCodeの機能が使える開発環境を構築できます。開発環境の可搬性や再現性が高く、ローカル環境への影響が低い点などが特徴です。

0グッド

0クリップ

投稿2024/03/20 11:14

実現したいこと

vscode内でなぜかscanner.nextIntの入力が飛ばされてしまうことを解決したい

前提

vscodeで遊びながらjavaの勉強をしていて、オブジェクト指向に慣れるために複数のファイルを使って一つのプロジェクトを作成する練習をしていました。
そこで簡単なRPG的なものを作っていたら入力部分が飛ばされてしまい、うまく実行できませんでした。
下記にエラーメッセージと使っていた3つのファイルを載せておきます。
問題となっている入力の部分が分かりやすいようにコメントで補足してあります。

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

Let's enjoy playing adventure! Input your name in English. testKun At first, testKun should get to a higher level. Let's go to kill weaker enemies than testKun. Current level is 1. Current HP is 10. Skills that you can use now are hit protect runAway sleep You are attacked by mushroom monster. Let's fight! Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:945) at java.base/java.util.Scanner.next(Scanner.java:1602) at java.base/java.util.Scanner.nextInt(Scanner.java:2267) at java.base/java.util.Scanner.nextInt(Scanner.java:2221) at Enemy.fight(Enemy.java:10) at Quest.main(Quest.java:24)

該当のソースコード

java

1import java.util.Scanner; //mainで使ってるファイル 2public class Quest { 3 public static void main(String[] args){ 4 System.out.println("Let's enjoy playing adventure!"); 5 System.out.println("Input your name in English."); 6 Scanner scanner = new Scanner(System.in); 7 String name = scanner.nextLine(); 8 System.out.println("At first, " + name + " should get to a higher level."); 9 System.out.println("Let's go to kill weaker enemies than " + name + "."); 10 String[] wayAttack = new String[4]; 11 wayAttack[0] = "hit"; 12 wayAttack[1] = "protect"; 13 wayAttack[2] = "runAway"; 14 wayAttack[3] = "sleep"; 15 int[] damage = new int[4]; 16 int hp; 17 damage[0] = 5; 18 damage[1] = 0; 19 damage[2] = 0; 20 damage[3] = 0; 21 Hero hero = new Hero(); 22 hp = hero.printStatus(wayAttack); 23 Enemy enemy = new Enemy(); 24 enemy.fight(wayAttack,damage,hp); 25 scanner.close(); 26 } 27}

java

1import java.util.Scanner; 2public class Hero { 3 public int printStatus (String[] wayAttack){ 4 Scanner scanner = new Scanner(System.in); 5 int level = 1,hp = 10,i = 0; 6 System.out.println("Current level is " + level + "."); 7 System.out.println("Current HP is " + hp + "."); 8 System.out.print("Skills that you can use now are "); 9 for(i = 0; i < 4; i++){ 10 if(i!=3) System.out.printf("%s ",wayAttack[i]); 11 else System.out.printf("%s\n",wayAttack[i]); 12 } 13 scanner.close(); 14 return hp; 15 } 16}

java

1import java.util.Scanner; 2 3public class Enemy { 4 public void fight(String[] wayAttack, int[] damage, int hp) { 5 Scanner scanner = new Scanner(System.in); 6 int mashroom = 10, n; 7 System.out.println("You are attacked by mushroom monster."); 8 System.out.println("Let's fight!"); 9 while (hp > 0 && mashroom > 0) { 10 n = scanner.nextInt(); //ここの入力が飛ばされてしまう。 11 System.out.println("You choose " + wayAttack[n] + "."); 12 mashroom -= damage[n]; 13 System.out.println("You are hit by mushroom."); 14 hp -= 2; 15 System.out.println("Enemy's remaining HP is " + mashroom + "."); 16 } 17 if (hp == 0) { 18 System.out.println("Game Over..."); 19 System.out.println("You wake up in the hospital."); 20 } else if (mashroom <= 0) { 21 System.out.println("You defeat the mushroom."); 22 } 23 scanner.close(); 24 } 25} 26

試したこと

chatgpt を使ってみたものの、chatgptにはよくわからなかったみたい

補足情報(FW/ツールのバージョンなど)

openjdk version "21.0.2"
vscode -version "1.87.2"

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下を参照ください。
参考: JAVA Scannerのインスタンス化について

Scanner#nextIntなどは最後の改行文字(\n)を取らないため、想定している挙動を示しません。
実装される場合はScanner#nextLineを挟んでおくか、そもそもScanner#nextLineで取得して数値に変換された方が安全かと思います。

投稿2024/03/20 11:20

Refrain

総合スコア539

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

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

wawakaza

2024/03/20 12:40

入力部分を下記のようにしましたがダメでした。 初心者なので具体的にscanner.nextInt()をどの文法を使えると改善できるか教えていただけると助かります。 ’’’ String input = scanner.nextLine(); // 改行文字を読み捨てる n = Integer.parseInt(input); ’’’
Refrain

2024/03/20 12:46

"ダメでした"とは、具体的に何があったのでしょうか?
wawakaza

2024/03/20 12:55

下記がエラーコードです。 ''' Let's enjoy playing adventure! Input your name in English. testkun At first, testkun should get to a higher level. Let's go to kill weaker enemies than testkun. Current level is 1. Current HP is 10. Skills that you can use now are hit protect runAway sleep You are attacked by mushroom monster. Let's fight! Exception in thread "main" java.util.NoSuchElementException: No line found at java.base/java.util.Scanner.nextLine(Scanner.java:1660) at Enemy.fight(Enemy.java:10) at Quest.main(Quest.java:24) '''
Refrain

2024/03/20 13:03

恐らく、`Hero#printStatus`の中で`Scanner#close`を実行したことで標準入力が閉じられたからと思われます。 例えば各処理の引数に`Scanner`を渡してあげて1個の`Scanner`で処理を行うなどされると良いかもしれません。
wawakaza

2024/03/20 13:30

Hero.javaのscanner.close()を消したところ改善したので、おっしゃる通りHero.java内で標準入力が閉じられたから問題が起こったことが分かりました。 初心者すぎて申し訳ないのですが、"例えば各処理の引数に`Scanner`を渡してあげて1個の`Scanner`で処理を行うなどされると良いかもしれません。"の意味が分かりません。 もし良ければ、簡単にその部分のコードなどを書いていただけると助かります。 Hero.javaのscanner.close()を消すことで改善はしたので、もしそのままでも良いのであれば解決とさせていただきます。
Refrain

2024/03/20 13:33

一旦は解決して良かったです。 凄く砕けた書き方はさせて貰います。 以下のようにメインの処理部で`Scanner`のインスタンスを持ち、呼び出し時に引数として`Scanner`のインスタンスを渡すという意味合いです。 ```java void main (String[] args) { Scanner scanner = new Scanner(System.in); do_something(scanner); scanner.close(); } void do_something (Scanner scanner) { String text = scanner.nextLine(); System.out.println(text); } ```
wawakaza

2024/03/20 13:40

解決しました! 長い時間付き合って下さり、ありがとうございました。 コードの説明もすごくわかりやすかったです!
Refrain

2024/03/20 14:01

個人的な見解ですが、クラスの構造をもう少し見直した方が、後々の開発時の管理が楽になるかなと感じました。
guest

0

複数のクラスを作ればオブジェクト指向な訳ではありません。
現実の物質的なモノを模して個々のクラスを意味のあるデータ群とそれを操作するメソッド群の纏まりとして定義し、そのインスタンス(オブジェクト)を組み合わせて全体の動きを成すようにすることで、プログラムの見通しを良くすることに意味があります。
良く在りそうなのは、車を構成するモノとしてボディとかエンジンとかタイヤとかがありそれらもまたもっと細かいモノで成っている…といったことでしょうか。

質問のコードでは、Hero と Emeny が戦うという状況を再現していますが、それぞれクラスになっていてもデータは何も持っていません。これでは Hero や Enemy が無くても Main クラスに printStatus や fight メソッドを定義すれば事足ります。
Hero には Hero の 名前やレベル等、 Enemy には Enemy の 名前や hp 等を持たせて、戦い自体は Enemy のメソッドでは無く "場" として Main のメソッドで Hero や Enemy を使う形にします。

java は public で無ければ class を一つのファイル内に纏めることが出来ますので、簡単なプログラムはそのほうが管理が簡単です。

java

1import java.util.*; 2 3public class Quest { 4 public static void main(String[] args){ 5 Scanner scanner = new Scanner(System.in); 6 7 System.out.println("Let's enjoy playing adventure!"); 8 System.out.println("Input your name in English."); 9 String name = scanner.nextLine(); 10 11 System.out.println("At first, " + name + " should get to a higher level."); 12 System.out.println("Let's go to kill weaker enemies than " + name + "."); 13 14 Hero hero = new Hero(name, 1, 10, new Attack[]{Attack.HIT,Attack.PROTECT,Attack.RUNAMAY,Attack.SLEEP}); 15 hero.printStatus(); 16 17 Enemy mashroom = new Enemy("mashroom", 10, 2); //敵: name="mashroom", hp=10, damage=2 18 19 fight(scanner, hero, mashroom); 20 } 21 22 static void fight(Scanner scanner, Hero hero, Enemy enemy) { 23 System.out.println("You are attacked by " + enemy.name + " monster."); 24 System.out.println("Let's fight!"); 25 26 while (hero.hp > 0 && enemy.hp > 0) { 27 int n = scanner.nextInt(); 28 Attack attack = hero.attacks[n]; 29 System.out.println("You choose " + attack.text + "."); 30 enemy.hp -= attack.damage; 31 System.out.println("You are hit by " + enemy.name + "."); 32 System.out.println("Enemy's remaining HP is " + enemy.hp + "."); 33 34 hero.hp -= enemy.damage; 35 } 36 37 if (hero.hp <= 0) { 38 System.out.println("Game Over..."); 39 System.out.println("You wake up in the hospital."); 40 } else { 41 System.out.println("You defeat the " + enemy.name + "."); 42 } 43 } 44} 45 46//攻撃手段、ダメージ量 47enum Attack { 48 HIT("hit",5), PROTECT("protect",0), RUNAMAY("runAway",0), SLEEP("sleep",0); 49 50 final String text; 51 final int damage; 52 Attack(String text, int damage) { 53 this.text = text; 54 this.damage = damage; 55 } 56} 57 58//ヒーロー 59class Hero { 60 final String name; 61 int level, hp; 62 Attack[] attacks; 63 64 Hero(String name, int level, int hp, Attack[] attacks) { 65 this.name = name; 66 this.level = level; 67 this.hp = hp; 68 this.attacks = attacks; 69 } 70 71 public void printStatus(){ 72 System.out.println("Current level is " + level + "."); 73 System.out.println("Current HP is " + hp + "."); 74 75 StringJoiner sj = new StringJoiner(" ", "Skills that you can use now are ", ""); 76 for(Attack a : attacks) sj.add(a.text); 77 System.out.println(sj.toString()); 78 } 79} 80 81//エネミー 82class Enemy { 83 final String name; 84 int hp, damage; 85 86 Enemy(String name, int hp, int damage) { 87 this.name = name; 88 this.hp = hp; 89 this.damage = damage; 90 } 91}
Let's enjoy playing adventure! Input your name in English. YUKIKAZE At first, YUKIKAZE should get to a higher level. Let's go to kill weaker enemies than YUKIKAZE. Current level is 1. Current HP is 10. Skills that you can use now are hit protect runAway sleep You are attacked by mashroom monster. Let's fight! 0 You choose hit. You are hit by mashroom. Enemy's remaining HP is 5. 1 You choose protect. You are hit by mashroom. Enemy's remaining HP is 5. 2 You choose runAway. You are hit by mashroom. Enemy's remaining HP is 5. 3 You choose sleep. You are hit by mashroom. Enemy's remaining HP is 5. 1 You choose protect. You are hit by mashroom. Enemy's remaining HP is 5. Game Over... You wake up in the hospital.

投稿2024/03/20 19:19

編集2024/03/21 05:32
jimbe

総合スコア13168

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問