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

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

ただいまの
回答率

89.13%

Javaのエラー処理を行なっています

受付中

回答 4

投稿

  • 評価 -1
  • クリップ 1
  • VIEW 111

knHS_50

score 0

Java言語の初心者です。
現在、下記にあるソースコードはエラーが発生したときも処理をするプログラムです。

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

/*

  • 配列の生成
    */

// TODO: 【エラー処理】int型の整数値に変換可能な文字列が入力されるまで繰り返したい
System.out.print("生成する配列の大きさを入力してください > ");
String input = sc.nextLine();

// ここは例外処理しない(整数値に変換できる文字列しか来ないはず)

int size = Integer.parseInt(input);
int[] arr = createRandomIntArray(size);

// 生成された配列を画面表示
System.out.print("生成された配列: ");
for (int a : arr) {
System.out.print(a + " ");
}
(以下省略)

実際、このソースコードを実行します。
そうするとこうなります。

生成する配列の大きさを入力してください > 4
生成された配列: 490 725 113 239 

ここで、生成する配列の大きさを入力してくださいに文字を入力すると、

生成する配列の大きさを入力してください > aa
Exception in thread "main" java.lang.NumberFormatException: For input string: "aa"
at 
java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at jp.ac.ait.k19035.section09.Kadai1.main(Kadai1.java:27)

Process finished with exit code 1

このようにエラーが出ます。
これを、エラーではなく何か処理をしたいです。具体的には、

生成する配列の大きさを入力してください > aa
整数値として認識できませんでした。再度入力してください > 3
生成された配列: 587 389 703

このようにしたいです。
ソースコードのTODOの部分を直すのですが、よく分からないです。
分かる方がいれば教えていただきませんか?
try{
}catch{
}
}
構文を使います。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    質問の評価を下げる

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    上記に当てはまらず、質問内容が明確になっていない質問には「」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

0

最初から決め打ちでInteger型で入力しようとしないで、まず文字列として入力して、その内容が数値の文字列であれば数値変換して処理、そうでなければ、別の処理、とすればいいです

投稿

y_waiwai

ユーザーランキング月間2位

score 40354

    • 回答の評価を上げる

      以下のような回答は評価を上げましょう

      評価が高い回答ほどページの上位に表示されます。

    • 回答の評価を下げる

      下記のような回答は推奨されていません。

      評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

    • knHS_50

      knHS_50

      2020/07/02 21:13

      具体的にどのように書けばよいですか?

    • y_waiwai

      y_waiwai

      2020/07/02 22:12

      まずは文字列を1行入力するコードを書いてみてください

    • momon-ga

      momon-ga

      2020/07/02 23:31

      > まずは文字列を1行入力するコードを書いてみてください
      ん?すでに、そのようなソースになっているのでは?
      String input = sc.nextLine();
      int size = Integer.parseInt(input);

    0

    例外をこのような条件分岐に使用するのはいかがなものかと思うので、正規表現で判定するのはいかがでしょう。(try-catchで書くのが課題の指定ならしょうがないですが)

    投稿

    編集

    skawamura13

    score 19

    • 回答の評価を上げる

      以下のような回答は評価を上げましょう

      評価が高い回答ほどページの上位に表示されます。

    • 回答の評価を下げる

      下記のような回答は推奨されていません。

      評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

    0

    Scannerクラスのの hasNextIntメソッドを使えばよいのでは?

    import java.util.Scanner;
    
    class Test {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.print("生成する配列の大きさを入力してください > ");
            while (!sc.hasNextInt()) {
                sc.nextLine();
                System.out.print("整数値として認識できませんでした。再度入力してください > ");
            }
            int size = sc.nextInt();
            System.out.println("size = " + size);
        }
    }

    投稿

    編集

    kazuma-s

    score 2162

    • 回答の評価を上げる

      以下のような回答は評価を上げましょう

      評価が高い回答ほどページの上位に表示されます。

    • 回答の評価を下げる

      下記のような回答は推奨されていません。

      評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

    0

    skawamura13さんの

    例外をこのような条件分岐に使用するのはいかがなものかと思うので、正規表現で判定するのはいかがでしょう。

    に、無理やりtry-catch使った

    ダメな例です

    例外をこのような条件分岐に使ってはいけません。

    System.out.print("生成する配列の大きさを入力してください > ");
    String input = null;
    try {
        while (true) {
            input = sc.nextLine();
            if (input.matches("[0-9]+")) {
                throw new NumberFormatException();
            }
            System.out.println("整数値として認識できませんでした。再度入力してください > ");
        }
    } catch (NumberFormatException e) {
    }
    int size = Integer.parseInt(input);

    投稿

    momon-ga

    score 2914

    • 回答の評価を上げる

      以下のような回答は評価を上げましょう

      評価が高い回答ほどページの上位に表示されます。

    • 回答の評価を下げる

      下記のような回答は推奨されていません。

      評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

    • ただいまの回答率 89.13%
    • 質問をまとめることで、思考を整理して素早く解決
    • テンプレート機能で、簡単に質問をまとめられる