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

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

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

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

Q&A

解決済

2回答

2237閲覧

ループ内のNextintでエラーが出ます

KittenMilk

総合スコア1

Java

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

0グッド

0クリップ

投稿2021/08/09 01:33

編集2021/08/09 02:38

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:937) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextInt(Scanner.java:2258) at java.base/java.util.Scanner.nextInt(Scanner.java:2212) at casino.GameManager.start(GameManager.java:75) at casino.Main.main(Main.java:6)

該当のソースコード

JAVA

1package casino; 2 3import java.util.Scanner; 4 5public class GameManager { 6 7 private int coin; 8 9 public GameManager() { 10 11 } 12 13 public void start() throws Exception{ 14 String name; 15 int selectA; 16 boolean more = true; 17 18 Scanner scanA = new Scanner(System.in); 19 BlackJack BJ = new BlackJack(); 20 21 charA("あなたの名前を入力してください",50); 22 System.out.println(""); 23 name = scanA.nextLine(); 24 25 if(coin == 0) { 26 charA("新規ボーナス!コイン100枚ゲット!!",50); 27 coin = 100; 28 System.out.println(""); 29 } 30 31 Player player = new Player(name,coin); 32 33 Thread.sleep(2000); 34 charA(player.GetName() + "さん、CatCasinoへようこそ!!",50); 35 System.out.println(""); 36 Thread.sleep(2000); 37 38 while(true) { 39 selectA = 1; 40 41 try { 42 charA("メニューを選んでください",50); 43 System.out.println(""); 44 Thread.sleep(2000); 45 System.out.println("--------------------"); 46 System.out.println("名前:" + player.GetName()); 47 System.out.println("コイン:" + player.GetCoin()); 48 System.out.println("--------------------"); 49 System.out.println("1.BLACKJACK"); 50 System.out.println("2.BACCARAT"); 51 System.out.println("3.POKER"); 52 System.out.println("--------------------"); 53 System.out.println("0.やめる"); 54 55 selectA = scanA.nextInt(); 56 57 switch(selectA) { 58 case 1: 59 charA("ブラックジャックを起動します",50); 60 System.out.println(""); 61 Thread.sleep(2000); 62 player = BJ.start(player); 63 more = true; 64 break; 65 case 2: 66 charA("バカラを起動します",50); 67 System.out.println(""); 68 Thread.sleep(2000); 69 more = true; 70 break; 71 case 3: 72 charA("ポーカーを起動します",50); 73 System.out.println(""); 74 Thread.sleep(2000); 75 more = true; 76 break; 77 case 0: 78 charA("またお会いしましょう!!",50); 79 System.out.println(""); 80 Thread.sleep(2000); 81 charA("シャットダウンします……",50); 82 more = false; 83 break; 84 default: 85 charA("表示されている選択肢で答えてください",50); 86 System.out.println(""); 87 Thread.sleep(2000); 88 more = true; 89 } 90 }catch(Exception e) { 91 charA("問題が発生しました、プログラムを終了します",50); 92 more = false; 93 } 94 95 if(player.GetCoin() == 0) { 96 charA("コインがなくなったのですね!!新たに100枚差し上げます!!",50); 97 System.out.println(""); 98 player.SetCoin(100); 99 Thread.sleep(2000); 100 } 101 102 if(more == false) { 103 break; 104 } 105 } 106 107 scanA.close(); 108 } 109 110 public void charA (String text,int sleep) throws Exception { 111 char[] work = new char[text.length()]; 112 113 for(int i = 0; i < text.length(); i++){ 114 work[i] = text.charAt(i); 115 116 //切り出した文字列を一文字ずつ出力 117 Thread.sleep(sleep); 118 System.out.print(work[i]); 119 } 120 } 121}

試したこと

BJを選択した後、BJを起動して、この画面に戻ってくるとこのエラーが出ます
現状はNoSuchElementalはエラーで吐き出してるので、問題が発生して終了するようになってます

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

エラー構文は見当たりませんでした、また、一回目だけはちゃんと入力することができます

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

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

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

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

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

Zuishin

2021/08/09 02:15

多分入力を閉じてるんでしょうね。
jimbe

2021/08/09 02:27

もし BlackJack.start() が GameManager.start() と同じ構造とすれば、そういうことになりそうですね。
KittenMilk

2021/08/09 02:31

エラー追記しました
jimbe

2021/08/09 02:36

折角追記頂きましたが、at から始まっているということは、エラー(例外)の表示の途中からではありませんか? もっと前(というか上というか)があるはずですが、表示領域が小さい等で見えなくなっていませんか。
KittenMilk

2021/08/09 02:40

すいません、追加しました なお、このエラーは真ん中のほうのトライキャッチ外したときのエラー(実質通る場所は変わらない)です
jimbe

2021/08/09 02:40

再編集ありがとうございます。これで > 現状はNoSuchElementalはエラーで吐き出してるので という文との整合性が取れます。
KittenMilk

2021/08/09 02:43

ありがとうございます 一応、エラー内容は調べたのですが、基本的に 「そのscanのあとに文章ないよ」ってエラーだと確認しました しかし、無限ループ以外は文章あるので、あれってなりました
jimbe

2021/08/09 02:46

確認ですが、ご提示の GameMaster の 75 行目は nextInt ではありません。 これはご提示のコードは多少(コンストラクタ内等)省略されているということでしょうか。
KittenMilk

2021/08/09 02:48

今ほかのシステム作り始めたのでずれたのかもしれません……が、たしかにエラー箇所はNextintでした
jimbe

2021/08/09 03:01

開発中ですとVCSを使うなどしないと難しいかと思いますが、ご提示頂くコードとその結果とが一致するようにしてください。 そうでないと何が起きているのか把握するのが難しくなり、結果、回答が難しくなります。また、回答しても「その部分は変わっちゃってます」と最初からやり直しとなる可能性が出てきますので、回答が付き難くなるのではないでしょうか。
guest

回答2

0

# みなさんのコメントをまるパクリで心苦しいモノがありますが。

多分入力を閉じてるんでしょうね。

ヒジョーに単純にしてみた。

java

1import java.util.Scanner; 2 3public class HogeScanner { 4 public static void main(final String[] args) throws Exception { 5 final Scanner scannerA = new Scanner(System.in); 6 final int aa = scannerA.nextInt(); 7 System.out.println(String.format("aa: %s", aa)); 8 scannerA.close(); 9 10 final Scanner scannerB = new Scanner(System.in); 11 final int bb = scannerB.nextInt(); 12 System.out.println(String.format("bb: %s", bb)); 13 } 14}
$ javac HogeScanner.java ; java HogeScanner 123 aa: 123 Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:862) 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 HogeScanner.main(HogeScanner.java:11)

あなたの問題と似てますでしょ?

発生している問題・エラーメッセージ java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:937) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextInt(Scanner.java:2258) at java.base/java.util.Scanner.nextInt(Scanner.java:2212) at casino.GameManager.start(GameManager.java:75) at casino.Main.main(Main.java:6)

投稿2021/08/09 02:46

shiketa

総合スコア4061

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

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

KittenMilk

2021/08/09 02:51

ほんとだ……すごい似てますね
guest

0

ベストアンサー

まずはエラーメッセージ(おそらく例外メッセージだとは思うが)を読みましょう。

エラーメッセージは怒声でも罵声でもなく、コンパイラ等からのメッセージです。

メッセージにヒントが隠されています。

問題点1: 例外を握りつぶしていること

すべては読んでいませんが、while文内の例外処理で、Exceptionで受け取って例外を捕捉しているが、その表示部では単に「問題が発生しました、プログラムを終了します」とだけしか表示していない。

そうなると『原因不明』な状態です。

エラーと言ってもいくつも理由があります。

たとえば『履歴としてのファイルを読み込んで〜』のような処理をするなら、
『ファイルがない』とかのようなものもあり得ます。
その場合はファイルを用意するか、プログラム側が自動的に生成するようにするとか。

もしかしたらいわゆるヌルポかもしれない。
インスタンス化していないオブジェクトを動かそうとしているときに発生する例外です。

その場合はインスタンス化して動かすとか。

そう言う風に『原因がわかれば』、『解決方法もわかる』のですが、
今回は単に『問題が発生した』とだけなので理由すらわからない。
だから解決できないのです。

できれば個別に、せめて『例外メッセージを出力する』ことを強くお勧めします。

問題点2: 仕様がはっきりしない

コードだけ出されてもわかりません。

プログラムは書いた通りにしか動きません。
なので『何がしたいのか』がわからないのです。

たとえば『このような動きをさせたいが、実際にはこうなる』とかのような感じで赤の他人が読んでもわかるような説明をすべきです。

回答者は質問者と同じ環境にある…わけじゃないです。
提示された情報からしか読み取れません。

問題点3: コードが省略されている

BJの定義が曖昧です。
クラス定義もちゃんと載せましょう。

もしかしたらそこが原因かもしれませんよ?


[追記1]

全部公開いたしました

なお、BJは1000文字で収まりきらないのと、BJのほうに遷移はちゃんとしてくれるが、戻ってきたときにエラーが出ます

字数制限で出せないならpastebin plなりGitHubなりを使って提示した方がいいです。

あと、一度trycatchを外してやった時に、NoSuchElementalexception(main.java,75)というエラーが出ました

75行目の該当が、selectA=scanA.nextintのところで、

そう言う場合は公式で調べましょう。

今回は例外クラスなので調べればありますよ。

ですが、今回はわかりにくいので。

最初の一周は通るのですが、画面遷移から戻ってきたとき(2週目以降)にエラーが出ます

恐らく、『標準入力』が原因じゃないかなと…

参考: ヒント

後はわかりません。上記じゃなければPlayerクラスとかが原因だろうけど提示されていないから…

投稿2021/08/09 02:01

編集2021/08/09 02:44
BeatStar

総合スコア4962

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

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

KittenMilk

2021/08/09 02:23

全部公開いたしました なお、BJは1000文字で収まりきらないのと、BJのほうに遷移はちゃんとしてくれるが、戻ってきたときにエラーが出ます あと、一度trycatchを外してやった時に、NoSuchElementalexception(main.java,75)というエラーが出ました 75行目の該当が、selectA=scanA.nextintのところで、 最初の一周は通るのですが、画面遷移から戻ってきたとき(2週目以降)にエラーが出ます
TetsujiMiwa

2021/08/09 06:00

問題は恐らく、「NoSuchElementalexception」ではなく「最初の一周は通るのですが、画面遷移から戻ってきたとき(2週目以降)にエラーが出ます」にあるかと思います。後者の問題を解析する過程で、前者の別の事象に巡り合ってしまったと予想します。 多分、「player = BJ.start(player);」で、nullが返ってきてませんかね?
BeatStar

2021/08/09 06:07 編集

@ TetsujiMiwaさん > 問題は恐らく、「NoSuchElementalexception」ではなく だと思います。ですが、コードが端折られたままなので、推測の域を出ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問