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

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

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

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

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Q&A

解決済

1回答

12093閲覧

【Java】インスタンス変数が突然nullになってしまう

sequence

総合スコア29

Java

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

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

0グッド

0クリップ

投稿2017/03/15 10:01

編集2017/03/15 12:36

問題の概要

Javaであるインスタンスを定義してそのインスタンス変数を取得しようとしているのですが、
いつの間にかそのインスタンス変数がnullになってしまっているという現象が起きております。

確認してみると、そのインスタンス変数のhashCodeが変わってしまっておりました。
変わってしまう時にそのインスタンス変数に対して、処理はさせていないため、原因がわからず困っております。
原因がわかる方がおりましたら、ご教授お願いいたします。

該当コード(サンプル)

public class A { List<B> b; Boolean bool; } public class B{ String data1; String data2; } public class Main{ public static void main(String args[]){ // class Aに対してclass Bがリストとして値が格納されているとする System.out.print(a.b.hashCode()); // 100とする System.out.print(a.b); // ArrayListの値が存在する if(a.bool){ // 今回はfalseなため、if文の中の処理は行なっていない -> hashCodeが変わるまでにしたのはif文でtrue,falseの判定をしただけ // 何かしらの処理 } System.out.print(a.b.hashCode()); // 200になっている System.out.print(a.b); // nullになる } }

上記のコード以外にもインスタンス変数が突然消えてしまう事象が起こります。
わかる範囲で共通点を申し上げますと、
class Bに当たるインスタンスには多くのプロパティが存在しており、それぞれに対してデータの追加、加工等の処理をさせている。
ということぐらいです。
なお、今回のif文を消しても次の処理が終わるとListのclass Bはnullになってしまいます。

よろしくお願いいたします。

環境

  • Java8
  • PlayFramework2.5
  • Eclipse4.6.2

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

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

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

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

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

swordone

2017/03/15 12:43

a.bがnullになっているなら、その前のhashCodeの呼び出しでNullPointerExceptionになるはずですが…最後2行を逆にしたらどうなりますか?
guest

回答1

0

ベストアンサー

a.b.hashcodeですから、ArrayListのハッシュ値が変わっていると言うことになります。
ArrayListのハッシュ値は,その都度格納しているオブジェクトのハッシュ値から再計算されますので、リストの内容を変更すれば変化します。それは当然の動作でして、ハッシュ値というのは生成後に内容の変化しないクラスにしか意味の無いものと理解してください。

投稿2017/03/15 12:14

yuba

総合スコア5568

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

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

sequence

2017/03/15 12:32

ご回答ありがとうございます。 すみません、質問が悪かったので、改めてお伺いいたします。 ハッシュ値に関しては内容変更で、変わってしまうのは問題ないです。 問題はif文を通過しただけで、値自体(ArrayList自体)nullになってしまうという点です。 こちらに関しては何かお分かりになりますでしょうか? よろしくお願いいたします。
yuba

2017/03/15 12:44

class AやBはデータベースのテーブルに紐付いたORMクラスですか? だとするとそれは有り得て、PlayFramework(というかEBean)の特徴になります。 ソースコード上での見た目はただのフィールドなのですが、コンパイル時にフレームワークがバイナリファイルを書き換えて、DBにアクセスするメソッドに置き換えてしまうのです。そのため、ソースコード上は不変のように見えてもアクセス結果が変わっているという現象が起こります。
sequence

2017/03/15 12:49

ご回答ありがとうございます。 class AやBはORMになります。 そうなのですね。 今回のような場合はどういった解決法がありますでしょうか? 現状はnullになる前に別の変数として格納して、後にインスタンス変数に再度代入するという方法をとって回避しております。 よろしくお願いいたします。
yuba

2017/03/15 12:51 編集

回避としてやっているその方法がいいと思います。 客観的には、その処理がDBからメモリへのデータコピーを記述しているコードとなるわけで不合理ではありません。
sequence

2017/03/15 12:57

ありがとうございます。 変数が多くなり、引数が増えたりすることを懸念していましたが、今の回避策でやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問