Javaのエラー処理を行なっています
受付中
回答 4
投稿
- 評価 -1
- クリップ 1
- VIEW 111
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
0
最初から決め打ちでInteger型で入力しようとしないで、まず文字列として入力して、その内容が数値の文字列であれば数値変換して処理、そうでなければ、別の処理、とすればいいです
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
例外をこのような条件分岐に使用するのはいかがなものかと思うので、正規表現で判定するのはいかがでしょう。(try-catchで書くのが課題の指定ならしょうがないですが)
投稿
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);
}
}
-
回答の評価を上げる
以下のような回答は評価を上げましょう
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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);
投稿
score 2914
-
回答の評価を上げる
以下のような回答は評価を上げましょう
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
knHS_50
2020/07/02 21:13
y_waiwai
2020/07/02 22:12
momon-ga
2020/07/02 23:31
ん?すでに、そのようなソースになっているのでは?
String input = sc.nextLine();
int size = Integer.parseInt(input);