【Java初心者】リソース・リーク<~~>が閉じられることはありません


はじめに

学習開始してから1ヶ月程度の初学者です。
自分の知っている知識内で書いてますので、
誤っている内容が含まれている可能性があります。

目次

1.できたもの
2.作成中に考えたこと
3.作成中に起きた問題点と解決策
4.課題、改良点
5.コメント、教えていただきたいこと
6.おわりに

今回の問題


北ソフト工房より

できたもの

switch文を使えばできそうと考えで約40分程度で完成しました。

//北ソフト工房 Java練習問題
import java.util.Scanner;

public class Example {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int week; //曜日
    int time; //時間帯
    int result = 2; //0:休診 1:開いてる 2:エラー switchで更新します
    String[] weeks = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日"};
    String[] times = {"午前", "午後", "夜間"};
    String[] results = {"休診日です", "開いています","エラー:無効な入力です"};

    System.out.println("希望の曜日と時間帯に対応する数字で入力してください");


        do {
            System.out.println("曜日:0=日曜日 1=月曜日 2=火曜日 3= 水曜日4=木曜日 5=金曜日 6=土曜日 ");
            System.out.print("曜日:");
            week = sc.nextInt();
            if(week > 6) {
                System.out.println("エラー:無効な入力です   ");
                System.out.println("=====================");
            }
        } while(week > 6);

        do {
            System.out.println("時間:0=午前 1=午後 2=夜間");
            System.out.print("時間帯:");
            time = sc.nextInt();
            if(time > 2) {
                System.out.println("エラー:無効な入力です   ");
                System.out.println("=====================");
            }
        } while(time > 2);

        sc.close();

        switch(week) {
        case 0:
            result = 1; //全部休診
            break;
        case 1:
        case 4:
            result = 0; //全部開いてる
            break;
        case 2:
        case 5:
            if(time == 0) { //午前なら休診
                result = 0;
                break;
            } else {
                result = 1;
                break;
            }
        case 3:
            if(time == 2) { //夜間なら休診
                result = 0;
                break;
            } else {
                result = 1;
                break;
            }
        case 6:
            if(time == 0) { //午前なら開いてる
                result = 1;
                break;
            } else {
                result = 0;
                break;
            }

        }

        System.out.println(weeks[week] + "の" + times[time] + "は、病院は" + results[result]);

    }

}

作成中に考えたこと

とりあえず書き出したかったのでメソッドでまとめたりするのはやめました。
曜日と時間帯を入力させて、違う値を入力したら入力をやり直しさせる。
→どうすればやり直しになるか?
 →do while文で繰り返しをさせる

switch文使うと書く量が多くて面倒くさい
→曜日と時間帯を論理積で判断できないか?
 →やり方思いつかずに断念

作成中に起きた問題点と解決方法

・ローカル変数resultが初期化されていない可能性があります
最初はresultフィールドの値は初期化していませんでした。

int result; //訂正前

だって後で更新するから今決めなくてもいいでしょとい考えです。
あとでちゃんと初期化しているのになんでエラー出るんだ……と調べると
「Javaのコンパイラは制御文(ifやswitch、forなど)を含めた構文解析をある程度行ってコンパイルエラーの判定をしています。このプログラムでは、resultを初期化する処理が、switch文の条件式に該当されない場合実行されないため、「初期化されていない可能性がある」というコンパイルエラーと判定しているのです。」
それなら最初からフィールドを初期化しておけば大丈夫なんじゃない?
 →ついでにフィールドの値が更新されなかったらエラーを表示するようにするように。

リソース・リークが閉じられることはありません
今回の一番の分からないポイント。
調べた結果Scannerクラスのインスタンスをクローズすればいいとのこと。
Progateの学習の中でScannerは覚えたがそんな処理今まで一度もしたことなかったですし、
なによりコンパイルエラーにはならないから余計にわからなかったです
とりあえずsc.colse();と書けばOKだったようです。
メモリの問題で使い終わったら閉じろというおおまかな解釈でよいのでしょうか??
「閉じられることはありません」という日本語に違和感がありますね。
「閉じられていません」の間違いなんでしょうか?

課題、改良点

なんかもっとまとめられる気がします。
boolean型使うはずだったのに気づいたらこうなってしまった。
weekのフィールドに整数入力しても正しくなければやり直し処理させるようにしたけど
→マイナスとか文字打ち込まれた時の対応がわからないので断念。

コメント、教えていただきたいこと

・うまくまとめる着眼点
今投稿中に気づいたのが時間帯×休診日かどうかで6パターンにできたので
もっと綺麗に収められたはずなので……
自分ならこうするという考え方があれば教えていただきたいです。

・//コメントの使い方
とにかく他人にソースコードを見せる機会がなかったのでコメントの上手い使い方がわからないです。
他に何を伝えればいいんですか?コメント入れすぎても見にくいだけですか?

・リソース・リークとは?
調べてみましたがあまりうまい理解ができていない気がします。
どのようなキーワードで検索すればよいでしょうか。

おわりに

本当に学習を始めたばかりなので基本的な分野しか分かりません。