前提・実現したいこと
前提
スキャナーをメソッド化して各クラスで再利用したいです。
例外処理の練習をしたいです。
実現したいこと
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
1ソースコード 2import java.util.InputMismatchException; 3import java.util.Scanner; 4 5public class sample { 6 public static void main (String[] args){ 7 8 int num = sc(); 9 int[] array = array(num); 10 11 for(int i = 0; i < array.length ; i++) { 12 System.out.println(array[i]); 13 } 14 15 } 16 17 //配列たくさん作る 18 public static int[] array(int num) { 19 20 //numの数値分の配列を作る 21 int[] array = new int[num]; 22 23 //for文で中に数値を入れる 24 for(int i = 0; i < array.length ; i++) { 25 array[i] = sc(); 26 } 27 28 return array; 29 30 } 31 32 33 34 public static int sc() { 35 Scanner sc = new Scanner(System.in); 36 37 int num = 0; 38 39 //エラーのおそれがある処理 40 try{ 41 num = sc.nextInt(); 42 sc.close(); 43 }catch (InputMismatchException e){ 44 System.out.println("半角の数値を再度入力してください"); 45 num = sc(); 46 } 47 return num; 48 } 49 50 51} 52
試したこと
sc();は単体では正常な入力を受け取るまでループすることを確認しました。
for文のみでは配列の作成を行うことができました。
スキャナをメソッド化してから動かなくなりました。
問題がどこにあるのかを突き止めるために、プログラムの細部を何度か書き換え、おそらくsc();が二度目の呼び出し以降使えないのではないか?という今の能力で解決できない疑問に当たりました。
エラー文でグーグル検索をかけましたが、プログラミング歴が1か月程度で有効な回答にたどり着くkとができませんでした。
気になってしょうがないので、ぜひお答えいただければと思います。
補足情報(FW/ツールのバージョンなど)
openJDK17 Eclipse
回答4件
あなたの回答
tips
プレビュー