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

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

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

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

Q&A

解決済

2回答

2636閲覧

staticイニシャライザ クラスがロードされるタイミングについて

BitCoin

総合スコア53

Java

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

0グッド

0クリップ

投稿2017/09/30 04:33

編集2017/09/30 05:44

下のコードはnullponterExeptionがスローされるのですが

nullponterExeptionではなくExeptionInitializerErrorでした・・・
問題なのはstaticイニシャライザが実行されるタイミングです。
クラスがロードされるタイミングで呼び出されるとありますが、
クラスがロードされるということは具体的にどのような状態なのでしょうか?

java

1public class Main{ 2private static String name ; 3static { 4if (name.length()=0){ 5name = "sample"; 6} 7 8public static void main(String[] args){ 9System.out.println("hello"+name); 10} 11}

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

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

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

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

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

shimitei

2017/09/30 04:53

質問のコードではコンパイルエラーになります。
BitCoin

2017/09/30 05:34

すいません。間違ってました修正しました。
guest

回答2

0

ベストアンサー

staticはソースコードの上から順番に初期化されます。

public class Main { private static String name = nameInit("world"); static { System.out.println("static init"); name = "sample"; } private static String name2 = nameInit("java"); private static String nameInit(String s) { System.out.println("name init: " + s); return s; } static { System.out.println("static init 2"); } public static void main(String[] args) { System.out.println("main"); System.out.println("hello " + name); } static { System.out.println("static init 3"); } }

出力は次の通り。

name init: world
static init
name init: java
static init 2
static init 3
main
hello sample

投稿2017/09/30 07:34

shimitei

総合スコア799

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

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

BitCoin

2017/09/30 14:20

回答ありがとうございます。 この場合だとどのタイミングでstaticイニシャライザが呼び出されるのでしょう。 static initが最初にくると思ったのですがname init: worldが先にくることがわかりません。 実行される順番など教えていただけないでしょうか?
shimitei

2017/09/30 14:31

書いてあるとおりの順番です。 Mainクラスのロード、Mainクラスのstaticの初期化処理が行われる。 1.staticフィールドnameが初期化される 2.staticイニシャライザの1つめが初期化される 3.staticフィールドname2が初期化される 4.staticイニシャライザの2つめが初期化される 5.staticイニシャライザの3つめが初期化される Mainクラスのstaticの初期化完了 6.mainメソッドが実行される。
BitCoin

2017/09/30 14:44

ありがとうございました。
guest

0

※そんなこと調べる前に勉強することが沢山ありそうだぞ!!

上の例をもし正しい形に書き換えたとするなら
static initializerはmainメソッドにアクセスされる前に呼ばれます
null pointer exceptionは実行順序云々の問題ではありません
nameに上記例では代入する記述がどこにもないため、nullpointerexceptionはnameにアクセスしようとすれば置きます

ロードとは、基本的には初めて
・インスタンス化される
・静的変数、メソッドにアクセスされる
ような場合に、VMが逐次クラス情報を読み込みに行きます

このため、上記例でいえば初めてMain Classにかかわる何かにアクセスした時に呼ばれると考えれば間違いありません。
この時、別のstatic initializerがSomeAnother Classにあったとしてもそちらが呼ばれるのはSomeAnotherクラスにアクセスした時です。

投稿2017/09/30 05:32

haru666

総合スコア1591

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

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

BitCoin

2017/09/30 05:42

すいません。いろいろ間違えてました・・ スローされる例外はExceptonInitializerErrorでした・・ staticイニシャライザが実行されるタイミングを知りたかったのですが この場合だとどのタイミングで実行されるのでしょう? 回答してもらった内容を見て私なりに解釈するとmainメソッドが呼ばれnameフィールドが呼び出される際、先にstaicイニシャライザが呼び出され、nullのl状態でlength()が呼ばれ例外がスローということでしょうか?
swordone

2017/09/30 13:04

おそらくstaticイニシャライザで例外が発生すると、そのErrorでラップされてスローされるということでは?
BitCoin

2017/09/30 14:03

なるほどそうですね。nullのl状態でlength()が呼ばれ、staticイニシャライザ内でエラーが起きるためExceptonInitializerErrorが起きると自分なりに解釈しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問