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

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

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

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

Q&A

解決済

2回答

1971閲覧

Javaの例外処理のtry-catchブロックについて

bookcat100

総合スコア19

Java

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

0グッド

0クリップ

投稿2019/02/18 12:07

先月からjavaを習い始めた初心者です。
つい先日、例外処理について勉強をしていたのですが、try-catchブロックについての文法を学び
自分で次のようなプログラムを作成をしたくなりました。

①文字列が格納された配列を作成し、中身を順番にString型からint型へ変換する
②もし配列の中身にint型に変換できない物が入っていた場合、場合は例外処理を使用し
0と表示させる

作ろうと決めたまではよかったのですが、最初にString型の配列を作り
中に"1","a","2","b","3","c"と格納してそれから完全に手が止まってしまいました。
自分が考えたプログラムを作成するにはあまりにも無知であることに今更ながらに気づきました。
しかし幸運にもjavaに詳しい方を紹介していただき、お手本を作成していただくことができました
そして完成したのが下のソースです。

java

1import java.util.Arrays; 2 3public class Practice_1 { 4 5 public static void main(String[] args) { 6 7 8 9 String[] a1 = {"1","a","2","b","3","c"}; 10 11 int[] ans1 = makeArray(a1); 12 13 System.out.println(Arrays.toString(ans1)); 14 } 15 16 static int[] makeArray(String[] a) { 17 int[] ans = new int[6]; 18 19 for(int i = 0; i < a.length; i++) { 20 try { 21 ans[i] = Integer.parseInt(a[i]); 22 }catch (NumberFormatException ae){ 23 } 24 } 25 return ans; 26 } 27}

確かに実行結果は自分が望んでいた通りになりました。
1,2,3はint型に変換され、a,b,cは0と表示されています。

しかしながら、初心者の私には全く理解できない文法ばかりで意味不明な箇所が多数あります。
正直な話、私が作成したのはString[] a1 = {"1","a","2","b","3","c"};の部分だけです。
そこから下は上級者の方に作成していただきました。本来ならば、その方に色々とお話を聞くのが一番
手っとり早いはずなのですが、諸事情により当分の間は会うことは叶いそうにありません。

情けない話ですが、どなたかこのプログラムについて「この箇所は〇〇だからこのようになる」など
詳しく解説をしていただけないでしょうか?

とりあえず最初のint[] ans1 = makeArray(a1);の時点で全く意味が理解できません。
これは配列を作成しているのだろうかと推測していましたが....
本当に情けない話ですが、回答をお待ちしております。

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

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

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

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

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

guest

回答2

0

ベストアンサー

超長くなってしまったので暇だったら読んでください。

Java

1import java.util.Arrays;//配列を文字列変換する Arrays.toString()を使うためのインポート 2 3public class Practice_1 { 4 5 public static void main(String[] args) { 6 7 8 9 String[] a1 = {"1","a","2","b","3","c"}; 10 11 int[] ans1 = makeArray(a1); //makeArrayメソッドに a1配列を渡して、結果をint型の配列 ans1に格納する 12 13 System.out.println(Arrays.toString(ans1)); //int型の配列なので、出力のためにString(文字列)に直す 14 } 15 16 static int[] makeArray(String[] a) { //String型の配列を受けとって、int型の配列を結果として戻すメソッドの作成 17 18    int[] ans = new int[6]; //ものが6個入るint型の配列を新しく作る 19 20 for(int i = 0; i < a.length; i++) { //このメソッドに渡したString型の配列(a1)の長さの分だけ繰り返す 21 try { 22 ans[i] = Integer.parseInt(a[i]); //String型の配列の[?]番目を取得して、Integerに変換する。 23 }catch (NumberFormatException ae){ //変換できなければこのcatch文に入るが、何も処理をいれてないので例外の握り潰し 24 } 25 } 26 return ans; //int型の配列をmainメソッドに結果として戻す 27 } 28}

既に解説してくださっている方がいますが、初心者目線で私も書いておきます。
二つを見比べながら理解を深めてもらえると幸いです。

まずはmainメソッドから

Java

1 public static void main(String[] args) { 2 3 4 5 String[] a1 = {"1","a","2","b","3","c"}; 6 7 int[] ans1 = makeArray(a1); 8 9 System.out.println(Arrays.toString(ans1)); 10 }

質問者さんが作ったString型の配列 a1 を後述する makeArray()という処理をするためのメソッドに渡しています。

メソッドについて

この「渡す物」のこと(今回だと a1)を「引数」といいます。

引数について

そして、 makeArray()メソッドで頑張って導きだした「結果」を、

int[] ans1 int型の配列 ans1 に格納します。

この結果のことを、「戻り値」といいますが、後述します。

戻り値について

ではSystem.out.println(Arrays.toString(ans1));はとりあえず、放っておいてメソッドの解説です。

makeArrayメソッドについて

Java

1 static int[] makeArray(String[] a) { 2 int[] ans = new int[6]; 3 4 for(int i = 0; i < a.length; i++) { 5 try { 6 ans[i] = Integer.parseInt(a[i]); 7 }catch (NumberFormatException ae){ 8 } 9 } 10 return ans; 11 }

ここで、先ほどの「引数」と、「戻り値」の知識が生きてきます。

まずはここに注目してください。

Java

1 static int[] makeArray(String[] a) {

static については今は割愛します。

2番目の int[] これが、「戻り値」を表します。
このメソッドで最終的に「結果」として何を出しているのかをここで決めています。

そして次に makeArrayの後ろに書かれている、 makeArray(String[] a)ですが、

これが、このメソッドに「何を渡してほしいのか、何を処理してほしいのか」を表す『引数』となります。

今回ですと、質問者さんがつくった

String[] a1 = {"1","a","2","b","3","c"}; これですね。

String型の配列を、このメソッドでは 「a」という名前で使いますと決めています。

では次に、 

Java

1 int[] ans = new int[6];

です。

ここで、最終結果の「戻り値」としてmainメソッドに戻す int型の配列を新しく生み出しています。
この配列は new int[6] といれているので、6つまで値を入れますよ、と決めています。

次に 一応for文についての解説です。

Java

1 for(int i = 0; i < a.length; i++) {

まず一番初めの **int i = 0; ** これは普通の変数宣言と一緒です。
このfor文の中で i を使います。初期値は0です。と決めています。

次に、 i < a.length; です。

これは、 i が a という配列の長さ未満のときは繰り返しますよ、ということです。

今回ですと、 aという配列は {"1","a","2","b","3","c"}; の 6個値が入っているので、6回for文が繰り返されます。

最後に i++ ですが、これは「インクリメント」といって、i の数を1増やします。ということです。

では最後にtry-catch文です。

Java

1 try { 2 ans[i] = Integer.parseInt(a[i]); 3 }catch (NumberFormatException ae){ 4 5 }

ここら辺は勉強したてだと思うので、わかるかと思います。
「引数」でもらった「配列a」を、数値に変換しています。

そして最終結果として mainメソッドに返す「戻り値」のint型の配列「ans」に数値を格納します。

この時変換できなければ、NumberFormatExceptionとなります。

そして最後は

Java

1 return ans;

ですね。

これが何度もでてきた 「戻り値」 になります。

**return 戻り値; **と記述します。

今回ですと、ans なので、 int型の配列 ans を return(このメソッドを呼んでいるところに返す)するよ~と決めています。

だいぶ長くなってしまいましたが、こんなところでしょうか。

・メソッド
・引数
・戻り値
・for文
・配列

このあたりをマスターできると、今回のこのコードの理解も深まると思います。

投稿2019/02/18 14:25

azuapricot

総合スコア2341

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

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

azuapricot

2019/02/18 14:29

不明点などあればコメントしてくだされば補足します。
bookcat100

2019/02/18 14:58

ここまで詳しく具体的に解説をしていただきありがとうございます。 まだまだ初心者なもので色々と勉強になりました。一番驚いたのがメソッドの引数に配列を使用できるということです。 正直なところ、メソッドの引数に配列を設定する必要性を今の自分では見出すのは難しいと思いますが これからも学習を続けていずれプログラムに組み込めるように頑張りたいと思います。 本当にありがとうございました。
bookcat100

2019/02/18 15:11

申し訳ありません。1つお聞きしてもよろしいでしょうか? メソッドを使用する際はインスタンス化をしなければならないと覚えていたのですが なぜmakeArrayメソッドはインスタンス化をせずとも普通に呼び出せているのでしょうか?
azuapricot

2019/02/19 00:11

それはですね~~~~~『割愛』した『static』に秘密があります。 普通のメソッドだと、 public int[] makeArray(String[] a) {} こんな感じで staticはついていませんよね。 (publicはどこのクラスからでも自由につかえますよ~ということを明示しています) ですが今回は、staticがくっついています。 https://nobuo-create.net/java-beginner-21/ https://www.sejuku.net/blog/20666 ↑staticについてです staticメソッドにする、ということは簡単にいってしまえば このメソッドはこのクラス専用ですよ~と言っているのと似ています。 そのクラスでしか使わないのでわざわざインスタンス化する必要がないのです。
azuapricot

2019/02/19 00:17

ちなみに、配列以外にも、List や Map という使いこなせると超便利なものがあって、 それももちろん引数で渡すことができます。 今はMainクラスで処理するだけなのでそんなの使わなくてもいいや~と思うかもしれませんが、 いずれデータベース(データを保持しておくもの)を使用したり、Web系と連携させたり、 複数クラスを使ったJava開発などを行うというときには、 この引数に複数(多いときには10個とか・・・)の配列ですとかListですとか文字列を指定したりします。 引数と、戻り値については今のうちに理解できるとこの後絶対役に立ちます。
bookcat100

2019/02/19 12:32

ありがとうございます。お陰様でいい勉強をさせていただきました。ご丁寧な解説本当にありがとうございました。
guest

0

勉強という意味では、質問欄のプログラムをいきなり理解するのは難しいので、Javaの入門書から読むことをお勧めします。

ただそれだと回答にならないので、ポイントだけ以下に回答いたします。

1.プログラムの構成について
・Javaは、main関数から処理が開始されます。
・main関数以外に、独自の関数を定義できます。
・質問欄に記載のプログラムには、main関数と、makeArray関数(独自の関数)の2つがあります。

2.関数について
・関数は、以下の形式で定義できます。(修飾子は難しいので今は無視してください)

修飾子 戻り値 関数名(引数) { 処理 }

・定義した関数は、関数名で呼び出すことができます。

int[] ans1 = makeArray(a1);

上記の箇所では、独自に定義したmakeArray関数を呼び出し、引数にStringの配列(a1)を渡し、戻り値として、int型の配列(int[])を受け取って、変数ans1に格納しています。

3.例外処理について
例外処理は、以下の形式で記載できます。

try { 例外が起こりうる処理 } catch (…) { 例外が発生した際に実行される処理 }

例えば、

try { String str = "a"; int num = Integer.parseInt(str); System.out.println("テストメッセージ"); } catch (...) { System.out.println("例外発生"); }

のようなプログラムがあった場合、parseIntの箇所で、文字列をint型に変換しようとして、例外が発生します。例外が発生した場合、そこでtry内の処理は中断され、catch内の処理に移動します。
したがって、上記の場合は、「System.out.println("テストメッセージ");」の行は実行されないまま、「System.out.println("例外発生");」が実行されます。

4.makeArray関数でやっていることについて
・上記3.を踏まえて、makeArray関数を解読すると、以下のようになります。

static int[] makeArray(String[] a) { int[] ans = new int[6];       // int型の配列を宣言 for(int i = 0; i < a.length; i++) { // 配列aのサイズ分ループ(6回) try { ans[i] = Integer.parseInt(a[i]); // 配列aの要素をint型に変換 }catch (NumberFormatException ae){ ans[i] = 0; // ←※理解し易いように、ここは追記しました。 } } return ans; // int型の配列ansを呼び出し元に返す。 }

上記※の箇所を追記しました。
parseIntで例外が発生した場合は、catch内に処理が遷移するため、例外が発生した場合(つまりint型に変換できない文字だった場合)、ans[i]に0を代入しています。

ただ、わざわざans[i]に0を代入しなくても、Javaではint型の初期値が0となるため、そもそも「int[] ans = new int[6];」の時点で、配列ansには、すべて0が代入されています。
したがって、catch内の処理は、無くても、0を代入するのと同じ結果になります。
質問欄に記載されたプログラムは、そのため0を代入する処理を省いています。

5.main関数でやっていることについて
・上記を踏まえ、main関数を順に見ていくと、

public static void main(String[] args) { String[] a1 = {"1","a","2","b","3","c"}; // 配列の準備 int[] ans1 = makeArray(a1); // 準備した配列をmakeArray関数に渡す。makeArray関数では、渡された配列を1つずつ見ていき、int型に変換できるものは、変換してans[i]に入れる。変換できないものは、例外が発生し、何もしない(つまり、ans[i]には、初期値の0が代入される)。出来上がった配列ansを、呼び出し元(main関数)に返し、ans1に代入される。 System.out.println(Arrays.toString(ans1)); // 結果を出力 }

長文になってしまいましたが、少しでも理解の助けになればと思います。

投稿2019/02/18 13:26

aikon_marimo

総合スコア1083

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

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

azuapricot

2019/02/18 13:44

関数 × メソッド 〇 かと・・・? javaScriptではないので
aikon_marimo

2019/02/18 13:50 編集

>azuapricotさん 確かにそうですね。補足助かります。
bookcat100

2019/02/18 14:52

回答していただき本当にありがとうございました。全て理解するにはまだ知識不足ですが 1つずつ噛み砕いて行くと意味がわかるようになりました。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問