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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

2回答

676閲覧

Java:try文でオブジェクトを作ろうとしたのですが...

ganmodoki_

総合スコア6

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

0クリップ

投稿2021/07/12 01:27

前提・実現したいこと

前提として自分はjava初心者なので、おかしな所があったとしても、
温かい目で見ていただけると幸いです。

本題です。CSVファイルの中身のデータを読み込むプログラムを作ろうとしたのですが、try文の中で、
BufferedReader br = new BufferedReader(new FileReader(file));
このオブジェクトを作成しようとしたらエラーが出てしましました。
エラーを見る限りだと、
br.readLine();
のbrオブジェクトが無いと言われてるような気がするのですが、
なぜbrオブジェクトが作られないのか、さっぱりわかりません。
try文の中で作るだけでは足りないのでしょうか?
※yyy.scvはjavaファイルと同じディレクトリに配置してあります。

なぜこのエラーが出るのか、どなたか教えていただけないでしょうか。

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

xxx.java:23: error: cannot find symbol br.readLine(); ^ symbol: variable br location: class xxx 1 error

該当のソースコード

java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.File; 4import java.io.FileNotFoundException; 5 6class xxx 7{ 8 public static void main(String[] args) 9 { 10 File file = new File("./yyy.csv"); 11 try 12 { 13 BufferedReader br = new BufferedReader(new FileReader(file)); 14 } 15 catch(FileNotFoundException a) 16 { 17 System.out.println("ファイルが開けませんでした"); 18 } 19 if(file.exists()) 20 { 21 System.out.println("hit file"); 22 br.readLine(); 23 24 } 25 else 26 { 27 System.out.println("not file"); 28 } 29 } 30}

試したこと

いろいろ対策法は考えたのですが、どれもだめでした。
try文の中で処理を全部書くしかないのでしょうか?
それだと、コードが見にくいためできるだけやりたくはないのですが...
お手上げ状態です。お助けください。

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

javaバージョン
openjdk version "11.0.11" 2021-04-20

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

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

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

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

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

K_3578

2021/07/12 01:35

インデントをしっかりしてみればわかるんじゃないですか?
neconekocat

2021/07/12 01:37

原因はtryの中で宣言した変数を外で呼べるわけ無いじゃんって話ではあるんですが、 > コードが見にくいためできるだけやりたくはないのですが ここの意味が分かりません。try-catchが何のために存在しているか理解されていますか?
ganmodoki_

2021/07/12 01:41

ご回答ありがとうございます。 オブジェクトの作成だけをtry文の中に入れたほうが見やすいと思ったのですが それはできないということですね。
guest

回答2

0

ベストアンサー

try-catchで括った場合、tryの中で宣言した変数のスコープはtryの中に限定されます。
tryの外で参照しようとすると"cannot find symbol"でエラーになります。

try文の中で処理を全部書くしかないのでしょうか?

BufferedReaderのcloseを考えるとtry-with-resourcesを使用すべきでしょう。

https://qiita.com/NagaokaKenichi/items/124f0e14ce5dfcbd0b6b

投稿2021/07/12 01:37

編集2021/07/12 01:56
Luice

総合スコア771

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

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

ganmodoki_

2021/07/12 01:52

ご回答ありがとうございます。 他の方の回答も読ませていただいた結果、try文の中にすべて入れるしか解決方法は無いのですね。 超初心者的なことに回答していただいてありがとうございます。
neconekocat

2021/07/12 01:52

細かいことですがtry-with-です。
Luice

2021/07/12 01:57

失礼しました。修正しておきます。
guest

0

変数のスコープの問題かと。
BufferedReader brはtryのブロックの中で宣言されているため、その中でしか活きません。
外で宣言するか、そもそもファイルが開けなければexists()もfalseになるので、全部tryの中に入れてしまってはどうでしょうか。

try文の中で処理を全部書くしかないのでしょうか?

それだと、コードが見にくいためできるだけやりたくはないのですが...

見にくくはないかと。
catchでどうするか次第ですが、
やはりtryの中に対象とする処理(今回はファイル操作)
がないのはロジックとしてもおかしくなるので、
個人的な見にくい見やすいという感覚ではなく
「処理のまとまり」として考えられては?

階層が深ければtrycatchをその場で書かずとも
throwsで上位にエラーハンドリングを任せるという手もありますが、
まだそこまでのアプリケーションではなさそうですし、
まとまりを意識した実装のほうが先ですね。

投稿2021/07/12 01:33

編集2021/07/12 01:41
m.ts10806

総合スコア80875

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

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

ganmodoki_

2021/07/12 01:46

ご回答ありがとうございます。 スコープ関連の話はなんとなくしか理解できていないのですが、try文の中で作ったオブジェクトはtry文の外には持っていけないのですね。 try文については有効範囲のルールはないのだと思っていました。
m.ts10806

2021/07/12 01:52

{} ↑囲まれた中がブロックなのでそんな特例はありません。 回答に書いたように宣言(初期値ullとか)を外に書くことでも解決できますが、 FileNotFoundExceptionが起きたときにnullのままとなるので、その場合の処理も必要となり無用なコードが1行以上増えます。 外部からの入力やデータを受け付ける以上、どのエラーがいつ起きるかはシステム側では事前に全て把握することはできませんので、やはりtryは全体にしておいても良いくらいです。 Exceptionも特定のものだけでなく、最上位のExceptionもcatchしておくべきと思います。
ganmodoki_

2021/07/12 02:00

そうなのですね。勉強になります。 import文と同じようにtry-catchも必要な文だけ書くものだと思っていました。 ご指摘のとおりにしてみたいと思います。 ありがとうございます。
m.ts10806

2021/07/12 02:03

>import文と同じようにtry-catchも必要な文だけ書くものだと思っていました。 そう思うことになった根拠を知りたいです。 importはライブラリや機能の読み込みのためのもの、 try-catchは異常処理(想定しない例外の捕捉)のためのもの で、全く方向性の違う機能です。
ganmodoki_

2021/07/12 02:08

すみません、根拠は特にないです。 何となくそう思っただけなので、確かにその通りですね。
neconekocat

2021/07/12 02:09 編集

必要な文だけ書く、という日本語はあっていますよ。 try内における必要な文とはファイルをcloseするまでの全ての処理ですが。
ganmodoki_

2021/07/12 02:15

とても勉強になりました。 初投稿でドキドキしましたが、やはり質問してよかったです。
m.ts10806

2021/07/12 02:17

あぁ、たしかに 今回は「必要な文の範囲」が把握できてなかっただけですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問