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

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

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

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

Q&A

解決済

2回答

2842閲覧

java のScannerクラスの使い方が誤っておりエラーが出てくる

hayato.314.nico

総合スコア11

Java

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

1グッド

0クリップ

投稿2022/10/11 15:07

前提

数字を取得して合計するクラス(以降 Sumクラス)と
Sumクラスを使うmainクラスの両方でScannerクラスのインスタンスを作成しています。

実現したいこと

・SumクラスとMainクラスの両方でScannerクラスのnextInt()メソッドを使用したいです。

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

Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:941) at java.base/java.util.Scanner.next(Scanner.java:1598) at java.base/java.util.Scanner.nextInt(Scanner.java:2263) at java.base/java.util.Scanner.nextInt(Scanner.java:2217) at Main.sum(Main.java:49) at Main.main(Main.java:42)

該当のソースコード

Java

1public class Main { 2 3 public static void main(String[] args) { 4 Scanner sc = new Scanner(System.in); 5 int h = sc.nextInt(); 6 int w = sc.nextInt(); 7 sum(); 8 } 9 10 public static int sum(){ 11 12 int sum=0; 13 Scanner sc = new Scanner(System.in); 14 sum = sc.nextInt(); 15 16 System.out.println("sum="+sum); 17 return sum; 18 } 19}

試したこと

Overview (Java Platform SE 8 )を呼んだのですが、解決方法が分かりませんでした。
「各種のアクセッサ・メソッドによってスローされ、リクエストされている要素が存在しないことを示します。」
と記載がありましたが、入力はちゃんと行っております。
Scannerクラスのインスタンを両メソッドで生成しているのが間違いでしょうか?

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

ここにより詳細な情報を記載してください。

takezoux2🎉を押しています

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

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

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

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

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

jimbe

2022/10/11 15:28 編集

>数字を取得して合計するクラス(以降 Sumクラス)と >Sumクラスを使うmainクラス クラスは class Main のみです。 void main(…) と int sum() はメソッドです。 そして、どこにも"合計する"処理はありませんが…。
guest

回答2

0

ベストアンサー

mainメソッドと sum メソッドの外に、static を付けて sc を書けばよいでしょう。

Java

1import java.util.Scanner; 2 3public class Main { 4 static Scanner sc = new Scanner(System.in); 5 6 public static void main(String[] args) { 7 int h = sc.nextInt(); 8 int w = sc.nextInt(); 9 sum(); 10 } 11 12 public static int sum() { 13 int sum = sc.nextInt(); 14 System.out.println("sum=" + sum); 15 return sum; 16 } 17}

投稿2022/10/11 16:29

kazuma-s

総合スコア8222

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

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

hayato.314.nico

2022/10/11 16:42

ありがとうございます。各メソッドの中でScannerのインスタンスを生成するのではなく Staticをつけてヒープ領域に生成するのですね。 プログラムも動きました。 回答ありがとうございます。
jimbe

2022/10/11 18:55

肝は「Staticをつけてヒープ領域に生成する」ことではなく「main/sub どちらのメソッドからも同じオブジェクトを使えるようにする」ことでしょう。 static なのは、メソッドが static だからだけではないかと思います。
hayato.314.nico

2022/10/12 03:33

jimbeさんありがとうございます。 >static なのは、メソッドが static だからだけではないかと思います。 staticメソッドからは非staticフィールドにアクセスできないからですね。 勘違いをしていましたが訂正していただきありがとうございました。
guest

0

同一のストリームから複数の Scanner を生成すると、それぞれの動作が絡まって意図しない動作をする可能性があります。
Main で作成したものを sum のパラメータとして渡す等で同一のオブジェクトを使用するようにしてください。

投稿2022/10/11 15:24

jimbe

総合スコア13327

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

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

hayato.314.nico

2022/10/11 16:44

ご回答ありがとうございます。 初心者で、同一ストリームでScannerの複数生成ができないことを存じておりませんでした。 今後気をつけます。
jimbe

2022/10/11 18:49 編集

出来なくはありません。実際にプログラムは(意図した通りでなくても)動作はしていたようですので。 本質は、 Scanner は渡されたストリームが同時に他のオブジェクトでも使われることを想定していないだろうということです。(そしてストリームではそれが普通です。) 例えば動作を高速にするため、入力されたデータは全て自身の内部に取り込んでおき、 nextInt が呼ばれたらその中から数値を取り出す…ということをやっているかもしれません。 もしそのようなことをしていたら、二つ目の Scanner でデータを読もうとしても何も残っていないことになります。 Scanner はウインドウ等 GUI を使い始めると使わなくなる(使えなくなる)類ですので CUI で始める入門時によく使われますが、実はデリケートで難しいものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問