前提・実現したいこと
前提
スキャナーをメソッド化して各クラスで再利用したいです。
例外処理の練習をしたいです。
実現したいこと
Javaで標準入力で受け取った数の配列を作成し、そこに順次数値を代入し、文字列が入力した場合は
検知して再入力を促したいです。
例えば5個の要素数をもつ配列を作るとします。
int[] array = {a,b,c,d,e};
というのを楽に作りたいと思いました。
発生している問題・エラーメッセージ
エラーメッセージ Exception in thread "main" 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 sample.sc(sample.java:41) at sample.main(sample.java:8)
該当のソースコード
Java
ソースコード import java.util.InputMismatchException; import java.util.Scanner; public class sample { public static void main (String[] args){ int num = sc(); int[] array = array(num); for(int i = 0; i < array.length ; i++) { System.out.println(array[i]); } } //配列たくさん作る public static int[] array(int num) { //numの数値分の配列を作る int[] array = new int[num]; //for文で中に数値を入れる for(int i = 0; i < array.length ; i++) { array[i] = sc(); } return array; } public static int sc() { Scanner sc = new Scanner(System.in); int num = 0; //エラーのおそれがある処理 try{ num = sc.nextInt(); sc.close(); }catch (InputMismatchException e){ System.out.println("半角の数値を再度入力してください"); num = sc(); } return num; } }
試したこと
sc();は単体では正常な入力を受け取るまでループすることを確認しました。
for文のみでは配列の作成を行うことができました。
スキャナをメソッド化してから動かなくなりました。
問題がどこにあるのかを突き止めるために、プログラムの細部を何度か書き換え、おそらくsc();が二度目の呼び出し以降使えないのではないか?という今の能力で解決できない疑問に当たりました。
エラー文でグーグル検索をかけましたが、プログラミング歴が1か月程度で有効な回答にたどり着くkとができませんでした。
気になってしょうがないので、ぜひお答えいただければと思います。
補足情報(FW/ツールのバージョンなど)
openJDK17 Eclipse
まだ回答がついていません
会員登録して回答してみよう