静态数组中的空指针异常C#

时间:2012-11-12 19:38:19

标签: c# static nullpointerexception

我正在通过一个方法初始化静态数组,然后想在非静态方法中使用它并抛出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();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

除非我正在调整某事,否则无论何时打电话

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

i将始终为零,然后当您以后访问它时,在for循环中,

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

您尝试在第一次迭代后访问未初始化的Dzwiek对象的hz属性