やっとまとまったthrowsについて今回は見ていく。
例外を確かめるとき、メソッドが複数あったら一つ一つtry-catchのコードを書くのは面倒。
try-catchを使った例外については以下参照。
【Javaプログラミング】Exception 例外処理とは?try…catchの使い方についても-プロショvol.66
そんな時に使えるのが「throws」。
throwとは別物だから間違いに注意が必要。
throwについては以下参照。
【Javaプログラミング】throwを使用した例外処理とは?使い方についても-プロショvol.67
throwsはどう使う?
throwとthrowsは似ているけれど、使い道はまったく違う。
throwはプログラマが例外を発生させて、例外をはっきりと表示させるもの。

対応した例外を投げかけ、例外発生時に表示させたいメッセージをプログラマーが設定できる。
それに対して、throwsは例外を宣言するために使用する。
throwsを付けたメソッドの中で使用したい例外型を定義するもの。
また、throwsはメソッドシグニチャと呼ばれるものに使用される。
メソッド名(変数の型 変数)
例1. public void sample(int A){・・・}
例2. int sample(int B){return ・・・}

メソッド名、()内の変数の型、変数を合わせて「メソッドシグニチャ」と呼ばれている。
「throws」は一度に複数の例外を宣言することができるという点もthrowと異なる。
throwsの構文
throwsを利用した構文は以下の通り。
例外はすでにJavaパッケージ内に用意されているものがある。
詳しくは以下の記事参照。
【Javaプログラミング】APIとは?使い方についても-プロショvol.64
従って、throwsを使用する際には「import java.io.*;」を記入しないといけないものがある。
「import java.io.*;」を記入する必要があるものについては下記リンクを参考。
「Exceptions」の部分を参照。
https://docs.oracle.com/javase/8/docs/api/java/io/package-frame.html

java.ioパッケージの中には「例外」も入っている。
throwsを使用して宣言された例外は、例外を処理する場所で呼び出されなければならない。
例外を処理する場所というのがtry-catch。
そうしないと実行できない。
throwsを使用したコード
実際にthrowsを使ったプログラムが以下。
int Waru(int a,int b)throws ArithmeticException{
int c =a/b;
return c;
}
public static void main(String[] args) {
onlyThrows ABC = new onlyThrows();try {
ABC.Waru(45, 0);
}
catch(ArithmeticException x){
System.out.println(“数字は0で割れませーん”);
}
}
}
割り算を使って見るととても分かりやすい。
実行結果は以下の通り。
コードの中身
onlyThrowsクラスの中にWaruという名前のメソッドを作成し、()内には引数を入力した。
引数については以下参照。
引数を用いてメソッドを使ってみる by Javaプログラミング初心者vol.43
Waruメソッドにthrowsを付けて「ArithmeticException」という例外を定義した(int Waru(int a,int b)throws ArithmeticException{})。
この「ArithmeticException」は前回の記事でも使用したが、計算において例外が起こったときに{}内のプログラムが表示されるというもので例外の一つ。
a÷bを計算したものをcとして、cをWaruメソッド内の()に返すというもの(int c =a/b; return c;)。

次にメインメソッド内。
まずはonlyThrowsクラスのオブジェクトを作成。
オブジェクトを作成する方法については以下参照。
自作したクラスに状態を表すデータを作る-オブジェクトの作成方法 by Javaプログラミング初心者 Vol.37
tryの中には処理するコードを書く(ABC.Waru(45, 0);)。
このWaru(45,0)はWaru(int a,int b)に対応している。
catchの中にはtryで例外が発生したときのコードを書く(System.out.println(“数字は0で割れませーん”);)。
数字は0で割ることができない。

ということは例外発生。
「数字は0で割れませーん」が表示される。
throwsとthrowを使用したコード
実際にthrowsとthrowを使ったプログラムが以下。
import java.io.*;
public class throwsUse {
void sample()throws IOException{
throw new IOException(“例外発生ー”);
}
public static void main(String[] args) {
try {
throwsUse abc = new throwsUse();
abc.sample();
System.out.println(“例外発生無し”);
}
catch(IOException e) {
System.out.println(e.getMessage());
}
}
}
以上を実行すると以下の結果が得られる。
コードの中身
今回は入出力に関する例外のIOExceptionを利用したい。
IOExceptionは元々Javaに用意されている「java.io」パッケージに入っているからクラスファイルに導入する(import java.io.*;)。
throwUseというクラスファイルを作成(public class throwsUse {})。
その中に「sample」という名前のメソッドを作成し、throwsを使って「IOException」という例外を定義(void sample()throws IOException{})。

IOExceptionは入出力について何らかのエラーが発生したときに知らせてくれるもの。
()内にはエラーが発生したときに表示して欲しいメッセージを書くといい。
throwsがついたメソッドの中には、例外を発生させるコードを記入(throw new IOException())。
()内には表示させたい文字を記入(“例外発生ー”)。
この時気を付ける点は、throwsの中にthrowを書くときは同じ例外の型を使うということ。
メインメソッドの中には、throwsの例外を処理する場所を作る必要がある。
⇒try-catchのこと
tryの中には、もし例外が発生しない場合のプログラム処理内容を記入(throwsUse abc = new throwsUse();abc.sample();System.out.println(“例外発生無し”);)。

throwsをthrowsUseクラス内で使用したから、throwsを付けたメソッド(今回はsampleメソッド)をここで呼び出す必要がある。
まずオブジェクトを作ってメソッド名を指定する。
オブジェクトの作り方については以下参照。
自作したクラスに状態を表すデータを作る-オブジェクトの作成方法 by Javaプログラミング初心者 Vol.37
catchの中には、例外が発生した場合のプログラム処理内容を記入(catch(IOException e) {System.out.println(e.getMessage());)。
catch(IOException e)の「e」はIOExceptionの変数。
getMessage()は、メッセージを読み取るメソッドで、Javaにもとから用意されているもの。
「e.getMessage()」と書くことで、throwsを使用したメソッドにあるIOExceptionの中の()に書いた内容を取得することができる。
複数の例外を一度に定義することも可能
throwsは複数の例外を一度に定義することも可能。
その場合、例外をコンマで区切ればよい。
こんな感じで複数の例外を一度に投入することができる。
例外を書く際は、そのコード内で発生しうる例外に対応するものを書くこと。
「Exception」と書くとすべての例外を包括できる。
だが、それぞれ対応した例外を書くことが望ましいとされる。

何のエラーかわかんなくなる可能性・・・
最後に
全く理解できなかったthrowsについてほんの少しは理解できた感じがする。
まだまだ例外についての知識が足りないけれど、ジーっとコードを見つめていると不意に「あっそういうことか」ってなる時が一番楽しいと思う今日この頃。
コメント