返回顶部
首页 > 资讯 > 精选 >C#访问null字段会抛异常的原因是什么
  • 714
分享到

C#访问null字段会抛异常的原因是什么

2023-07-02 14:07:50 714人浏览 安东尼
摘要

这篇文章主要介绍“C#访问null字段会抛异常的原因是什么”,在日常操作中,相信很多人在C#访问null字段会抛异常的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#访问null字段会抛异常的原因

这篇文章主要介绍“C#访问null字段会抛异常的原因是什么”,在日常操作中,相信很多人在C#访问null字段会抛异常的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#访问null字段会抛异常的原因是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一:举例说明 

namespace ConsoleApp2{    internal class Program    {        static Person person = null;         static void Main(string[] args)        {            var age = person.age;             Console.WriteLine(age);        }    }     public class Person    {        public int age;    }}

由于 person 是一个 null 对象,很显然这段代码会抛异常,那为什么会抛异常呢?要想找原因,需要从最底层的汇编研究起。

二:异常原理分析

从汇编上寻找答案

可以使用 Visual Studio 2022 的反汇编窗口,观察 var age = person.age; 处到底生成了什么。

----------------  var age = person.age;   ----------------
 
081D6154  mov         ecx,dWord ptr ds:[4C41F4Ch]  
081D615A  mov         ecx,dword ptr [ecx+4]  
081D615D  mov         dword ptr [ebp-3Ch],ecx  

这三句汇编还是很好理解的,4C41F4Ch 存放的是 person 对象, ecx+4 是取 person.age,最后一句就是将 age 放在 ebp-3Ch 栈位置上,接下来我们来看下 null 时的 ecx 到底是多少,截图如下:

C#访问null字段会抛异常的原因是什么

从图中可以看到,此时的 ecx=0000000,如果大家了解 windows 的虚拟内存布局,应该知道在虚拟内存的 0~0x0000ffff 范围内是属于 null 禁入区,凡是落在这个区一概属访问违例,画个图就像下面这样。

C#访问null字段会抛异常的原因是什么

到这里原理就搞清楚了,因为 [ecx+4] = [4] 是落在这个 null 区所致, 但是。。。。 大家有没有发现一个问题,对,就是这里的 [ecx+4],因为这里有一个 +4 偏移来取 age 字段,那我能不能在 person 中多定义一些字段,然后取最后一个字段从而从 null 区 冲出去。。。哈哈。

真的可以冲出 null 区吗

有了这个想法之后,我决定在 Person 类中定义 10w 个 age 字段,参考代码如下:

namespace ConsoleApp2{    internal class Program    {        static Person person = null;         static void Main(string[] args)        {            var str = @"public class Person                        {                            {0}                        }";             var lines = Enumerable.Range(0, 100000).Select(m => $"public int age{m};");             var fields = string.Join("\n", lines);             var txt = str.Replace("{0}", fields);             File.WriteAllText("Person.cs", txt);             Console.WriteLine("person.cs 生成完毕");        }    }}

代码执行后,Person.cs 就会如期生成,接下来读取 person.age99999 看看有没有奇迹发生,参考代码如下:

    internal class Program    {        static Person person = null;         static void Main(string[] args)        {            var age = person.age99999;             Console.WriteLine(age);        }    }

C#访问null字段会抛异常的原因是什么

我去,万万没想到,把 ClassLoader 给弄崩了。。。。得,那只能改 20000 个 age 试试看吧,参考代码如下:

    internal class Program    {        static Person person = null;         static void Main(string[] args)        {            var age = person.age19999;             Console.WriteLine(age);        }    }

接下来我们将断点放在 var age = person.age19999; 上继续看反汇编代码。

------------- var age = person.age19999;  -------------
0804657E  mov         ecx,dword ptr ds:[49F1F4Ch]  
08046584  mov         dword ptr [ebp-40h],ecx  
08046587  mov         ecx,dword ptr [ebp-40h]  
0804658A  cmp         dword ptr [ecx],ecx  
0804658C  mov         ecx,dword ptr [ebp-40h]  
0804658F  mov         ecx,dword ptr [ecx+13880h]  
08046595  mov         dword ptr [ebp-3Ch],ecx  

从上面的汇编代码可以看出几点信息。

  • 汇编代码行数多了。

  • ecx+13880h 冲出了 null 区(FFFF) 的边界。

接下来单步调试汇编,发现在 cmp dword ptr [ecx],ecx 处抛了异常。。。

C#访问null字段会抛异常的原因是什么

大家都知道此时的 ecx 的地址是 0 ,从 ecx 上取内容肯定会抛访问违例,而且这段代码很诡异,一般来说 cmp 之后都是类似 jz,jnz 跳转指令,而它仅仅是个半残之句。。。

从这些特征看,这是 JIT 故意在取偏移之前尝试判断 ecx 是不是 null,动机不纯哈。

到此,关于“C#访问null字段会抛异常的原因是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C#访问null字段会抛异常的原因是什么

本文链接: https://lsjlt.com/news/342388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#访问null字段会抛异常的原因是什么
    这篇文章主要介绍“C#访问null字段会抛异常的原因是什么”,在日常操作中,相信很多人在C#访问null字段会抛异常的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#访问null字段会抛异常的原因...
    99+
    2023-07-02
  • 探究C#访问null字段会抛异常原因
    目录一:举例说明 二:异常原理分析三:总结一:举例说明  namespace ConsoleApp2 { internal class Program ...
    99+
    2024-04-02
  • mysql中怎么避免使用null定义字段的原因是什么
    本篇文章给大家分享的是有关mysql中怎么避免使用null定义字段的原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一 NULL 为什么这么经常用(1) java的nu...
    99+
    2023-06-20
  • 空指针异常的原因是什么
    空指针异常的原因有:1、未初始化引用,在使用该引用前没有对其进行初始化操作,就会抛出空指针异常;2、对象未被正确实例化,如果对象没有被正确实例化,尝试访问其成员也会导致空指针异常;3、引用被显示赋值为null,在这种情况下试图访问该引用的成...
    99+
    2023-12-14
    空指针异常
  • C++读取访问权限冲突引发异常问题的原因分析
    用C++写代码时经常会遇到“引发了异常: 读取访问权限冲突。”这样的错误提示,这种情况产生原因主要有两点: 一、访问数组越界 当采用线性表的顺序结构,例如顺序表、队列、栈等,用数组存...
    99+
    2024-04-02
  • Tomcat运行一段时间后访问变慢的原因是什么
    Tomcat运行一段时间后访问变慢的原因可能有以下几点: 内存泄漏:Tomcat运行一段时间后,可能会出现内存泄漏的情况,导致内...
    99+
    2023-10-23
    Tomcat
  • Oracle中JOB异常中断的原因是什么
    今天就跟大家聊聊有关Oracle中JOB异常中断的原因是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JOB 信息:参数:BROKEN &nbs...
    99+
    2024-04-02
  • 上海VPS无法访问的原因是什么
    上海VPS无法访问的原因:1、上海VPS机房遭受恶意攻击导致整体服务器出现故障造成无法访问;2、上海VPS母服务器上其他主机被攻击,从而牵连自身VPS无法正常访问;3、上海VPS用户使用防火墙不当导致无法访问;4、上海VPS被黑客入侵导致无...
    99+
    2024-04-02
  • C++ 技术中的异常处理:抛出异常的最佳时机和方法是什么?
    异常处理用于处理 c++++ 中不可恢复的错误。最佳抛出时机是:内存分配失败;文件操作失败;数据库连接失败;参数无效。c++ 提供了多种抛出异常的方法:throw 表达式、throw 异...
    99+
    2024-05-09
    c++ 异常处理
  • dubbo将异常转换成RuntimeException的原因是什么
    本篇内容主要讲解“dubbo将异常转换成RuntimeException的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“dubbo将异常转换成RuntimeException的原因是什...
    99+
    2023-07-05
  • 常见IIS无法访问PHP的原因及解决方法是什么
    这篇文章主要讲解了“常见IIS无法访问PHP的原因及解决方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“常见IIS无法访问PHP的原因及解决方法是什么”吧!错误的PHP设置如果你的I...
    99+
    2023-07-05
  • 网站服务器访问慢的原因是什么
    网站服务器访问慢的原因可能有多种,以下是一些常见的原因: 服务器负载过高:服务器上运行的应用程序或网站访问量过大,超出服务器的处...
    99+
    2024-05-06
    服务器
  • 计算机中无法访问d:\ 拒绝访问的原因是什么
    这篇文章主要介绍计算机中无法访问d:\ 拒绝访问的原因是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本地磁盘D的属性设置不正确造成的,解决方法为:首先右击盘符,选择“属性”,在弹出的窗口中选择“安全”-“高级”...
    99+
    2023-06-15
  • 香港服务器访问速度快的原因是什么
    香港服务器访问速度快的原因可能有以下几点: 1.地理位置优势:香港地处亚洲中心,毗邻中国大陆和东南亚等发达地区,便于连接全球各地的网...
    99+
    2024-04-12
    香港服务器 服务器
  • 海外服务器网站访问慢的原因是什么
    海外服务器网站访问慢的原因可能有多种,包括以下几个方面: 网络延迟:跨国网络传输会导致较高的延迟,包括数据传输、路由转发等都可能...
    99+
    2024-04-02
  • php反向代理不能访问的常见原因和解决方法是什么
    这篇“php反向代理不能访问的常见原因和解决方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php反向代理不能访问的...
    99+
    2023-07-05
  • Spring访问数据库异常的处理方法是什么
    Spring访问数据库异常的处理方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用JDBC API时,很多操作都要声明抛出java.sql.SQLExceptio...
    99+
    2023-06-17
  • Spring Boot集成Druid出现异常报错的原因是什么
    这篇文章主要介绍Spring Boot集成Druid出现异常报错的原因是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Spring Boot集成Druid异常在Spring Boot集成Druid项目中,发现错误...
    99+
    2023-06-15
  • C++ 技术中的异常处理:异常处理的好处和原则是什么?
    c++++ 中的异常处理可增强代码健壮性、可读性、可维护性以及错误传播能力。原则包括:保证异常安全、及时处理、正确处理和避免滥用。实战案例中,try-catch 块用于捕获除数为零的异常...
    99+
    2024-05-09
    c++ 异常处理
  • github页面无法访问的原因是什么及怎么解决
    今天小编给大家分享一下github页面无法访问的原因是什么及怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。DNS解析...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作