Java - try-catch throwsを用いた例外処理について

# Javaの例外処理を独自の例外クラスを作成して行う方法
* なぜこの記事を書くことに至ったか
    * 大学の課題でtry-catchを用いた例外処理のプログラムを書かないといけなくなったため
    * 備忘録として残しておくため

# 本題

* 課題の内容は、Scannerインスタンスで入力された文字列が用意された配列（２つ）の中身と入力内容（２つ）が一 するかどうかというもの。

* そして、try-catchを用いて独自の例外クラスを用いた処理を行うために、入力内容が何もない状態(改行)の時に例外処理を行うプログラムを作れ、というものでした。
　

　まず先に例外処理クラスの作成を行います。

``` java:ExceptionCheck.java
public class ExceptionCheck extends Exception{
  // warningを回避するための宣言
  private static final long serialVersionUID = 1L;

  ExceptionCheck(String msg) {
    // 継承元のExceptionのmessage(String型)にオーバーライドする
    super(msg);
  }
}
```
> ここに継承元となるExceptionのapiリファレンスを貼っておきます
https://docs.oracle.com/javase/jp/8/docs/api/index.html?java/lang/Exception.html

　続いて、入力内容が配列と一致しているかを判定するcheckTrueメソッドを作成します。なおこのメソッドの返り値はboolean型となっています。

``` java:CheckTrue.java
public class CheckTrue {
  private String[] names = {"Taro","Hanako"};
  private String[] ids = { "abcd", "wxyz" };

  public boolean checkTrue(String inputName, String inputId) throws ExceptionCheck {
    int i = 0, j = 0;
    // ここでTrueを返す組み合わせはnameとidの配列の要素が等しいモノどうしが正しい組み合わせとなる
    
    // 入力内容が何もない(改行された)状態になっていないか
    if (inputName.equals("")) {
      throw new ExceptionCheck("Input Name");
    } else if (inputId.equals("")){
      throw new ExceptionCheck("Input id");
    }else{
      for(String name:names){
        if (name.equals(inputName)){
          break;
        }else{
          i++;
        }
      }
      for(String id:ids){
        if (id.equals(inputId)){
          break;
        }else{
          j++;
        }
      }
    }
    if (i==j){
      return true;
    }else{
      return false;
    }
  }
}
```

　最後にメインプログラムを示します。

``` java:Main.java
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    // インスタンスの作成
    Scanner sc = new Scanner(System.in);
    CheckTrue checkTrue = new CheckTrue();

    // 変数の宣言
    boolean result = false;
    String name;
    String id;

    // 入力の催促
    System.out.println("Input Name:");
    name = sc.nextLine();
    System.out.println("Input id:");
    id = sc.nextLine();

    // try-catch文
    try {
      result = checkTrue.checkTrue(name, id);
      if (result) {
        System.out.println("True");
      } else {
        System.out.println("False");
      }
    } catch (ExceptionCheck e) {
      System.out.println(e);
      System.exit(0);
    } finally {
      // インスタンスを閉じる
      sc.close();
    }
  }
}

```
　try-catch文の中では、CheckTrue.javaのcheckTrueメソッドに引数として渡した入力内容が、checkTrue内で処理・判定されてその結果がMain.java内のresultに格納されるような形となっています。

　ただ、もしcheckTrueメソッドの中で入力内容に何もない状態があれば例外処理としてcatchされエラー情報が出力されてプログラムが終了します。

　以下に実際にこのコードを動かしたものを例として示します。文字列や数字の横の<-はユーザーの入力を表すものとします

```
# 正しい場合:1
$ java Main
Input Name:
Taro <-
Input id:
abcd <-
True

# 正しい場合:2
$ java Main
Input Name:
Hanako <-
Input id:
wxyz <-
True

# Nameが何もない（改行された）場合
$ java Main
Input Name:
<-
Input id:
wxyz

ExceptionCheck: Input Name

# idが何もない（改行された）場合
$ java Main
Input Name:
Hanako
Input id:

ExceptionCheck: Input id
```

以上のような出力結果となる。

# ここまでを踏まえて
CheckTrue.javaの、

``` java
public boolean checkTrue(String inputName, String inputId) throws ExceptionCheck
```
のthrowsの解釈がはじめの方はまったく持って理解できなかったがここまでを踏まえて、自分なりの解釈をすると、「メソッドの中で起きためんどくさいことはあっち(ExceptionCheck)に投げやりにするよ！」というニュアンスに、

そしてcheckTrueメソッドの中の

``` java
throw new ExceptionCheck("Input Name");
```
については、「ExceptionCheckに処理を投げつけるよ！」という風な意味合いがあるのだということを自分なりではあるが理解した。

　あくまでも、**ここまでを踏まえて**からは**ぼく個人の感想**なのでこの解釈が絶対的に<span style="font-color :red;">正しいというわけではありません</span>...