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

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

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

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

3回答

1647閲覧

final intが初期化されていない可能性もあり、代入されている可能性もある。

cretter

総合スコア91

Java

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

0クリップ

投稿2021/06/25 08:23

前提・実現したいこと

クラス変数で宣言したfinal int x;があり、それにfile.txtの一段目の数字を代入しようとしています。ですが、tryの外で代入したxを使用しようとするとエラー(1)が起きます。なので、初期かされていない可能性をつぶそうと今コメントになっている部分を有効にしました。しかし、そうするとエラー(2)が発生してしまします。
直し方を教えてください。

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

1

1Sample.java:15: エラー: 変数xは初期化されていない可能性があります 2 System.out.println(x); 3 ^ 4エラー1個

2

1Sample.java:14: エラー: 変数xはすでに代入されている可能性があります 2 x=0; 3 ^ 4エラー1個

該当のソースコード

java

1import java.io.*; 2public class Sample{ 3 final int x; 4 public static void main(String[] args){ 5 new Sample(); 6 } 7 Sample(){ 8 try{ 9 x=Integer.parseInt(new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("file.txt"))).readLine()); 10 System.out.println(x); 11 }catch(Exception e){ 12 13 } 14 //x=0; 15 System.out.println(x); 16 } 17}

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

java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)

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

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

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

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

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

maisumakun

2021/06/25 08:29

なぜfinalである必要があるのでしょうか?
guest

回答3

0

ベストアンサー

いったんfinalでない変数で処理を進めておく、というのはどうでしょうか?

java

1 Sample(){ 2 int y = 0; 3 try{ 4 y=Integer.parseInt(new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("file.txt"))).readLine()); 5 System.out.println(y); 6 }catch(Exception e){ 7 8 } 9 x = y; 10 System.out.println(x); 11 }

投稿2021/06/25 08:33

編集2021/06/25 08:33
maisumakun

総合スコア146018

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

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

cretter

2021/06/25 08:52

回答ありがとうございます。 finalにしないのはこの後の処理で間違ってほかの値に代入しないようにするためです。
hope_mucci

2021/06/25 09:23

ちょっと補足すると、parseIntする箇所だけをtry-catchで抑えておけば他の検査例外に影響を及ぼさないので極力tryブロックの範囲を絞りましょう。この方法であればcatchの中で例外発生時に任意の値をyに入れ、tryブロックの外でxを初期化することが可能です。
guest

0

どうしてもfinalにしないといけないのなら、一旦別の変数に代入してください。

Java

1int xx = 0; 2try { 3 xx = ... 4} 5... 6 7x = xx;

投稿2021/06/25 08:32

LouiS0616

総合スコア35668

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

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

0

catchの中で何もしてないので、x=の右辺を評価中に例外が起きたら代入されずにprintlnに到達しますね。
このコードでtry-catchのある意図がちょっとわからないんですが、必須でないならtry-catchごと外せばいいんじゃないかなと思います。
必要ならcatch内で別の値をxに代入するかthrowかreturnで抜ける必要があります。

投稿2021/06/25 08:34

S.Percentage

総合スコア283

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

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

S.Percentage

2021/06/25 08:35

catch内で別の値入れるのはできないか
LouiS0616

2021/06/25 08:38

検査例外IOExceptionが生じるので、try-catchは単純には外せません。
S.Percentage

2021/06/25 08:41

コンストラクタにthrowsって書けないんでしたっけ? 書けるならそれでもいいし、かけないならそもそも例外の可能性のある処理をコンストラクタ内でやるな、という話になりますね。言語仕様的に
LouiS0616

2021/06/25 08:43

throwsは書けますけど、 そもそも例外発生時の挙動が全く異なってしまうので解決策にはなってない気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問