-1

メソッドで静的配列を初期化していますが、それを非静的メソッドで使用したいのですが、nullpointerException がスローされます。小さな例を作成すると、すべてが機能しました。何が悪いのかわかりません。アタッチメントソリューション。

http://www.speedyshare.com/QRjW5/Funkcjonalnosc-Kopia-2.zip

メインメソッドはクラスにあります

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Funkcjonalnosc
{
    class Dzwiek
    {
        static Dzwiek[] tabRefDzwiekow;// = zaladujDzwieki();//przy uruchomeniu dzwieki referencyjne wczytaja sie raz
        double hz;
        String dzwiek;
        bool first = true;

        Dzwiek(double hz) {
            this.hz = hz;
            dzwiek = dopasujDzwiek(hz);
        }
        Dzwiek(String dzwiek, double hz) {
            this.dzwiek = dzwiek;
            this.hz = hz;
        }

        public static void zaladujDzwieki() {
            System.IO.StreamReader sr = System.IO.File.OpenText("dzwieki.txt");
            tabRefDzwiekow = new Dzwiek[100];
            string s = "";
            int i = 0;
            string[] splitted;
            while ((s = sr.ReadLine()) != null) {
                splitted = s.Split('\t');
                tabRefDzwiekow[i] = new Dzwiek(splitted[0], Double.Parse(splitted[1]));
                Console.WriteLine(tabRefDzwiekow[i].hz);
            }
            sr.Close();
        }
        //Znajduje odpowiedni dzwiek w tablicy dzwiekow
        String dopasujDzwiek(double hz) {
            double obecnaRoznica, poprzedniaRoznica = int.MaxValue;
            string dopasowanyDzwiek = "";
            for (int i = 0; i < tabRefDzwiekow.Length; i++) {
                obecnaRoznica = Math.Abs(hz - tabRefDzwiekow[i].hz);//THROWS EXCEPTION!
                if (obecnaRoznica > poprzedniaRoznica)
                    return tabRefDzwiekow[i - 1].dzwiek;
                poprzedniaRoznica = obecnaRoznica;
            }
            return dopasowanyDzwiek;
        }
        static void Main(string[] args) {
           zaladujDzwieki(); //initilize the static ARRAY tabRefDzwieki
           Dzwiek dzwiek = new Dzwiek(440); //uses that array by calling function in //constructor doPasujDzwieki()
           Console.Read();
        }
    }
}
4

1 に答える 1

2

私が何か不足していない限り、あなたが電話するたびに

tabRefDzwiekow[i] = new Dzwiek(splitted[0], Double.Parse(splitted[1]));

i常にゼロになり、後でアクセスすると、 for ループで、

obecnaRoznica = Math.Abs(hz - tabRefDzwiekow[i].hz);//THROWS EXCEPTION

最初の繰り返しの後で、初期化されていないDzwiekオブジェクトのプロパティにアクセスしようとしていますhz

于 2012-11-12T19:43:49.113 に答える