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

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

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

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

Q&A

3回答

4114閲覧

String name = new java.util.Scanner(System.in).nextLine() を使用した際に注意が出力されてしまうなど。

aoyagi

総合スコア0

Java

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

0グッド

0クリップ

投稿2021/06/20 10:08

編集2021/06/20 12:51

イメージ説明

前提・実現したいこと

初心者です。参考書をもとにスキャナーを用いたソースコードで以下のような注意が出ます。これを解消したいです。
また6行目において、名前を漢字で入力した際、ターミナルで文字化けした状態で出力されるのを解消したいです。

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

エラーメッセージ
Resource leak: '<unassigned Closeable value>' is never closed

該当のソースコード

ソースコード

java

1public class Practice2{ 2 public static void main(String[] args){ 3 4 System.out.println("ようこそ占いの館へ"); 5 System.out.println("あなたの名前を入力してください"); 6 String name = new java.util.Scanner(System.in).nextLine(); 7 System.out.println("あなたの年齢を入力してください"); 8 String ageString = new java.util.Scanner(System.in).nextLine(); 9 int age = Integer.parseInt(ageString); 10 int fortune = new java.util.Random().nextInt(4); 11 fortune++; 12 System.out.println("占い結果がでました!"); 13 System.out.println(age+ "歳の" +name+ "さん、あなたの運気番号は" +fortune+ "です"); 14 System.out.println("1:大吉 2:中 3:吉 4:凶"); 15 } 16} 17

試したこと

初心者ながらたくさん調べましたが解決できませんでした。

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

VScode--
jdk-16.0.1_windows-x64_bin.exe

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

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

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

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

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

m.ts10806

2021/06/20 11:31

コードやエラーはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/questions/238564 また、タグはVisual Studio Codeかと思います。 Visual Studioとは別物です。
aoyagi

2021/06/20 12:53

ご指摘いただきありがとうございます。初めてなので、まだまだミスがあるかと思います。なにかありましたら宜しくお願いします。
K_3578

2021/06/29 06:08

気になったので指摘させてください。 >初心者ながらたくさん調べましたが解決できませんでした。 これは情報として何も意味を持ちません。初心者である事に関しては、質問編集画面の左上に ある初心者マークを付けるだけに留めてください。本文中では必要のない情報ですし、 初心者マーク付いていれば回答者はある程度配慮はしますので。 たくさん調べましたと言われても、どういうキーワードで調べて何というサイトのどういう記事を 見たのか他人には分からないので、調べたことは明確に書いた方がお互いの時間を無駄にせずに済みます。
aoyagi

2021/06/29 06:15

ご指摘ありがとうございます。 仕様やルールについて学び、わかりやすく簡潔に示せるよう努めていきます。
guest

回答3

0

文字化けの解消方法

原因は、javaファイルの文字エンコードがUTF-8であるのに対し、windowsでのjavaコンパイラのデフォルト文字エンコーディングがShift-Jis(MS932)であるからです。
コンパイル時に文字エンコードをオプションで指定できますので、以下の要領で設定を変更してください。

  • 設定を開く。ファイル→ユーザー設定→設定 もしくは Ctrl + ,
  • 検索ボックスに java.jdt.ls.vmargs と入力
  • 設定項目が1つ出てくるので、setting.json で編集をクリック
  • クリックするとsettings.jsonの編集画面になる。"default value"と表示された"-XX:..."で始まる領域をクリック
  • そうするとデフォルト値が記載されるので、その文字列の先頭に -Dfile.encoding=UTF-8 を追加

(次の-XXとは半角スペース1文字以上空けてください)

  • ウィンドウを閉じ、再度開く

これで、javaファイル上部の Run | Debugのボタンで実行する場合に限り文字化けが発生しなくなります。

投稿2021/06/21 16:03

hope_mucci

総合スコア4447

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

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

aoyagi

2021/06/23 03:43

コメントありがとうございます。 { "code-runner.executorMap": { "javascript": "node", "java": "cd $dir && javac $fileName && java $fileNameWithoutExt", "c": "cd $dir && gcc -fexec-charset=CP932 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "php": "php", "python": "python -u", "perl": "perl", "perl6": "perl6", "ruby": "ruby", "go": "go run", "lua": "lua", "groovy": "groovy", "powershell": "powershell -ExecutionPolicy ByPass -File", "bat": "cmd /c", "shellscript": "bash", "fsharp": "fsi", "csharp": "scriptcs", "vbscript": "cscript //Nologo", "typescript": "ts-node", "coffeescript": "coffee", "scala": "scala", "swift": "swift", "julia": "julia", "crystal": "crystal", "ocaml": "ocaml", "r": "Rscript", "applescript": "osascript", "clojure": "lein exec", "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt", "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt", "racket": "racket", "scheme": "csi -script", "ahk": "autohotkey", "autoit": "autoit3", "dart": "dart", "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt", "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt", "haskell": "runhaskell", "nim": "nim compile --verbosity:0 --hints:off --run", "lisp": "sbcl --script", "kit": "kitc --run", "v": "v run", "sass": "sass --style expanded", "scss": "scss --style expanded", "less": "cd $dir && lessc $fileName $fileNameWithoutExt.css", "FortranFreeForm": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "fortran-modern": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "fortran_fixed-form": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "fortran": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt" }, "code-runner.runInTerminal": true, "C_Cpp.updateChannel": "Insiders", "terminal.integrated.profiles.windows": { "Command Prompt": { "path": "C:\WINDOWS\System32\cmd.exe", "args": [] } }, "editor.suggestSelection": "first", "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue", "files.exclude": { "**/.classpath": true, "**/.project": true, "**/.settings": true, "**/.factorypath": true }, "java.home": "C:\Program Files\Java\jdk-16.0.1", "files.autoGuessEncoding": true, "java.jdt.ls.vmargs": "" } java.jdt.ls.vmargs と検索し、settings.jsonの編集画面に移動しましたが、 上記のように表示され、"defalut value"が表示されないです。どのように対応すればよろしいですか?
hope_mucci

2021/06/23 07:46

私のVSCode(1.56.2)では回答の方法で設定画面からsettings.json画面に遷移した場合は必ずdefault valueの選択が出てきます。バージョンの違いかもしません。 デフォルト値は設定画面の説明に書いてあります。おそらくどの環境でも一緒と思いますが私の環境ではこうなっています。 "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m" ご参考までに。
aoyagi

2021/06/28 02:53

説明欄からコピーしたら,default valueと出てきました。 "java.jdt.ls.vmargs": "-Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m" このような記述であっていますか?
hope_mucci

2021/06/28 07:15

実際にrunしてみて、正常にコンパイル、実行ができていれば問題ないと思います。まずは実行させてみて下さい。
aoyagi

2021/06/28 15:55

1.Run Code 2.Run java 3.Debug java の三種類があるのですが、 1だと、この文字は、エンコーディングwindows-31jにマップできません。とたくさん表示されます。 2,3だと、 ”あなたの名前を入力してください” 日本 ”あなたの年齢を入力してください” 50 ”占い結果がでました!” ”50歳の��さん、あなたの運気番号は2です” と、全角入力したものが文字化けしてしまいます。
hope_mucci

2021/06/28 16:10

とりあえず日本語文字列を含むコードのコンパイルは正常にできております。おめでとうございます。 コンソールからの日本語入力を解決するには途方もない労力がかかります。(これはVSCodeとPowerShellもしくはコマンドプロンプト側の潜在的な問題です)玄人にもお勧めできません。 日本語文字列の手入力はあきらめるか、諦めきれないならIDEをPleiades all in one Eclipseに乗り換えるのが良いかと思います。 もしくは書籍通りdokojavaを使ってください。最新版をお持ちであればQRコードから利用できます。
aoyagi

2021/06/29 06:01

ご丁寧に教えていただきありがとうございます。 ここまでにして先に進んでいきたいと思います。
guest

0

生成した Scanner は、使い終わったら close() する必要があります。

java

1Scanner sc = new Scanner(System.in); 2... 3sc.close();

投稿2021/06/20 11:31

yh1224

総合スコア653

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

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

aoyagi

2021/06/20 13:34

指摘通り修正したら警告が消えました!ありがとうございます! もし、質問内容通りに String name = new java.util.Scanner(System.in).nextLine(); と入力していた場合、どのように記述すればcloseすることができるのですか?
yh1224

2021/06/20 14:35

できません。
aoyagi

2021/06/20 15:37

ありがとうございます。
guest

0

例えば、こんなふうに。

Java

1import java.util.Scanner; 2 3... 4public static void main(String[] args) { 5 try(Scanner sc = new Scanner(System.in)) { 6 ... 7 String name = sc.nextLine(); 8 ... 9 String ageString = sc.nextLine(); 10 ... 11 } 12}
  1. 標準入力のScannerインスタンスは一度だけ作って使いまわす
  2. 明示的にcloseするか、try-with-resource文を使う

投稿2021/06/20 10:13

LouiS0616

総合スコア35668

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

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

aoyagi

2021/06/20 13:34

2種類のやり方で警告を消すことができました!ありがとうございます! もし、質問内容通りに String name = new java.util.Scanner(System.in).nextLine(); と入力していた場合、どのように記述すればcloseすることができるのですか?
LouiS0616

2021/06/20 13:47

生成したインスタンスが変数に保持されないので、できないと思います。
aoyagi

2021/06/20 15:38

なるほど。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問