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

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

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

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

Q&A

解決済

1回答

2406閲覧

String name=new java.util.Scanner(System.in).nextLine(); でのエラー

inondo_m

総合スコア1

Java

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

0グッド

0クリップ

投稿2021/05/12 21:20

編集2021/05/12 22:20

前提・実現したいこと

以下のソースコードを実行したいです。

発生している問題・エラーメッセージ

Resource leak: '<unassigned Closeable value>' is never closed Java(536871799) といったメッセージが出ます。

該当のソースコード

java

1 public static void main(String[] args){ 2 3 System.out.println("あなたの名前を入力してください。"); 4 String name=new java.util.Scanner(System.in).nextLine(); 5 6 System.out.println("あなたに年齢を入力してください。"); 7 int age=new java.util.Scanner(System.in).nextInt(); 8 9 System.out.println("こんにちは、"+age+"歳の"+name+"さん"); 10}

試したこと

追記:
名前を出していいものかと思いましたが、解決したいので出させていただきます。
『スッキリわかるJava入門』です。

表示したい言葉の内容は一応変えていますが、ソースコードはこのまま載っていました。

補足情報(FW/ツールのバージョンなど)

独学で学習を始めたばかりです。基礎的なこともわかってないとおもわれます。
visual studio code を使用しています。

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

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

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

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

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

m.ts10806

2021/05/12 21:39

>とある本ではこのように書いてあり とある本とは?「このように」とは?
inondo_m

2021/05/12 21:49

名前を出していいものかと思いましたが、解決したいので出させていただきます。 『スッキリわかるJava入門』です。 「このように」とは上記のソースコードのことです。表示したい言葉の内容は一応変えていますが、ソースコードはこのまま載っていました。
m.ts10806

2021/05/12 22:23

既に回答してますが、本じゃスペースまで分からないですからね。 (書籍内で何も言及ないとは思えないが) それに書籍は「出典」として必須です。 本当にその通りでしたら間違った情報を載せてお金をとってるわけですから 問い合わせや修正依頼をかけないといけません。
guest

回答1

0

ベストアンサー

unassigned Closeable value

割り当てられていないクローズ可能な値

これはそのまま検索ワードとして投入すれば出てきますが、
Scannerは利用後にクローズされることが推奨されているための警告です。
teratail:scannerの利用
java リソース・リーク'<unassigned Closeable value>'が閉じられることはありません。

「開けたら閉める」を心がけてください。
ドキュメントも参考に。

※以下、質問のコードが編集される前の回答

全角スペースが問題では。
イメージ説明

paiza.ioでの実行結果

Main.java:6: error: illegal character: '\u3000'
System.out.println("あなたの名前を入力してください。");

投稿2021/05/12 21:41

編集2021/05/12 22:34
m.ts10806

総合スコア80875

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

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

inondo_m

2021/05/12 22:24

こちらに写すときに間違えたようで、エディタのほうでは全角にはなっていなかったです。 少し調べた中で、new を複数回使ってはならないのかなと思ったのですがそれは見当違いでしょうか?
m.ts10806

2021/05/12 22:28

コードは自身が書いたものをコピペを。 回答者には提示されたコードが全てです。間違えたかどうか判断できる材料はありません。 >new を複数回使ってはならない 全くそんなことはありません。 同スコープ内で同名変数の定義はダメですが、 違う名称の変数であればそれは別の箱に情報を入れることになります。 まぁしいてならエラーの通り、 unassigned Closeable value でしょうね。 DBコネクションもそうですが、「開けたら閉める」です。 https://ja.stackoverflow.com/questions/41408/java-%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9-%E3%83%AA%E3%83%BC%E3%82%AFunassigned-closeable-value%E3%81%8C%E9%96%89%E3%81%98%E3%82%89%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93
inondo_m

2021/05/12 22:55

開けたら閉めるというのはなんとなくわかったのですが、具体的にどのようにしたらいいかわからないので教えていただきたいです。 また、リンク先で出てくる Scanner sc = new Scanner(System.in); int i = sc.nextInt(); これは String s =new java.util.Scanner(System.in).nextLine(); int input =new java.util.Scanner(System.in).nextInt(); これらと同じようなものなのでしょうか?
m.ts10806

2021/05/12 23:36

ドキュメントも確認してください。 機能説明もあります。 ただ、本件、エラーではなく警告なのでビルドはできるはずで、実行できないはずはないのですけど。 実行して見てないですか?VSCodeは使わないのでツールの仕様までは把握してないですけど
m.ts10806

2021/05/12 23:41

ただ、書籍が本当にcloseに対して一切言及がないならお金取ってる情報としてはNGですね。名前詐欺もいいところ。 ネットのそのへんの記事か、提示したようにOracleのJavaDocなど無償で得られる情報のほうが質が高い。
inondo_m

2021/05/12 23:52

始めたばかり過ぎてわからない言葉が多いのでゆっくり調べながらいただいたリンク先を読んでみます。書籍に関してはvscordのことは言及してないので、もしかするとツールの仕様なのかもしれないです。様々な指摘、リンクの共有などありがとうございました。
dodox86

2021/05/12 23:57 編集

書籍中の該当部分の前後の説明が分からないので何ともですが、System.inは標準入力なのでプロセスが終了すれば自動的に閉じられます。(実際は他のハンドル関連もプロセスが終了すれば強制的に閉じられますが) それを見越してのコードなのかもしれませんね。ただ、それにしても > String name=new java.util.Scanner(System.in).nextLine(); というようなコードは一般的にはほとんど書かないと思うし、同じSystem.in を使うのにScannerを2回生成(new)するのも謎(無用)です。何か、意図的なものがあったのかもしれません。
m.ts10806

2021/05/13 00:07

書籍で確認してほしいのはVSCodeについてではなくcloseについての言及です。 ビルドして実行は結局どんなツールでも裏では同じコマンドが実行されてるので、例えば「警告があったら実行しない、中断 」とかツールの設定があるのではないでしょうか。 ビルドできるので実行はできるはずです。
inondo_m

2021/05/13 00:36

>dodox86さん なるほど、これは一般的ではなかったんですね。調べてもなかなか出てこなかったのはそういうことだったんですね。scannerについて改めて調べてみます。
inondo_m

2021/05/13 00:40

>m.ts10806さん closeについて索引してみたところかなり後ろのほうにありました。もっと早く索引していればよかったです。お手数かけてすいません。 警告を無視して実行してみたところ一応できました。ただ、警告が出ているときになりますし、一般的な書き方ではないそうなのでリンク先のほうでしっかり勉強したいと思います。
m.ts10806

2021/05/13 00:45

索引ではなく当該コード説明の前後の項を。
dodox86

2021/05/13 00:47 編集

@質問者inondo_mさん 一般的に(少なくとも私だったら)例えば以下のように書くと思います。 java.util.Scanner scanner = new java.util.Scanner(System.in); String name = scanner.nextLine(); int age = scanner.nextInt(); // で、適時close() scanner.close(); Scannerのクローズに関しては、teratailでも過去、何度か質問回答があるようです。 teratailトップより、「Scanner close」で検索してみるとよいです。 。。。と思ってteratail過去回答を検索してみたら、同じ問題を取り挙げているものがありました。 [closeをどう書けばいいかわからないです。] https://teratail.com/questions/264335
m.ts10806

2021/05/13 00:48

こういう説明してる人いましたね。 「ドアと同じ。開けたら閉めましょう」 つまり「今開けている」という認識が持てるかどうかです。
inondo_m

2021/05/13 03:42

@m.ts10806さん 当該コードの前後にそのような説明はなかったです。。。 「開けたら閉める」しっかりと意識するようにします。
inondo_m

2021/05/13 03:44

@dodox86さん 具体的にありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問