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

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

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

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

Q&A

解決済

4回答

643閲覧

変数の定義について、宣言して中身を入れないといけないのでしょうか?

talabagani

総合スコア50

Java

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

1グッド

0クリップ

投稿2021/07/03 00:53

#[環境]
Java version 16.0.1
VS Code
Mac OS Big Surの環境です。
java -version
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)
MacBook:09_MinutesToYearsandDayCalculator $

パソコン MacBook(Retina, 12-inch,2017), memory 8GB

#[エラー]
変数sumは初期化されていない可能性があります
sum += a;
^

[学習状況]
2021年5月中旬から独学でJavaを学習しはじめました。
progateを3巡、ドットインストール1巡、スッキリJavaの本を8割読みました。現在、UdemyのJava Programming Masterclass for Software Developersというコースで動画を見たり、演習問題に取り組んだり、w3resourceというサイトから演習問題に取り組んだりしています。

#[演習問題の内容]
ユーザーから5つの数字をインプットしてもらい、その数字の合計と平均を表示させるプログラムを書きましょう。

#[やってみたこと、疑問に思う事]
int sum;
という部分を int sum=0; なら問題なく実行されるようです。
これが、不思議です。

int ave;はこのままで大丈夫なのになぜ、int sum;はだめなのでしょうか?

#[自分コード]

java

1import java.util.Scanner; 2public class averageAndSum { 3//Write a program in Java to input 5 numbers from keyboard and 4//find their sum and average. 5 public static void main(String[] args) throws Exception { 6 7 Scanner scanner = new Scanner(System.in); 8 //スキャナーの初期化 9 int counter = 1; 10 int sum; 11 // int sum=0; なら問題なく実行される。 12 int ave; 13 while(true){ 14 15 System.out.println("Type in the number #" + counter +":"); 16 boolean isAnInt=scanner.hasNextInt(); 17 if(isAnInt){ 18 int a = scanner.nextInt(); 19 counter++; 20 sum += a; 21 ave = sum/counter; 22 if(counter==5){ 23 break; 24 } 25 } 26 scanner.nextLine();//handle end of line 27 } 28 System.out.println("Sum of all the five numbers are " + sum); 29 System.out.println("Average of all the five numbers are " + ave); 30 scanner.close(); 31 } 32} 33
TN8001👍を押しています

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

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

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

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

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

m.ts10806

2021/07/03 03:46

調べて何も出ない内容に思えませんし、参考書に何も言及がないならそれはそれで不備とも言えます。 如何でしょうか。
guest

回答4

0

これが、不思議です。

そういう、仕様の言語なのです。Javaは。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.5

4.12.5。変数の初期値
プログラム内のすべての変数は、その値が使用される前に値を持っている必要があります。

投稿2021/07/03 01:28

編集2021/07/03 01:30
shiketa

総合スコア4061

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

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

talabagani

2021/07/03 23:05

値がつかわれる、参照される前に値をいれておくようにしようと思いました。ありがとうございました。
guest

0

ベストアンサー

言語や環境によっては初期化(宣言と同時に値を設定すること)をしないと、
不定値が設定されるためです。

たとえば、C言語での、ある環境では
初期化しないと0が設定され、
またある環境では不定値が設定されます。

不定値…たとえば1242とかですね。

そうなると、今回の場合、データが違ってきます。

aveは『sum割るcounterの値』なので、
aveに何が入っていても問題無さそうですが、
sumの方はどうでしょうか。

sumは『前回のsumにaを足した値』なので、
初期値が不定値だとどうなるでしょうか。

……ここまでがC言語の場合です。

Javaの場合はちょっと事情が違うようです。

参考1: Javaにおける変数の初期化についての整理

参考2: 【Java】変数を初期化しなくてもいい時・しなきゃいけない時

要約すると『ローカル変数は初期化されない』らしいです。
(初期値を与えない場合)

そのため、エラーを吐くのです。

投稿2021/07/03 01:46

BeatStar

総合スコア4962

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

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

talabagani

2021/07/03 23:04

リンク、とってもわかりやすかったです。 メソッドの外で定義された変数は自動的に初期化されることなど、初めて知りました。 ありがとうございました。
guest

0

まず、Javaではローカル変数は初期化していないとコンパイルエラーになります。
なので、今回であれば初期値は0である必要があるのでint sum=0;とする必要があるわけですね。

そしてなぜaveは初期化しなくていいのか、という話ですが
これは先程ローカル変数は初期化していないとコンパイルエラーになります。と言いましたが
実は絶対に初期化しなくてはならない訳では無く、
そのローカル変数の中身を見る必要がある場合は初期化が必要になります。

sum += a;sum = sum + a;という意味ですから、aを加算する時にsumの中に何が入っている
か確認しないといけませんよね。なので初期化が必要になります。

一方aveは、

ave = sum/counter;というように、aveの中身を一切見ていませんので、初期化は必要ないため、
このままコンパイルが出来るという訳です。

投稿2021/07/03 01:35

K_3578

総合スコア1282

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

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

talabagani

2021/07/03 23:06

ave = sum/counter;はその中を参照されないので、初期化の必要がない、とてもわかりやすかったです。ありがとうございました。
guest

0

別にint sum;でも良いです。

sumの値を参照する前に、sum = ~~;で何らかの値を代入しておけば十分です。

sum += a;は、「sumの値とaの値を足して、和をsumに代入する」という意味ですが、この「sumの値」の部分でsunの値を参照しているわけです。
なので、それ以前に代入が必要です。
お書きのコードではその代入が無いのでエラーです。
sum += a;を実行する前に、sum = 0;とか、sum = 12345;とか代入しておけばそのエラーは出ません(計算結果が正しいかどうかは代入する値によるでしょうが)。

aveについては、値を参照する前に代入しているので問題ありません。

単純な例では、

Java

1int a; 2System.out.println(a);

のコードでどういう値が表示されると思いますか?
これも、printlnaの値を参照する前に代入していないので同じエラーです。

投稿2021/07/03 02:04

otn

総合スコア85901

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

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

talabagani

2021/07/03 23:03

参照するまでに値を入れておけばいいのですね。 よくわかりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問