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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

2回答

580閲覧

配列の添え字を変えずに再入力する方法がわかりません。

NIKONIKONIKONIK

総合スコア83

Java

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

0グッド

0クリップ

投稿2019/07/05 03:09

編集2019/07/05 05:53

配列の添え字を変えずに再入力する方法がわからない。

String型で入力された際に例外処理でint型で入力してくださいとエラーを出すのですが、その際に配列の添え字を変えずにそのまま再入力していく方法がわかりません。

下記の例のようにNums[2]を変えずに再入力をしたい
例: Index --> 2
Nums[2] --> a
Input Mismatch
Nums[2] --> b
Input Mismatch
Nums[2] --> c
Input Mismatch

before

1import java.util.InputMismatchException; 2import java.util.Scanner; 3public class Kadai1104 { 4 5 public static void main(String[] args) { 6 Scanner sc = new Scanner(System.in); 7 8 int[] nums = {-1,-1,-1,-1,-1}; 9 10 int index = 0; 11 do { 12 try { 13 System.out.print("Index --> "); 14 index = sc.nextInt(); 15 System.out.print("Nums[" + index + "] --> "); 16 nums[index] = sc.nextInt(); 17 }catch(ArrayIndexOutOfBoundsException e) { 18 System.out.println("Index Error!"); 19 System.out.println(); 20 }catch(InputMismatchException e){ 21 System.out.println("Input Mismatch"); 22 sc.next(); 23 System.out.println(); 24 } 25 }while(index != -1); 26 System.out.println(); 27 for(int i=0; i<nums.length; i++) { 28 System.out.println("Nums[" + i + "] : " + nums[i]); 29 } 30 } 31} 32```after 33

import java.util.InputMismatchException;
import java.util.Scanner;
public class Kadai1104 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] nums = {-1,-1,-1,-1,-1};
int index = 0;
do {
try {
System.out.print("Index --> ");
index = sc.nextInt();
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Index Error!");
System.out.println();
}
}while(index != -1);
do {
try {
System.out.print("Nums[" + index + "] --> ");
nums[index] = sc.nextInt();
}catch(InputMismatchException e){
System.out.println("Input Mismatch");
sc.next();
System.out.println();
}
}while(index != -1);

System.out.println(); for(int i=0; i<nums.length; i++) { System.out.println("Nums[" + i + "] : " + nums[i]); } }

}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

現在インデックスの入力と配列への入力をまとめてtryで囲っているため、例外が出ると最初からになります。
インデックスの入力と配列への入力を別にして、それぞれでループする必要があります。

投稿2019/07/05 03:14

編集2019/07/05 03:17
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NIKONIKONIKONIK

2019/07/05 03:29

ループの条件はどういう風になりますか?
swordone

2019/07/05 03:46

それはあなたが考えるべきことです。
NIKONIKONIKONIK

2019/07/05 05:25

3時間くらい考えたのですが、ループの条件がわかりません。
NIKONIKONIKONIK

2019/07/05 05:26

try文の中にif文を書いて、elseで例外処理に入ることは可能なのでしょうか?
javahack

2019/07/05 11:11

可能かどうかは、実際にコードを書いて試してみてはいかがでしょうか。 もしそれでエラーが出るようならその時のコードとエラーメッセージを質問に追記すれば回答が得られやすくなると思います。
guest

0

try はつかわず、 かわりに hasNextInt()をつかってかいてみました。
また、 main() で 入力やり直しの制御をするのではなく、整数入力のメソッドを定義して そのなかで入力やり直しをするようにしました。

java

1package teratail; 2 3import java.util.Scanner; 4 5public class Kadai1104 { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 int[] nums = { -1, -1, -1, -1, -1 }; 9 10 while (true) { 11 int index = input_index(sc, "Index --> ", nums.length - 1); 12 if (index == -1) { 13 break; 14 } 15 nums[index] = input_int(sc, "Nums[" + index + "] -->"); 16 } 17 18 System.out.println(); 19 for (int i = 0; i < nums.length; i++) { 20 System.out.println("Nums[" + i + "] : " + nums[i]); 21 } 22 } 23 24 static private int input_int(Scanner sc, String message) { 25 while (true) { 26 System.out.print(message); 27 if (sc.hasNextInt()) { 28 return sc.nextInt(); 29 } 30 System.out.println("Input Mismatch"); 31 sc.nextLine(); 32 } 33 } 34 35 static private int input_index(Scanner sc, String message, int max) { 36 while (true) { 37 int v = input_int(sc, message); 38 if (-1 <= v && v < max) { 39 return v; 40 } 41 System.out.println("Index Error! (index: [0.." + max + "], -1: end)"); 42 } 43 } 44}

追記:
try catch で書いてみました。

java

1 static private int input_int(Scanner sc, String message) { 2 while (true) { 3 System.out.print(message); 4 try { 5 return sc.nextInt(); 6 } catch (Exception ex) { 7 System.out.println("Input Mismatch"); 8 sc.nextLine(); 9 } 10 } 11 }

投稿2019/07/06 22:45

編集2019/07/07 07:23
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NIKONIKONIKONIK

2019/07/07 00:03

すごく有難いのですが、学校で出された課題で tryを使ってやる必要があります
katoy

2019/07/07 07:15 編集

input_int() の中身を hasNextInt() を使わずに trye .. catch で書いてみることに挑戦してみると良いとおもいます。
katoy

2019/07/07 07:49 編集

プログラムにはいろいろな書き方が可能です。 学校の課題でも、先生が想定している回答で満足せずに、違う書き方をかんがえたり、もっと適切な動作をするようにしたコードを考えて見るようにすると良いです。 私の回答のコード練習問題の答えとしては動作するというだけです。 実務コードとしてはツッコミどころが満載です。 (こんなコードを積み重ねていては 7pay の様なことになってしまう...)
LouiS0616

2019/07/07 07:40

@katoy さん Exceptionでキャッチする処理を例示するのはちょっとまずい気がします。 わざと改良の余地を残しているのでしたら、ごめんなさい。
katoy

2019/07/13 20:57 編集

> ..Exceptionでキャッチする処理を例示するのはちょっとまずい気がします。 ... はい、そのとうりです。 学校の課題の回答としても減点されるポイントです。 適切な Exception でcatch するように書き直したものを提出して欲しいとおもいますし、先生もそのことを説明して欲しいものです。
LouiS0616

2019/07/07 07:56

そうですね。お節介失礼しました。
katoy

2019/07/07 07:58

コードに対して不適切な箇所の議論をすることで、QA として価値は高まると思います。 そういった指摘(コメント)もなしに単にマイナス評価するのは、誰の得にもならないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問