奇怪的空对象引用错误

时间:2013-11-06 17:42:07

标签: c# wpf event-handling runtime-error nullreferenceexception

从调用" sliderValue.Content = widthValue"获取奇怪的空对象引用错误如下面定义的滑块的ValueChanged事件处理程序。

XAML:

<Window x:Class="StrangeError.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="166.066" Width="326.351">
<Grid>
    <Slider x:Name="widthSlider" HorizontalAlignment="Left" Margin="6,56,0,0" VerticalAlignment="Top" Width="257" TickFrequency="10" SmallChange="0.01" TickPlacement="BottomRight" IsSnapToTickEnabled="True" Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9, 10" ValueChanged="widthSlider_ValueChanged" Minimum="1"/>

    <Label x:Name="sliderValue" Content="" HorizontalAlignment="Left" Margin="262,50,0,0" VerticalAlignment="Top"/>
</Grid>

代码:

namespace StrangeError
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    int widthValue;

    public MainWindow()
    {
        InitializeComponent();
        widthValue = 1;
        sliderValue.Content = 1;
    }

    private void widthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        widthValue = (int)widthSlider.Value;
        sliderValue.Content = widthValue;
    }
}
}

错误(从调用sliderValue.Content = widthValue引发):

Object reference not set to an instance of an object.
System.NullReferenceException was unhandled by user code (...)

但是,如果我将该语句移动到另一个事件处理程序中,一切都运行得很好。当我从ValueChanged事件中调用它时,它只会引发此错误,这很奇怪。

1 个答案:

答案 0 :(得分:4)

根据您发布的内容,sliderValue似乎无效。 鉴于你在构造函数中使用它,我不确定究竟会发生什么? 无论如何,这个例子非常适合你使用WPF绑定:

<Slider x:Name="WidthSlider" HorizontalAlignment="Left" Margin="6,56,0,0" VerticalAlignment="Top" Width="257" TickFrequency="10" SmallChange="0.01" TickPlacement="BottomRight" IsSnapToTickEnabled="True" Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9, 10" Minimum="1" />
<Label Content="{Binding ElementName=WidthSlider, Path=Value}" HorizontalAlignment="Left" Margin="262,50,0,0" VerticalAlignment="Top"/>

修改 好的,我发现了你的问题: 调用InitializeComponent()时,widthSlider的值会发生变化。 这会触发您的widthSlider_ValueChanged事件,但由于widthSlidersliderValue之前已初始化,此时sliderValue将为null

基本上,只需添加:

if(sliderValue != null)
{
    ...
}

参加你的活动,一切都应该没问题。

我之前已经注意到了WPF和类似这样的事件。他们会真的告诉你什么时候有什么变化。

PS:你真的应该提到异常发生在应用程序启动之前,例如这些情况。它可以节省一些时间。