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

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

ただいまの
回答率

90.32%

  • Java

    14438questions

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

int の初期値について

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 677

bonobiya

score 9

avaの問題集で   
「正の整数値を読み込んで、その桁数を出力するプログラムを作成せよ」  
(たとえば9999と入力したら 
『4桁』 
という表示がされるプログラムを作成せよ)
という問題をやっていたのですが、そこでintの初期値に関する事で疑問点がありました。
問題に対する私の答えとして以下のコードを実行使用したところ、エラーになってしまいました。エラー文は下に記載します。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.println("正の整数値の桁数を求めます。");
        int x = stdIn.nextInt();
        System.out.println("正の整数値:"+x);

        int keta;
        while(x > 0){
            keta++;
            x = x /10;
        }
        System.out.println("その数は"+keta+"桁です");
    }
}

エラーメッセージは以下の通りです。

Main.java:13: error: variable keta might not have been initialized
            keta++;
            ^
Main.java:16: error: variable keta might not have been initialized
        System.out.println("その数は"+keta+"桁です");
                                  ^
2 errors

int keta;
のところを
int keta = 0;
に直したら正常に実行できたのですが、int のデフォルト値は0なのであえてint keta = 0と、初期値に0を入れなくても良い気がするのですが、私の勘違いでしょうか?
どなたかご解説いただけると幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+6

int のデフォルト値は0

これは
フィールドや配列の要素などは、省略した場合0で初期化されるという話で
ローカル変数には適用されません。

The Java® Language Specification

A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified using the rules for definite assignment (§16 (Definite Assignment)). 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

ローカル変数は明示的に初期化が必要な言語仕様であることは他の方が回答されているとおりです。

その理由はおそらく・・・

  1. 自動初期化は往々にしてバグの元になる
    あなたはintの変数の初期値は0であるのが自然と考えたわけですが、プログラム一般の話からすると初期値が0であることが常に自然かというとそうではありません。場合によっては別の初期値が用いられるであろうことは容易に想像できます。さてそんな場合、「本来0でない特定の値に初期化しなければプログラムとして正しくない論理」だったとして「プログラマーが初期化を忘れてしまったにもかかわらず自動的に0を初期値として仮定する」という言語仕様は「良い仕様」でしょうか。答えはおそらく「NO」です。そんな適当な仮定を置くよりは「変数の初期化忘れてますよ!どういう初期値にしたいんですか?」とコンパイルエラーになってくれた方がうれしいというのがJava設計者の考え方だったと思われます。

  2. プログラムで初期化しなくても必ず0で初期化するという言語仕様にしてしまったら・・・
    1.を許容したとして、初期値を設定しなくても必ず0で初期化されることを保証するという言語仕様を考えてみます。さてプログラマーがバグのないプログラムを書いて、変数の値を0でない値に初期化するとしましょう。その場合、必要もないのに0で初期化されるということはそれだけ無駄な代入文を実行することを意味するので、無暗に実行速度を落とす要因になってしまいます。
    ただしインタープリタ言語の多くではそういう仕様もあります。Visual Basicなんてのはそうですね。
    Dim a as Integer
    と書くと何も初期化しなくても0が仮定されます。インタープリタ言語は元々スピードを最優先に考えるのではなく使い勝手やコンパイルが必要ない点を重視するため「初期化ステップが入ったからといって何ほどのこともない」という考えで設計されるのだと思います。それに対してJavaなどのコンパイラー言語では「コンパイルという手間をかけるのだから可能な限りプログラムの正しさや効率を求める」思想で設計されます。そういう意味で「スピードを落とすような仕様」は合理的な理由がない限り避けられる傾向にあると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/07 00:37 編集

    失礼しました。大きな勘違いをしたコメントを残しましたが、撤回します。

    キャンセル

+2

変数の初期化とは:SJC-P(310-035)対策Java用語集

Javaでは変数の種類に応じて、自動的に変数の初期化が行われる場合と、そうでない場合があります。
自動的に初期化されるかされないかの判断は以下の通りです。
クラスのフィールド(メンバ変数)は自動的に初期化される。
メソッドのローカル変数は自動的に初期化されない。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

インスタンス変数はどこから値が設定されてどこから使用されるかわからない状態です。
そのため、どこで使用されてもいいようにデフォルトの値が決まっています。

一方、ローカル変数はそのメソッド内で値を設定し、使用する以外の用途がありません。
そんな変数を、値を設定せず使うという状態はおかしいので、デフォルトの初期値が決まっておらず、
コンパイルエラーを出すのです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

staticメソッド内だから初期化されないような気が・・・

面倒なので初期化しましょう。」が私の答えです。

言語によって仕様が変わります。
初期化されるのかされないのか、初期化される場合は0なのかnullなのかundefinedなのか考えるよりも最初から入れておけばバグは減るので

「無駄な初期化」とコードレビューで指摘されたこともありますが、安全第一。

ただし、for・whileなどのループでは変数宣言の場所や初期値には気をつけておかないとメモリや処理速度が悲惨なことになることも
ここらは経験ですかね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14438questions

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