如何修复System.NullReferenceException:对象引用未设置为对象的实例

时间:2012-04-06 12:04:55

标签: c# .net

编辑:这个问题已经解决了,非常感谢Reniuz 5个小时的工作和对这个问题的研究,谢谢大家。

NullReferenceException:未将对象引用设置为对象的实例。在下面的代码中,我搜索并搜索了我的头发超过7-8小时,现在试图解决它。

private void buttonAddEffect_Click_1(object sender, EventArgs e)
{
    EffectSelectorForm effectSelectorForm = new EffectSelectorForm(Effects);
    if (effectSelectorForm.ShowDialog(this) == DialogResult.OK)
    {
        // create a new instance of the selected effect as we may want multiple copies of one effect
        Effect effect = (Effect)Activator.CreateInstance(effectSelectorForm.SelectedEffect.GetType());
        audioGraph.AddEffect(effect);
        int index = checkedListBox1.Items.Add(effect, true);
        checkedListBox1.SelectedIndex = index;
    }
    //MessageBox.Show(String.Format("I have {0} effects", Effects.Count));
}

错误在线: EffectSelectorForm effectSelectorForm = new EffectSelectorForm(Effects);

班级:

namespace WindowsFormsApplication13
{
    public partial class EffectSelectorForm : Form
    {
        public EffectSelectorForm(ICollection<Effect> effects)
        {
            InitializeComponent();
            listBoxEffects.DisplayMember = "Name";
            listBoxEffects.DataSource = effects;
        }

        private void buttonOK_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }

        public Effect SelectedEffect
        {
            get
            {
                return (Effect)listBoxEffects.SelectedItem;
            }
        }

        private void listBoxEffects_DoubleClick(object sender, EventArgs e)
        {
            buttonOK_Click(sender, e);
        }

这应该做的是当effectSelectorForm加载它时应该列出所有语音转换器选项,但它没有这样做....它没有加载任何内容,我从另一个表单获取此代码以进行更改Skype中的语音并重新编写了大约400行代码,以便在我的应用程序中运行,但现在我遇到了这个问题而且我并没有放弃到目前为止所付出的所有努力。如果它加载到另一个项目,为什么不在这个?我已经过了几个小时的代码,一遍又一遍地想着我错过了什么,但没有。

任何帮助都会很棒。

堆栈

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
   at WindowsFormsApplication13.pwn4g3.buttonAddEffect_Click_1(Object sender, EventArgs e) in F:\Users\Tom\Desktop\New folder\New folder (2)\TestApp\pwn4g3\PWN4G3\MainForm2.cs:line 1758
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Effect.cs

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

namespace JSNet
{    

    public abstract class Effect
    {
        private List<Slider> sliders;
        public float SampleRate { get; set; }
        public float Tempo { get; set; }
        public bool Enabled { get; set; }

        public Effect()
        {
            sliders = new List<Slider>();
            Enabled = true;
            Tempo = 120;
            SampleRate = 44100;
        }

        public IList<Slider> Sliders { get { return sliders; } }

        public Slider AddSlider(float defaultValue, float minimum, float maximum, float increment, string description)
        {
            Slider slider = new Slider(defaultValue, minimum, maximum, increment, description);
            sliders.Add(slider);
            return slider;
        }

        public abstract string Name { get; }

        // helper base methods
        // these are primarily to enable derived classes to use a similar
        // syntax to JS effects
        protected float slider1 { get { return sliders[0].Value; } }
        protected float slider2 { get { return sliders[1].Value; } }
        protected float slider3 { get { return sliders[2].Value; } }
        protected float slider4 { get { return sliders[3].Value; } }
        protected float slider5 { get { return sliders[4].Value; } }
        protected float slider6 { get { return sliders[5].Value; } }
        protected float slider7 { get { return sliders[6].Value; } }
        protected float slider8 { get { return sliders[7].Value; } }
        protected float min(float a, float b) { return Math.Min(a, b); }
        protected float max(float a, float b) { return Math.Max(a, b); }
        protected float abs(float a) { return Math.Abs(a); }
        protected float exp(float a) { return (float)Math.Exp(a); }
        protected float sqrt(float a) { return (float)Math.Sqrt(a); }
        protected float sin(float a) { return (float)Math.Sin(a); }
        protected float tan(float a) { return (float)Math.Tan(a); }
        protected float cos(float a) { return (float)Math.Cos(a); }
        protected float pow(float a, float b) { return (float)Math.Pow(a, b); }
        protected float sign(float a) { return Math.Sign(a); }
        protected float log(float a) { return (float)Math.Log(a); }
        protected float PI { get { return (float)Math.PI; } }

        protected void convolve_c(float[] buffer1, int offset1, float[] buffer2, int offset2, int count)
        {
            for (int i = 0; i < count * 2; i += 2)
            {
                float r = buffer1[offset1 + i];
                float im = buffer1[offset1 + i + 1];
                float cr = buffer2[offset2 + i];
                float ci = buffer2[offset2 + i + 1];
                buffer1[offset1 + i] = r * cr - im * ci;
                buffer1[offset1 + i + 1] = r * ci + im * cr;
            }
        }


        public virtual void Init()
        {
        }


        public abstract void Slider();


        public virtual void Block(int samplesblock)
        { 
        }


        public abstract void Sample(ref float spl0, ref float spl1);

        public override string ToString()
        {
            return Name;
        }
    }
}

4 个答案:

答案 0 :(得分:3)

如果问题是100%在这里

EffectSelectorForm effectSelectorForm = new EffectSelectorForm(Effects);

只有一种可能的解释:属性/变量“效果”未正确初始化...调试代码以查看传递给对象的内容。

几个小时后

编辑

有一些问题:

  • MEF属性[导入]未按预期工作,因此我们暂时使用手动填充的List&lt;&gt;替换它。虽然集合为null,但是当代码尝试获取所选项目的类型并且没有时,它会在代码中导致异常。

  • 多个事件处理程序未连接到控制事件

仍然存在一些问题,但我认为OP的原始问题已得到修复。其他问题与此无关。

答案 1 :(得分:0)

在调试期间,中断所有抛出的异常。 调试 - &GT;例外

检查所有'Thrown'例外情况。 F5,代码将停在违规行上。

答案 2 :(得分:0)

我遇到了同样的问题,但它只发生在已发布的Godaddy网站上。 我当地的主人没问题。

错误来自aspx.cs(代码隐藏文件),我试图为标签赋值。 从后面的代码中看来,标签Text似乎为null。 所以我所做的就是将ASPX文件中的所有标签文本属性从Text =“”更改为Text =“”。

问题消失了。我不知道为什么错误发生在托管版本而不是我的localhost上,没有时间弄清楚原因。但它现在工作正常。

答案 3 :(得分:0)

我遇到了同样的错误,但是对我来说,这是由于基类中的方法(在Project A中)将输出类型从非无效类型更改为无效。在项目B中存在一个子类(我不想使用该子类,并标记为过时的子类),在执行此更新时错过了它,因此开始抛出此错误。

1> CSC:错误CS8104:写入输出文件时发生错误:System.NullReferenceException:对象引用未设置为对象的实例。

原始代码:

[Obsolete("Calling this method will throw an error")]
public override CompletionStatus Run()
{
    throw new CustomException("Run process not supported.");
}

修改后的代码:

[Obsolete("Calling this method will throw an error")]
public override void Run()
{
    throw new CustomException("Run process not supported.");
}