コレクションクラスの初期化方法と実行時エラーの対処法

このQ&Aのポイント
  • VC++.Net2008のC++/CLI WindowsフォームアプリケーションでSystem.Collections.GenericのListジェネリッククラスを使用してCSVファイルからデータを読み込むプログラムを作成中です。
  • CSV読み込み処理内でListにデータを追加する際に容量を増やす必要がありますが、容量を増やした後にデータを代入する際にSystem.nullreferenceexceptionエラーが発生しています。
  • 初期化が正しく行われていないためにエラーが発生している可能性があります。初期化はコンストラクタ内で行う必要があります。
回答を見る
  • ベストアンサー

コレクションクラスでクラスを初期化するには

環境: VC++.Net2008 C++/CLI Windowsフォームアプリケーション .Net、C++どちらも初めてで勉強しながら作業しています。 VB6.0で開発した経験が1回だけあります。 System.Collections.Generic のListジェネリッククラスを使って、 CSVファイルから読み込んだデータをクラスに格納してフォームから入力された値を比較して同じものがあるかないかの判定を行うプログラムを作成しています。 -------------------------------------- /* データを格納するクラス */ ref class A { char* cphoge; int ihoge; } ref class Amgr { List<A^>^ HOGE; Amgr(); //コンストラクタ {     HOGE = gcnew List<A^>(); /* CSV読み込み処理 */ if(もうCapacityがなかったら) { addで増やす } } } ---------------------------------------- CSV読み込み処理内でHOGE.add(クラス)で容量を増やした後、 読み込んだデータを代入しているのですが、 実行時エラーでSystem.nullreferenceexceptionが起きてしまいます。 調べて要は初期化がちゃんとできていない状態でアクセスしようとしたために実行時エラーで落ちたことはわかったのですが、 肝心の初期化の仕方がわかりません。どなたかご存知の方いましたらご教授よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> cntはint型で0で初期化していて、 > 最初の1回目の代入から実行時エラーで落ちます。 > HOGELengthも超えていません。 釈然としません。 常に cnt < HOGE.Length ですよね? # cnt <= HOGE.Length じゃダメですよ?

doseisan77
質問者

お礼

お待たせしました。 今日調べたところ、 add()するときに引数の空のクラスをgcnewしていなかったため、 Null参照していました。 A^ ahoge; HOGE->add(ahoge);  ←gcnewしてないで参照している また、cntにHOGE->Countの値を入れていたため、 null参照していました。 cnt = HOGE->Count;   //最初はCountは0 HOGE[cnt]->cphoge = text;   //text:可変の文字列 HOGE->CountはAddすると増えていくんですね。 一度Capacityに容量が確保されたら[]内の値を指定すれば容量の範囲内ならどこにでも値を入れられると勘違いしていました。Listは順に値を追加していくためのものだと知っていたのに。。 どちらも直したところ無事実行することができました。 クラスは見よう見まねで作っていたのでちゃんと勉強すべきだと痛感しました。 どうもありがとうございました。

doseisan77
質問者

補足

>常に cnt < HOGE.Length ですよね? ># cnt <= HOGE.Length じゃダメですよ? 昨日調べた時点ではcnt < HOGE.Lengthなんですが… もう一度調べてみます。 会社でないと調べられないため、また会社ではここに書き込めないため、 今日の日付が変わるか変わらないかの時間帯になってしまいますが 報告致します。申し訳ありませんがしばらくお待ちください。

その他の回答 (2)

回答No.2

> HOGE[cnt]->cphoge = 文字列(可変); HOGE[cnt]がnullptrを指しているのでしょう。 cntは正当な値ですか? HOGE.Length を越えてはいませんか?

doseisan77
質問者

お礼

cntはint型で0で初期化していて、最初の1回目の代入から実行時エラーで落ちます。 HOGELengthも超えていません。 各変数もgcnewで初期化とか必要なのでしょうか?

回答No.1

説明不足。 ナニに対してSystem.NullReferenceExceptionが発生したのか突き止めてもらわんとナニの初期化がちゃんとできていないのか判断できません。

doseisan77
質問者

お礼

失礼しました。 char* cphogeに文字列を代入したところでSystem.NullReferenceException が発生しました。 HOGE[cnt]->cphoge = 文字列(可変); try catchでは オブジェクト参照がオブジェクトインスタンスに設定されていません。 と出ます。

doseisan77
質問者

補足

すいませんもう一つ漏れがありました。 Amgr()コンストラクタ内の CSV読み込み処理はCSVの中のデータをすべて読み取るまでループしています。 CSVファイルのデータ数が可変なので、コレクションクラスを使って クラスの数を増やしています。

関連するQ&A

  • コレクションクラスについて

    ●下記のコードについて質問があります import java.util.*; public class Test { public static void main(String args[]) { ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); list.add(new ObjectOne()); list.add(new ObjectOne()); list.add(new ObjectOne()); Collections.sort(list); } } class ObjectOne { private int x = 0; private int y = 0; } このソースをコンパイルすると、 シンボル: メソッド sort(java.util.ArrayList<ObjectOne>) 場所 : java.util.Collections の クラス Collections.sort(list); と、エラーが表示されてしまいます。 java.util.*をインポートしているので、上記のようなエラーはでないと 思うのですが、うまくいかないです。おそらく、ObjectOneクラスで 何か処理漏れが起きているのかもしれませんが、エラーとなる原因を 特定することができません。 エラーとなる原因と解消する手立てを教えていただければと思っております。 宜しくお願い致します。 「追記」 ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); の<ObjectOne>を消せばエラーはなくなりますが、 <ObjectOne>を消さない方針で考えがあればと思っております。

  • クラスを使ったphpファイル間のデータの受渡し

    質問させていただきます。 クラスを使ったphpファイル間のデータの受渡しはできるのでしょうか。 (MVCの様なもの?) データのが多いのでhtml のrequestだと時間がかかるためです。 file_a.php :class.phpを呼び出して、ファイル中のクラスclass_hogeに値を格納 file_b.php :class.phpを呼び出して、file_a.phpで格納した値をclass_hogeから取り出す。 フレームワーク等は、使用しておりません。 ご助言お願いいたします。 失礼します。

    • ベストアンサー
    • PHP
  • 実体化したクラスを関数の引数にするには

    タイトルの通りです。 実体化したクラスを関数の引数として渡し、 関数の中でクラスのメソッドを実行したいと思っています。 以下のソースではエラーが出るのですが、 お分かりの方はいらっしゃいますでしょうか? $o_hoge = new Class_hoge(); fncHoge = ($o_hoge); function fncHoge($class) {  $class->hoge('test'); } class Class_hoge {  public function hoge($a)  {   print $a;  } }

    • ベストアンサー
    • PHP
  • 派生クラスのメンバを基底クラスの参照に代入(C++

    文末のコードのように、 基底クラスで、派生クラスのメンバの参照を持つのはまずいでしょうか。 (classではなくstructにしているのは質問上でのpublic:の省略のためだけです) 初期化順序的には、基底クラスの参照先は、 基底クラスのコンストラクタが走る時点で初期化されていないので、 コンストラクタ内で参照に対して何かしようとすると問題になると思っています。 基底クラスのコンストラクタ内で派生クラスメンバの参照に対して何かしなければ、 参照は有効で、派生クラスのコンストラクタ実行後であれば 問題なく動くと思ってよいでしょうか。 struct A { int& m_ref; A(int& ref) : m_ref(ref) { } }; struct B : public A { int m_obj; B() : A(m_obj) { } };

  • ArrayListの初期値の設定の仕方(VB.NET)

    VB.NET2005についての質問です。 ArrayList型の変数の初期値に、プロパティの戻り値を設定することは可能でしょうか。 (つまり、下記の(a)(b)の二行を一行にまとめたい、と考えています) どうぞよろしくお願い致します。 Public Class form1   Dim hoge As New ArrayList  'a)初期値としてClass1.P_hogeを設定したい   hoge = Class1.P_hoge    'b)消したい End Class Public Class Class1   Private Shared _hoge As New ArrayList  'すでに値が格納されているものとする   Public Shared Property P_hoge() As ArrayList      Get    Return _hoge    End Get   End Property End Class

  • Java コレクション・ジェネリクスについて

    Javaのコレクション・ジェネリクスについてです。 以下のコードについて、私はa.y();でAインタフェイスにyメソッドがないため コンパイルエラーになるのではないかと思っているのですが(実際にエラーが出ている) 書籍では「実行されるがなにも表示されない」とあります。 もし私の考え方に間違いがあればご指摘いただけると幸いです。 ocj-pを受験目前なので切実です。 よろしくお願いいたします。 interface A { void x(); } class B implements A { public void x(){} public void y(){} } class C extends B public void x(){} } public class D { public static void main(String[] args) { List<A> list = new ArrayList<A>(); list.add(new B()); list.add(new C()); for(A a : list) { a.x(); a.y(); } } }

    • ベストアンサー
    • Java
  • クラスの使い方

    php5です。 --- test1.class.php --- class TEST1 { function hoge1() { // 実際に複雑な処理ですが概要として簡易化してます $aaa = 'hoge1'; // クラスの実行で単純に戻り値を返す return $aaa; } } --- test2.class.php --- class TEST2 { function hoge2() { // 実際に複雑な処理ですが概要として簡易化してます $bbb = 'hoge2'; // クラスの実行で単純に戻り値を返す return $bbb; } } --- MySmarty.class.php --- require_once 'test1.class.php'; require_once 'test2.class.php'; class MySmarty extends Smarty { function MySmarty() { //ここでclassTEST1,2の戻り値を利用しif文で分岐をしたい if ($aaa == 'hoge1') { $ccc = 'あああ'; } elee { $ccc = 'いいい'; } if ($bbb == 'hoge2') { $ddd = 'ううう'; } elee { $ddd = 'えええ'; } $this->assign('aaa', $aaa); $this->assign('bbb', $bbb); ・・・ } } このような使い方はできないものでしょうか?クラスに触れてまだ間も無く理解も深めれて いない状態で参考サイトなどを調べてみたのですがこのような使い方を書いている説明は みつかりませんでした。 思いつく方法としてはMySmartyに継承すればいいようなのですが継承は1つまでと 制限があるようでそれもできない状態です。 単純に1つのクラスにまとめて書けば済むような気もあるのですが他にも別のクラスの 戻り値を利用して分岐等をさせたく思っているのですがこの場合どうすればいいのでしょうか? もし不可能な場合(可能だけど方法的に良くない場合)の別の方法としてアドバイスを 頂けますと幸いです!宜しくお願いします!

    • 締切済み
    • PHP
  • 【ruby】【文法】スパークラスのスーパークラスのメソッドを呼び出したい

    スパークラスのスーパークラスのメソッドを呼び出したいです。 たとえば、Hoge3のスーパークラスがHoge2で、さらにそのスーパークラス がHogeの時、Hoge3からHogeのメソッドを呼び出したいのです。 もう少し具体的に説明させてもらいます。 class Hoge  def initialize()   @name='hoge'  end end class Hoge2 < Hoge  def initialize()   super   @name='hogehoge'  end end class Hoge3 < Hoge2  def initialize()   super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。   puts @name  end Hoge3.new() 上記実行結果は、hogehogeが出力ですが、 スーパークラスのスーパークラスが設定した@name値、 'hoge'が出力されるようにしたいです。 『Hoge3クラスはHoge2クラスを継承すればよいではないか?』 とも思うでしょうが、Hoge2クラスには、Hogeには無い機能が多く拡張されてると考えてください。 ご指導のほど、宜しくお願いいたします。

  • Collectionからの型変換について

    いつもお世話になっています。 Collectionについてなのですが、 Collection→配列は、可能ですが、 Collection→List,Mapはできないのでしょうか? ためしに、CollectionにList,Mapそれぞれを格納してみると Object[]で、List,Mapそれぞれの値を取得することはできるようなのですが。 以下が実行時のソースです。 //MapからCollection Map map = new HashMap(); map.put("tet","ttt"); map.put("a", "arigato~"); //MapをCollectionに格納する Collection co1 = java.util.Arrays.asList(map); //Object型配列で取得する Object[] ob1 = co1.toArray(); System.out.println(ob1.length + "/" + ob1[0]); //ListからCollection List list = new ArrayList(); list.add("test"); list.add("arigato~"); //ListをCollectionに格納する Collection co2 = java.util.Arrays.asList(list); //Object[]で取得する Object[] ob2 = co2.toArray(); System.out.println(ob2.length + "/ " + ob2[0]); 表示結果: 1/{a=arigato~, tet=ttt} 1/ {a=arigato~, tet=ttt} 宜しくお願いします。

    • ベストアンサー
    • Java
  • クラス内の初期化の簡略方法と、クラス内の巨大な配列をどうにかしたい。

    C++でクラスを書いているのですが、2つ悩んでいることがあります。 1つ目は、初期値のある巨大なテーブルをクラスの中に入れておくと、インスタンス生成ごとに巨大な参照用変数が作られるのはスマートでないと感じるのですが、何か良い方法はありますか? 2つめは、クラスで変数割り当てと同時に初期値セットを簡便に行いたいです。 class A { int info_table[100000]; void init(void){ info_table[0] = 1; // 1)実際は意味のある数値で、参照される巨大な変数 ... // 2)だらだら書くのではなくて、info_table[] = { 1, 2, 3 ... 100000};のように書きたい info_table[99999]; } public: A(){ init(); } ~A(){} };

専門家に質問してみよう