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

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

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

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

Q&A

解決済

2回答

745閲覧

メソッドの変数宣言。

hinata0812

総合スコア14

Java

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

0グッド

0クリップ

投稿2021/10/27 08:35

編集2021/10/27 08:36

javaを学習している初学者になります。
下記コードですが、xを宣言していますがif文でx=++y;で代入され初期化されていると思っていたのですが、
System.out.println(x+" ,"+y);のところでエラーがでてしまいなぜエラーになるのでしょうか?
xを消してyのみ出力すると9に変わったということはxには5が代入されていたとおもうのですが....

public class Main { public static void main(String[] args) { int x; int y=3; if(y>2) { x=++y; y=x+5; }else { y++; } System.out.println(x+" ,"+y); } }

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

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

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

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

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

y_waiwai

2021/10/27 08:40

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください
guest

回答2

0

if文でx=++y;で代入され初期化されていると思っていたのですが

いえ、逆にx=の代入文がif中にしかないので、通らない場合には初期化がされないままたどり着いてしまうことになります。

人間が見れば「ifを通らない可能性」はないとわかるのですが、コンパイラはそこまで厳密に可能性を潰すことはしません。

投稿2021/10/27 08:58

maisumakun

総合スコア146018

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

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

0

ベストアンサー

まず、他の方も仰っているように、エラ―メッセージは省略せずに出しましょう。
エラ―メッセージはヒントの宝庫です。というか、コンパイラ等からのメッセージです。
もしかしたら別の理由(後に書かれているメッセージ)が原因だったり、省略されているものの中にヒントが隠されていることがあるからです。

で、今回の質問ですが、単純に

Java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 int y = 1; 6 int x; 7 x = ++y; 8 System.out.println(x); 9 } 10}

のようにする場合は確かにxの値が出力されます。ですが、

Java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 int y = 1; 6 int x; 7 if( y == 1 ){ 8 x = ++y; 9 } 10 System.out.println(x); 11 } 12}

のようにif文等で設定する場合、初期値が設定されていない場合はエラーになるようです。

ちなみに今回のx = ++y;のような処理は初期化とは言いません。代入です。初期化とは、宣言と同時に設定するやつです。int a = 100; のような。別物です。

で、なぜ今回の場合、エラーになるのか。それは『分岐処理があるから』です。今回の場合、たまたまtrueになる条件式でした。でもこれがユーザ入力によって変化するとかだとどうなるでしょうか。

(私がサンプルとして提示した)コードを読んでみましょう。

import java.util.*; public class Main { public static void main(String[] args) throws Exception { // 変数y を 初期値1として宣言 (宣言&初期化) int y = 1; // 変数xを宣言 int x; // y が 1 なら if( y == 1 ){ // xの値は y + 1 した値である(yも +1している) x = ++y; } // 出力する System.out.println(x); } }

これが、仮に ユーザ入力で y = 2 だったらどうなるでしょうか。
if文の条件 ( y == 1 ) を満たさないのでスルーして 出力します。
そうなると初期化していない変数を使おうとしているから、『error: variable b might not have been initialized』のようなエラーを吐きます。
まあ、Javaのおせっかいですね。

投稿2021/10/27 08:58

編集2021/10/28 07:47
BeatStar

総合スコア4962

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

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

Zuishin

2021/10/27 09:01

初期値が与えられていない変数に初期値を与えるのは初期化で合っています。
Zuishin

2021/10/28 09:59 編集

「初期化」は「initialize」の訳語です。 > そうなると初期化していない変数を使おうとしているから、『error: variable b might not have been initialized』のようなエラーを吐きます。 not have been assigned ではなく not have been initialized とありますし、自分でも「初期化」と書いていますよね? 宣言と同時に代入する際に使える構文を初期化子(initializer)と呼び、初期化子で初期値を与えるのも当然初期化ですが、それは構文上の用語で、今回のエラーで使われている「初期化」とは意味が違います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問