-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 回答