.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?

 后端开发  作者: Rector  1973 阅读  0 评论  0 收藏  收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题分析

C#中的开发中,如果遇到“NullReferenceException”或者“未将对象引用到实例”这样的提示,那么是你的程序代码正在试图访问一个null的引用类型的实体而抛出的异常。可能的原因有:

情景一 未实例化引用类型实体

忘记了实例化一个引用类型。 在下面的示例中,names声明,但决不实例化:

using System;
using System.Collections.Generic; public class Example
{
public static void Main(string[] args)
{
int value = Int32.Parse(args[0]);
List<String> names;
names.Add("Major Major Major");
}
}

此例中的 names在使用之前并没有初始化,修复后的:

using System;
using System.Collections.Generic; public class Example
{
public static void Main()
{
List<String> names = new List<String>();
names.Add("Major Major Major");
}
}

情景二 泛型连写

如下代码:

ref1.ref2.ref3.member

如果ref1 或者 ref2 或者 ref3任意一个为空时,此代码均会抛出NullReferenceException(未将对象引用到实例)的异常错误。我们可以重写这个表达式来检查以下的r1,r2,r3是否为null:

var r1 = ref1;
var r2 = r1.ref2;
var r3 = r2.ref3;
r3.member

情景三 类的实例未初始化

如下代码:

public class Book {
public string Title { get; set; }
}
public class Example {
public void Foo() {
Book b1;
string title = b1.Title;
}
}

其中,Example类中的b1并未实例化,会抛出NullReferenceException(未将对象引用到实例)异常,解决方法:

使用new关键字来实例化b1对象

修复后的代码:

public class Book {
public string Title { get; set; }
}
public class Example {
public void Foo() {
Book b1 = new Book();
string title = b1.Title;
}
}

情景四 间接引用

如下代码:

public class Person {
public int Age { get; set; }
}
public class Book {
public Person Author { get; set; }
}
public class Example {
public void Foo() {
Book b1 = new Book();
int authorAge = b1.Author.Age;
}
}

这里的 Example 类中的b1已被实例化,但如果我们运行程序,依然会抛出NullReferenceException(未将对象引用到实例)异常。是因为 Book 类中包含了另外一个引用类 Person 但并没有被实例化,解决方式可以在Book的构造器中直接实例化,如:

public class Person {
public int Age { get; set; }
}
public class Book {
public Book(){
Author = new Person();
}
public Person Author { get; set; }
}
public class Example {
public void Foo() {
Book b1 = new Book();
int authorAge = b1.Author.Age;
}
}

当然,你也可以在使用 Book 这个类的实例时再来初始化 Person 这个引用类,如下:

public class Person {
public int Age { get; set; }
}
public class Book {
public Person Author { get; set; }
}
public class Example {
public void Foo() {
Book b1 = new Book();
b1.Author = new Person();
int authorAge = b1.Author.Age;
}
}

情景五 数组为null

int[] numbers = null;
int n = numbers[0];
Person[] people = new Person[5];
people[0].Age = 20
long[][] array = new long[1][];
array[0][0] = 3;

这三种数组的定义均为null,抛出NullReferenceException(未将对象引用到实例)的异常

情景六 数据字典为null

Dictionary<string, int> agesForNames = null;
int age = agesForNames["Bob"];

这里的 agesForNames字典为 null,抛出NullReferenceException(未将对象引用到实例)的异常,使用new关键字来初始化:

Dictionary<string, int> agesForNames = new Dictionary<string, int>();
int age = agesForNames["Bob"];

情景七 集合为null

public class Person {
public string Name { get; set; }
}
var people = new List<Person>();
people.Add(null);
var names = from p in people select p.Name;
string firstName = names.First();

以上代码会在 names.First() 处理抛出异常,因为我们在

people.Add(null);
添加了null值

情景八 事件(Event)为null

public class Demo
{
public event EventHandler StateChanged; protected virtual void OnStateChanged(EventArgs e)
{
StateChanged(this, e);
}
}

如果外部实例没有注册 StateChanged 事件,那么调用 StateChanged(this, e); 会抛出NullReferenceException(未将对象引用到实例),修复方法:

public class Demo
{
public event EventHandler StateChanged; protected virtual void OnStateChanged(EventArgs e)
{
if(StateChanged != null)
{
StateChanged(this, e);
}
}
}

情景九 重复的变量名

如果全局变量和局部变量的名称是一样的,那么你的全局变量就可能永远不会被赋值,如下:

public class Form1 {
private Customer customer; private void Form1_Load(object sender, EventArgs e) {
Customer customer = new Customer();
customer.Name = "John";
} private void Button_Click(object sender, EventArgs e) {
MessageBox.Show(customer.Name);
}
}

请使用不同的变量名称来修复:

private Customer _customer;

情景二 ASP.NET生命周期

public partial class Issues_Edit : System.Web.UI.Page
{
protected TestIssue myIssue; protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 只有页面首次加载时执行,点击按钮时不会被执行
myIssue = new TestIssue();
}
} protected void SaveButton_Click(object sender, EventArgs e)
{
myIssue.Entry = "NullReferenceException here!";
}
}

情景十一 ASP.NET Session的值为null

string firstName = Session["FirstName"].ToString();

如果Session[“FirstName”]没有被赋值,则会抛出NullReferenceException(未将对象引用到实例)的异常。

情景十二 ASP.NET 视图模式为null

// Controller[控制器]
public class Restaurant:Controller
{
public ActionResult Search()
{
return View(); // Forgot the provide a Model here.
}
} // Razor[视图页面]
@foreach (var restaurantSearch in Model.RestaurantSearch) //抛出异常
{
} <p>@Model.somePropertyName</p> <!-- 抛出异常 -->

关于.NET[C#]中NullReferenceException(未将对象引用到实例)总结到这里,如果你遇到在不同的情景遇到同样的异常,欢迎反馈、交流。

 
 

.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?(转)的更多相关文章

  1. P/Invoke出现错误 System.NullReferenceException”类型的未经处理的异常在 未知模块。 中发生 未将对象引用设置到对象的实例。

    问题 “System.NullReferenceException”类型的未经处理的异常在 未知模块. 中发生 未将对象引用设置到对象的实例. 解决方案 1.尝试 用管理员身份运行CMD,输入nets ...

  2. AutoMapper.Mapper.CreateMap报“System.NullReferenceException: 未将对象引用设置到对象的实例。”异常复现

    >>Agenda: >>Ⅰ.国庆假期问题出现 >>Ⅱ.双休日异常再次出现 >>Ⅲ.排障 >>Ⅳ.异常复盘 >>Ⅴ.修复后监测 & ...

  3. 报警提示 System.NullReferenceException:“未将对象引用设置到对象的实例。

    System.NullReferenceException:“未将对象引用设置到对象的实例.是就因为Session在记录到服务器时,没有添加  IRequiresSessionState 所以运行时回 ...

  4. 让<未将对象引用到实例>见鬼去吧!

    未将对象引用到实例,即NullReferenceException异常,我相信这是c#编程中最常见的错误之一,至少我在做项目的过程中,有很多时候都会抛出这个异常.每当这个异常出现的时候,我都会头皮一紧 ...

  5. Asp.Net MVC 5 Razor 视图 未将对象引用到实例

    未将对象引用到实例的错误居然指向了@{Leyout=“..此处略,核实路径无误”}. 最后发现原来是在一个<select .. name="@Model.Category"& ...

  6. 2014-08-26 解决HttpContext.Current.Session在ashx文件中出现“未将对象引用设置到对象的实例”的问题

    今天是在吾索实习的第35天. 最近在使用HttpContext.Current.Session来获取Session["..."]的值时,常常会弹出错误——“未将对象引用设置到对象的 ...

  7. Server.MapPath(string sFilePath) 报未将对象引用到实例异常

    System.Web.HttpContext.Current.Server.MapPath(string sfilePath)将虚拟路径转换成物理路径.这个必须在aspx或者MVC中Action调用才 ...

  8. C# WinForm程序添加引用后调用静态方法时报“Interfaces_Helper.Global”的类型初始值设定项引发异常。---> System.NullReferenceException: 未将对象引用设置到对象的实例。

    出现原因: 因为Global类初始化某个静态变量时没有成功则会抛 System.NullReferenceException 异常,具体代码: public static string connstr ...

  9. silverlight 报 System.NullReferenceException 未将对象引用设置到对象的实例。

    在 Microsoft.Windows.Design.Platform.SilverlightMetadataContext.SilverlightXamlExtensionImplementatio ...

随机推荐

  1. centos7安装elasticsearch

    [root@aaron tools]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zi ...

  2. Codeforces 522D Closest Equals

    题解: 傻逼题 直接从左向右扫描每个点作为右端点 然后单点修改区间查询就行了 另外一种更直观的做法就是$(i,j)$之间产生了$(j-i)$ 于是变成矩形查最大值,kd-tree维护 代码: #inc ...

  3. 一起学爬虫——使用xpath库爬取猫眼电影国内票房榜

    之前分享了一篇使用requests库爬取豆瓣电影250的文章,今天继续分享使用xpath爬取猫眼电影热播口碑榜 XPATH语法 XPATH(XML Path Language)是一门用于从XML文件中 ...

  4. 写给Android开发者的Kotlin入门

    写给Android开发者的Kotlin入门 转 https://www.jianshu.com/p/bb53cba6c8f4 Google在今年的IO大会上宣布,将Android开发的官方语言更换为K ...

  5. 两个排序链表的合并(Easy)

    问题来源:选自leetcode 21:合并两个有序链表 问题描述: 题目给定信息: 给定两个有序链表,把两个链表合并成一个链表,并且合并后的链表依然是有序的.这两个链表中允许有重复元素 问题分析: 设 ...

  6. python学习中遇到的问题

    问题1: ‘unicodeescape’ codec can’t decode bytes in position XXX: trun错误解决方案 http://blog.csdn.net/u0112 ...

  7. 转 InnoDB Error Handling

    14.20.4 InnoDB Error Handling Error handling in InnoDB is not always the same as specified in the SQ ...

  8. sql server2012远程连接用IP登陆进入设置步骤

    第一步:把数据库上要设置的设置好. ↑这步是不是要,我也没弄清楚. 第二部是数据库的配置: 你的电脑图标,右击管理. 以上就是所有步骤. 再次登陆成功.

  9. laravel整合vue 多入口解决

    2018年8月10日23:10:29 其实整合是挺简单,因为laravel本身就准备的挺好了 laravel 版本5.6   注意php cli是web是不一样的 这个需要设置环境变量 ,php需要7 ...

  10. 浏览器保存数据给app读取

    https://www.jianshu.com/p/239bab24d249 https://www.jianshu.com/p/43f8a81dd8ca