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

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

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

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

Q&A

解決済

2回答

3573閲覧

java Scannerのcloseするタイミング

mochi1234

総合スコア16

Java

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

0グッド

0クリップ

投稿2022/06/03 04:41

package iroiro; import java.util.Scanner; public class Tecfulnisesatu { public static void main(String[] args) { int i; Scanner sc = new Scanner(System.in); int honmono = sc.nextInt(); int nisemono = sc.nextInt(); int honretu[] = new int[honmono]; int niseretu[] = new int[nisemono]; for(i = 0; i < honmono; i++) { honretu[i] = sc.nextInt(); } for(i=0;i<nisemono;i++) { niseretu[i] = sc.nextInt(); } sc.close(); } }

最後に「sc.close();」を入力しましたが、scが閉じられることがないと注意されてしまいます。for文の手前に置くと、閉じられるようです。
言葉足らずになっていると思いますが、ご教授お願い致します。

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

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

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

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

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

int32_t

2022/06/03 04:55

> scが閉じられることがないと注意 その「注意」をそのまま質問文にコピペしてください。 コンパイル時に注意されるということで合ってますか? コンパイルしているのは本当に質問文のままのコードですか?
mochi1234

2022/06/03 05:05

「リソース・リーク: 'sc' が閉じられることはありません」こちらになります。 「sc.close();」を入力した時点で、上記の文が表示されます。
int32_t

2022/06/03 05:12

「sc.close();」がない場合にその注意が出るのは理解できるのですが、足すと出るというのは妙ですね。
mochi1234

2022/06/03 05:14

申し訳ございません。言葉不足でした。 ない場合にも注意が出ていて、「sc.close();」を入力しても注意が出ている状態です。
int32_t

2022/06/03 05:18

ああ、なるほど。では maisumakun 氏の回答の通りですね。
guest

回答2

0

sc.nextInt()例外を投げた場合に、最後のsc.close()までたどり着きません。

try with resourcesで書くか、finallyで閉じるかの必要があります。

投稿2022/06/03 05:15

maisumakun

総合スコア146571

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

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

mochi1234

2022/06/03 05:21

maisumakunさん回答ありがとうございます。 「sc.nextInt()が例外を投げた場合」とはどういうときでしょうか?知識が浅いので理解できませんでした。申し訳ございません。 ご教授お願い致します。
maisumakun

2022/06/03 05:25

> 「sc.nextInt()が例外を投げた場合」とはどういうときでしょうか? ・InputMismatchException - 次のトークンがInteger正規表現に一致しないか範囲外である場合 ・NoSuchElementException - スキャンする入力がなくなった場合 ・(IllegalStateException - このスキャナがクローズしている場合) https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html#nextInt--
mochi1234

2022/06/03 05:35

知識がまだ浅かったです。ありがとうございました。
momon-ga

2022/06/03 05:38

一応、コメント残しておきます。 ランタイムの例外は、たぶんコンパイラは感知しないのじゃないかと思います。 実際に Scanner sc = new Scanner(System.in); int honmono = sc.nextInt(); System.out.println(honmono); sc.close(); の場合には、警告にならないのですよね。
guest

0

ベストアンサー

どこかに悪い教本でもあるのだろうか・・・
C言語の名残?

スコープの広い変数を作るのはやめた方がいいです。

java

1 int i; 2 for(i = 0; i < honmono; i++) { 3 honretu[i] = sc.nextInt(); 4 } 5 for(i=0;i<nisemono;i++) { 6 niseretu[i] = sc.nextInt(); 7 }

java

1// int i; 2 for(int i = 0; i < honmono; i++) { 3 honretu[i] = sc.nextInt(); 4 } 5 for(int i=0;i<nisemono;i++) { 6 niseretu[i] = sc.nextInt(); 7 }

にすればよいかと。

投稿2022/06/03 05:09

momon-ga

総合スコア4828

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

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

maisumakun

2022/06/03 05:16

質問の問題とは全く無関係かと思われます。
mochi1234

2022/06/03 05:19

momon-gaさん回答ありがとうございます。上記のコードに書き直したら警告が表示されなくなりました。 以前にC言語を勉強していました。 質問が2点あります。 1.なぜmomon-gaさんのコードだと「sc.close();」が実行されるのか 2.javaであれば、その都度変数を宣言すべきなのか ご教授お願い致します。
momon-ga

2022/06/03 05:20

> 質問の問題とは全く無関係かと思われます。 実際に警告が消えますけど・・・ 記述の問題で警告の有無が変わるなら、関係はありそうですが。
momon-ga

2022/06/03 05:23

> 「sc.close();」が実行されるのか これは、maisumakunさんの回答にありますが 実行されるか、どうかはわかりません。 例外が発生した場合は実行されないでしょう。 ただ、コンパイラが警告を出さなくなるのはご確認している通り事実です。 > javaであれば、その都度変数を宣言すべきなのか javaに限らず、無駄にスコープを広げないのが普通かと思います。
maisumakun

2022/06/03 05:23

> 実際に警告が消えますけど・・・ そうだったのですね、失礼しました(てっきり別な問題を指摘しただけの回答かと思いこんでいました)。
momon-ga

2022/06/03 05:27

いえいえ。お気になさらずに。
mochi1234

2022/06/03 05:38

最後に一つよろしいでしょうか。 momon-gaさんのコードであれば、例外の可能性が消えるから警告が消えるということですか?
momon-ga

2022/06/03 05:40

あ、例外の話はたぶん関係ないと思います。 Maisumakunさんのコメントにつけてますが・・・ Scanner sc = new Scanner(System.in); int honmono = sc.nextInt(); System.out.println(honmono); sc.close(); は、警告でないはずです。
mochi1234

2022/06/03 05:49

ありがとうございます。 https://teratail.com/questions/337590 先ほど送っていただいたURLのベストアンサーである文の、「変数iのスコープが広いのでループがあるとscan.close()にたどり着けない可能性があるとコンパイラが判断しているのではなかろうかと。」が理解できません。変数iのスコープが広いことで、「close」にたどり着けない可能性があるのはなぜですか? 何度も質問をして申し訳ございません。
momon-ga

2022/06/03 05:58

すみません。端的にいうと、わかりません。 ちなみに ”たどり着けない可能性がある” のでなく、”可能性があるとコンパイラが判断しているっぽい”です コンパイラが、そう判断してる”っぽい”だけで、なぜ?と言われると・・・・ 答えられないです。ごめんなさい。 ※インスタンスフィールドを参照してるとかだとマルチスレッドがぁ。。。とかなりそうですが。
mochi1234

2022/06/03 06:01

ありがとうございます。 多くの質問に回答して下さり、とても勉強になりました。 これからも調べながらコードを書くようにしていきます。
mochi1234

2022/06/03 06:59

int32_tさんありがとうございます。 すっきりしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問