結論:VScodeの拡張機能Error Lensが赤色メッセージ(=エラー)を吐いているときは実行しても動かないが、オレンジ色メッセージ(オレンジ)は非推奨なコードであって実行すると一応動く
以下、勝手に自分で混乱した流れ
前提 統合開発環境(IDE)は以下の記事に従い、VScodeで一本化して今はJavaの学習を主にしています。
Error Lens(VScode拡張機能)の概要
①コードを入力した時点で明らかなミス ⇒ 赤メッセージが該当箇所にでる
②アラート(※何を警告しているのかは場合によりけり)⇒ オレンジ色メッセージが該当箇所にでる
Error Lens が吐いてきた謎メッセージ(オレンジの部分)
もしかすると、解像度の関係で見にくいかもなので、書くと以下の通りです。
public class Main{
public static void main(String[] args){
//👇???メッセージ
String myName = new java.util.Scanner(System.in).nextLine();//:Resource leak; '<unassigned Closeable value>' is never closed
System.out.println("myNameに入力した値は:" + myName);
}
}
なんやねん。コレ(´。`)・・とりあえずGPT3.5先生に聞くか・・・
ChatGPTの回答
このアラートメッセージの 「**Resource leak; \ is never closed**」 というのは、このメッセージは、JavaのScannerがリソースリーク(Resource Leak)の可能性があることを示しています。この場合、Scannerはクローズされない可能性があり、リソースが正しく解放されないことを示しています。 ScannerはCloseableインターフェースを実装しており、このインターフェースを実装するクラスはcloseメソッドを呼ぶことが期待されています。Scannerが使用された後は、リソースリークを避けるためにcloseメソッドを呼ぶべきです。
αβοοη..._φ(゚ω゚ )アヒャ 「リソースリーク??日本語??」
GPT3.5先生に提示されたコードを元に少し修正したら、なんか謎メッセージがなくなったリファクタリング例(Scannerを使用した後にクローズするとかいう例)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {//try-with-resources文を使用してScannerを作成ブロックが終了するときに自動的にクローズする
// Scannerを使用するコード
String myName = scanner.nextLine();
System.out.println("myName");
// 他の処理
} finally {//finallyブロックでもScannerを明示的にクローズできる
// Scannerをクローズする
scanner.close();
}
}
}
まあ入力してみるか(´д`)、ということで、やってみたらなんか動いたけど・・日本語引数にしたときのターミナルの結果がなんか変。これは何???
芋づるで出てきた謎をX(旧Twitter)で投げてみたら、とある人が教えてくれたサイト
⇒標準入力(System.in)の文字コード(charsetName)に"Shift-JIS"を以下のように指定
再リファクタリング例
import java.util.Scanner;
public class ScannerUsage{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in, "Shift-JIS");
try {//try-with-resources文を使用してScannerを作成ブロックが終了するときに自動的にクローズする
// Scannerを使用するコード
System.out.print("あなたの名前を入力してください:");
String yourName = scanner.nextLine();
System.out.println("私の名前は" + yourName + "です。");
System.out.print("あなたの年齢を入力してください:");
int yourAge = scanner.nextInt();
System.out.println("私の年齢は" + yourAge + "歳です。");
// 他の処理
} finally {//finallyブロックでもScannerを明示的にクローズできる
// Scannerをクローズする
scanner.close();
}
}
}
結果、無事以下のようになりました(:の次のところはPythonにおけるinputによる入力欄と同じ)
run.Java(右上▷)を押すと、それぞれ、:のところで一旦ターミナルが止まり、入力してEnterすると、次のSystem.out.printlnで出力される。
そもそもオレンジ色メッセージ(=アラート)のときは動くんかーーいΣ(-ω-;)はぅ!
実は後でGPTに投げる前(オレンジ色メッセージがでている状態)でも実行すると動きました・・・
が、どうやらこれは
非推奨(今回の場合、これが多く含まれていると動作が遅くなる)
のようです。(だから、できれば例えば後者の方がよい)Error Lensはパフォーマンスの悪さも指摘くれるようです。
なぜ非推奨かは参考資料に主な参考資料
①確かな力が身につくPython「超」入門 鎌田 正浩 著 SB Creative社②スッキリわかる Java入門 第3版 中山清喬、国本大悟 共著 株式会社フレアリンク 監修
③Progate https://prog-8.com/
④せかチャン 世界一わかりやすい情報化チャンネル
https://www.youtube.com/@SekaChan
⑤ウルシステムズ株式会社 やってはいけないJavaプログラミング リソースの部分
https://www.ulsystems.co.jp/archives/039.html
⑥GPT3.5先生によるリソースに関する回答の要約
プログラムがリソースを利用する場合、それらのリソースは適切に確保され、使用が終わったら解放される必要があります。これを怠ると、プログラムやシステム全体が正しく動作せず、メモリリークやファイルハンドルのリークなどが発生し、最終的にはパフォーマンスの低下や不安定な動作を引き起こす可能性があります。
プログラミングにおいて、リソース管理は重要な側面の一つであり、開発者はリソースを効果的に管理してプログラムを安定かつ効率的に実行する必要があります。Javaの場合、CloseableやAutoCloseableなどのインターフェースを使用して、リソースを確実に解放することが奨励されています。
Pythonで言うならば、開いたファイルを閉じるような感覚です。これによって、プログラムが正しく終了したときにリソースが正しく解放され、システムが効率的に動作します。
⑦同じ事を考えていた人がいた件
https://shino-life-blog.com/java-unassigned-closeable-value/