访问某个对象时出现NullReferenceException

时间:2014-04-23 14:50:27

标签: c# .net winforms nullreferenceexception

我知道这是一个noob错误,但我真的无法发现为什么它会在我访问已设置的对象时出现。

xlocyloc都是本地变量。

gameBorder.FormInstance.tableLayoutPanel1.GetControlFromPosition(xloc, yloc).BackgroundImage = Properties.Resources.Image;

然而,这已在表单类中设置:

namespace csharp_build
{
    public partial class gameBorder : Form
    {
        public static gameBorder FormInstance;

        public gameBorder()
        {
            FormInstance = this; 
            InitializeComponent();            
        }
    }
}

知道为什么会这样吗?是否将表单类引用为gameBorder,这就是构造函数被调用的事实,解决方案资源管理器中表单类的名称是Form1.cs吗? 我知道这是一个菜鸟问题而且我做了apolagize但是任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

如果您确定tableLayoutPanel1存在且不为空,请将代码更改为此,看看会发生什么:

  var control = gameBorder.FormInstance.tableLayoutPanel1.GetControlFromPosition
      (xloc, yloc);
  if (control == null) throw new NullReferenceException(
           "No control at those coordinates");
  control.BackgroundImage = Properties.Resources.Image;
jeez,伙计们,这是用于分析,调试的代码,以帮助弄清楚问题的原因,这一切......

警告警告警告:不作为最终生产代码
感谢下面的@SriramSakthivel评论,请注意NullReferenceException仅在调试/分析时被抛出,并且不应该被生产版本中的应用程序代码抛出。

答案 1 :(得分:0)

链接成员和方法结果的方式使得很难一目了然地确定导致NullReferenceException被抛出的原因。如果在创建任何FormInstance个实例之前访问null,则gameBorder可以是tableLayoutPanel。虽然不太可能,null也可能是GetControlFromPosition。如果指定的单元格上没有控件,var formInstance = gameBorder.FormInstance; Debug.Assert(formInstance != null); var controlAtPos = formInstance.tableLayoutPanel1.GetControlFromPosition(xloc, yloc); Debug.Assert(controlAtPos != null); controlAtPos.BackgroundImage = Properties.Resources.Image; // You may want to make some assertions on resolving your image instance too 方法的结果也可能很好。

当你在这种代码中遇到这种问题时,最好的办法是分解调用链。通过这种方式,您可以快速了解问题所在。

你也可以像code assertions那样制作:

{{1}}

代码断言的优点在于可以很容易地将它们排除在编译成生产代码之外。默认情况下,它在调试配置中编译,并在发布配置中排除。这样,您可以从调试时提供的帮助中受益,而无需担心已部署代码的额外开销。

请记住这一点,如果您将来再次遇到此问题,将会非常有用。