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

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

新規登録して質問してみよう
ただいま回答率
87.20%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

解決済

JavaでScannerをメソッド化してint配列を簡単に作成し、例外処理も行いたい。

Sango
Sango

総合スコア1

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

4回答

0評価

2クリップ

306閲覧

投稿2021/12/17 10:08

前提・実現したいこと

前提
スキャナーをメソッド化して各クラスで再利用したいです。
例外処理の練習をしたいです。

実現したいこと
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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

m.ts10806

2021/12/17 10:11

>再入力を促したい 「受け付ける値が入ってくるまでwhileでループ」ではダメなのでしょうか。
Sango

2021/12/17 10:15

こんにちは。 回答ありがとうございます。 私が書いている最中に思いついたものが上記のコードでした。 調べるとwhileでのループもあるようですね。 この問題が解決したらwhileでのループでも書いてみたいと思います。 ただ、現在の私のやり方だと何がいけないのかを特に知りたいです。 よろしくお願いいたします。
jimbe

2021/12/17 10:19 編集

> sc();は単体では正常な入力を受け取るまでループすることを確認しました。 いえ、これは再帰していますので、外見的には正常に見えますが、時限爆弾を抱えています。 sc の中で sc を呼ばないでください。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。