nullreferenceexception,Java程序员面试中容易被问哪些问题

伏羲号

nullreferenceexception,Java程序员面试中容易被问哪些问题?

不请自来

nullreferenceexception,Java程序员面试中容易被问哪些问题

面试总结——Java高级工程师

面试前面也总结了一和二, 这第三篇可能更偏向于是内心的独白篇和面试技巧总结吧.....

一、独白

之前也面试别人,现在轮到自己找工作,怎么说呢,每个面试官的看法不一样,面试的方式就不一样,比如我面试别人我喜欢问项目中他用到了那些,然后针对用到的技术去问一些问题,或者说对于某些场景的一些技术实现方案是我特别喜欢问的,比如当你的接口服务数据被人截包了,你如何防止数据恶意提交? 相对来说,Java的底层和基础会问的少一点,当然问的少不是代表不问,而是说侧重点在于你的所做过的项目和你的设计思路如何。当然,懂基础和底层更好,这样能让你知其然,更知其所以然,写出来的代码和程序更具有健壮性和可维护性。所以说,基础还是很重要的。

现在轮到自己出去面试,怎么说呢,其实还是挺紧张的,原以为自己不会因此紧张或者焦虑,实际上,还是有的,在没找到合适的工作的时候,甚至晚上有点睡不着觉,总觉着有什么事压在心头,睡觉都不安心。既然睡不着,那还是看看资料吧,我有个习惯,睡前看点问题,第二天早上就能想到答案,睡前记点资料,第二天早上就能记得特别深刻,不说废话了,直接进入正题吧。

二、面试技巧

1、背熟你的简历

原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目、技术都无法描述清楚的话,我想没有哪家公司会接受这样的,哪怕你是超级人才,你自我表述不行,估计也会为此头疼,所以,切记:一定要背好自己的简历,不要求你能全部记下,至少要熟记你最近所待过的两家公司,这两家公司里面你做过的项目,你负责的模块,项目里面用到的技术以及相对应的技术实现方案(这个尤为重要)。

2、深入了解并熟记部分Java基础知识

原因:大部分公司无论面试初级还是高级,无论是笔试还是面试,都会问到一系列基础题,这些基础题大概涵括jvm、字符串、集合、线程等等,如果说每一个让你死记硬背你肯定记不住,那么就是理解中记忆了,拿jvm来说 ,如果让你谈谈你对jvm的理解, 那么你首先得知道JVM有哪些结构组成,每个结构用来做什么的,然后考虑一个Java对象从创建到回收,如何途径JVM这些结构的。如果你从这些方面来综合记忆,相信事半功倍,并且你理解的更透彻。 至于如果让你谈集合,举例List集合下面ArryList、LinkedList、Vector等集合的区别,那么同样的方法,你需要理解每一个的结构组成是什么,你才能知道他有什么作用,这样你在平时的用法上会更精炼,而且在面试过程中,也不至于哑口无言。

3、保持自信心和沉重冷静的心态

原因:面试过程中,自信是少不了的,相信你可以, 面试的路上可以自己对自己说一句: I belive I can ! 反正我就是这么做的,自我的心里暗示吧,其实面对面试官的时候,你自信的状态也会让面试官觉得你是个很有底气的人,至少从感觉上会给你打个高分。另外还有就是保持沉重冷静,如果是让你提供技术方案或者说说某个技术原理,没必要一紧张一咕噜的什么都说,你可以对面试官说:我先想想,然后自己组装记忆中的知识,组装下语言,有条理的说出来,这样能更好的表现你的才能,不是吗? 面试谁都会紧张,我也会紧张,有时候明明记得的知识点忘了,没关系,大胆的说忘了,或者直接说不知道。 要记住,有部分不知道没关系,如果全都知道,那你应该是CTO级别了(开个玩笑)。

4、尽量记住面试过程中你回答不出来或者回答存在不妥的问题

原因:面试失败了没关系,毕竟每个公司的要求不一样,问的问题和你擅长的方面可能有所出入,但是请记住一点:面试过程中那些你回答不出来问题,或者你自己感觉回答不太准确的问题,自己记下来,如果不会的,你可以当场问问面试官有没有好的解答,如果面试官不愿意告诉你(一般是基础方面面试官就懒得答你),那么你就自己回家慢慢查资料,如果是某些特定的技术,也可以自己写写案例什么的,毕竟知识点就那么多,问题百变,原理不变,面试也是一个学习知识的过程,让你了解大部分公司目前需要或者要求的技术。这次不知道,下次就知道了

5、去面试之前,最好先了解你要去面试公司的情况(包括产品、项目情况)

原因:俗话说,知己知彼,百战不殆,面试就是一场战斗,你需要了解你面试公司基本情况,包括岗位要求,这样你就能大概知道你需要面试的这家公司的技术要求情况。 为何让你去了解这家公司的主营产品和项目呢,就是让你大概了解这家公司的一个技术架构的情况,包括你可能对他们的一种实现方式提出质疑和疑惑,相信面试官很愿意帮你解答这些问题的。这样你既图了表现,也学到了知识,何乐而不为。

6、合理安排你的面试时间(如果有多家公司的面试机会,尽量把你想去的公司放到最后去面试)

原因:估计很多人都不理解这个,可能大部分的人对于如何安排面试时间比较迷茫,随意安排。可是这里有个技巧,如果同时有多个面试机会,你把你最想去的公司放到最末尾去面试,这样你经历过了前面的这些公司筛选,如果成功了是个机会,如果没成功,也是为最后做铺垫。 不过这里就需要考虑两点:1、你需要记住你投简历的公司和基本情况(这说明你不是海投的) 2、如果记不住,那么可以先应答一个时间,后续了解公司信息之后,通过邮件或者其他方式与其约定,调整面试时间。而且建议安排一天的面试公司不要超过两家,最好的是上午一家,下午一家,这样你能有充足的时间调整状态。

三、面试题基础总结

1、 JVM结构原理、GC工作机制详解

答:具体参照:JVM结构、GC工作机制详解,说到GC,记住两点:1、GC是负责回收所有无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,2、GC回收机制的两种算法,a、引用计数法 b、可达性分析算法( 这里的可达性,大家可以看基础2 Java对象的什么周期),至于更详细的GC算法介绍,大家可以参考:Java GC机制算法

2、Java对象的生命周期

答:创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等,具体参照:Java 对象的生命周期

3、Map或者HashMap的存储原理

答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理

4、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)

答:看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果

5、数据库存储日期格式时,如何考虑时区转换问题?

答:使用TimeStamp , 原因参照:Java编程中遇到的时区转换问题

6、JavaObject类中有哪些方法?

答:Object有哪些方法

7、HTTP协议,GET和POST 的区别

答:浅谈HTTP中GET和POST的区别

四、线程、设计模式、缓存方面

1、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢

答:关于SimpleDateFormat安全的时间格式化线程安全问题

2、如何看待设计模式,并简单说说你对观察者模式的理解

答:1、设计模式有神马用2、观察者模式类图及实现

3、集群环境中,session如何实现共享

答:1、Java集群之session共享2、session多服务器共享方案,还有一种方案就是使用一个固定的服务器专门保持session,其他服务器共享

4、分布式、集群环境中,缓存如何刷新,如何保持同步?

答:A、缓存如何刷新?1、定时刷新 2、主动刷新覆盖,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可

B、缓存如何保持同步? 这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:Ehcache分布式缓存同步

5、一条sql执行过长的时间,你如何优化,从哪些方面?

答:1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)

2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合

3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度

4、针对数量大的表进行历史表分离(如交易流水表)

5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,MySQL有自带的binlog实现 主从同步

6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等

7、查看mysql执行日志,看看是否有其他方面的问题

个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑

五、设计方案相关

面试还会问到一些关于设计方案相关的问题,比如

1、你的接口服务数据被人截包了,你如何防止数据恶意提交?

答:我们可以在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即使数据被抓包了,对方也无法区分每个字段你的含义,这时,这个业务编号的作用就来了

2、假设服务器经常宕机,你从哪些方面去排查问题?

答:这个就留个各位看官补充了,可评论回复

总而言之该看的还是得看,还学的还是得学。再次强调,基础很重要!面试技巧同样很重要,还是那句话:祝愿各位看官都能找到心仪的工作吧~~

另外,奉劝大家不要频繁跳槽,这些知识点能提升固然好,不要盲目跳槽,找工作很累的,而且没有哪家公司喜欢频繁跳槽的员工

Java程序猿跳槽应该学哪些方面的技术

互联网产品、大型企业级项目常会用到的:

并发处理技术。具体到Java上通常是涉及java.util.concurrent、并发锁机制、NIO等方面,当然最近比较火爆的Netty框架也可以作为高并发处理的备选方案之一,这需要对Java的线程调度机制有着比较深的理解。不过这些可能会涉及并发控制的对象(比如reentrantlock等)只能存在于一个JVM里的问题,一旦系统规模大到需要部署多个JVM来处理并发的情况,则需要采用共享session的技术(比如spring-session),或者尽可能将系统后台设计为无状态的服务,这需要对RESTful有着较深的理解。

高可用、负载均衡技术。互联网产品、企业级应用通常要求一年里的Downtime控制在很小的范围内,这需要足够的高可用和负载均衡架构来支撑,这个一般和Java技术本身没太大关系,但却是一名初级程序员向高级程序员甚至是架构师CIO进阶的必备技术,因此可以适当了解一下Nginx、HAProxy等对这方面的支持。另外现在最“时髦”的做法是将应用docker化,配合ETCD、kubernetes等工具在容器的层面上实现高可用和负载均衡,当然这需要看实际的需求,最时髦的不见得是最适用的,要考虑构建成本。

缓存技术。缓存应该是大型系统中或高并发条件下提高响应速度的亘古不变的真理(虽然也看到过淘宝搜索商品功能采用的大数据处理技术实现的零缓存的文章,但能达到淘宝的体量和技术水平一般不太可能),群号:468897908高级架构群 备注好信息!这方面的工具太多了,ehcache、memcached、redis……从Java的角度来讲,需要了解的一是Java对这些工具的连接器,二是缓存技术背后的JSR-107标准,可以参考spring-cache的实现,阅读一下源码加深理解。

异步处理技术。这通常也是抵消高并发的处理手段之一,从Java的角度看最简单的异步处理就是新启动一个异步线程,这同样也需要对Java的线程调度有所了解,当然也可使用Spring中的@Async之类的也可以简单实现异步线程的处理。如果是非常消耗资源的业务处理,简单的异步线程是满足不了需求的,这就需要一些消息中间件来做这些异步处理了,消息中间件有很多,activemq、rabbitmq、kafka……需要了解的是Java对这些中间件的连接器。不过异步处理中最关键的是事务保证的问题,这可能需要对事务的两步提交有所了解。

在这里我有一个专门为跳槽JAVA开发人员想要跳槽准备的一个线路图:

一共分为5大专题:

工程化专题:

源码分析:

分布式/高可用/高并发专题:

双十一架构:

性能优化:

如何彻底理解volatile关键字?

从几道相关面试题说起吧,volatile 常被这么问:

谈谈你对 volatile 的理解?

你知道 volatile 底层的实现机制吗?

volatile 变量和 atomic 变量有什么不同?

volatile 的使用场景,你能举两个例子吗?

我们知道Java 内存模型——JMM, JMM是围绕着并发过程中如何处理可见性、原子性和有序性这 3 个 特征建立起来的,而 volatile 可以保证其中的两个特性,下面具体探讨下这个面试必问的关键字。

1. 概念

volatile 是 Java 中的关键字,是一个变量修饰符,用来修饰会被不同线程访问和修改的变量。

2. Java 内存模型 3 个特性

2.1 可见性

可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。

可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。

在 Java 中 volatile、synchronized 和 final 都可以实现可见性。

2.2 原子性

原子性指的是某个线程正在执行某个操作时,中间不可以被加塞或分割,要么整体成功,要么整体失败。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作是原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。Java的 concurrent 包下提供了一些原子类,AtomicInteger、AtomicLong、AtomicReference等。

在 Java 中 synchronized 和在 lock、unlock 中操作保证原子性。

2.3 有序性

Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行。

3. volatile 是 Java 虚拟机提供的轻量级的同步机制

保证可见性

不保证原子性

禁止指令重排(保证有序性)

3.1 空说无凭,代码验证

3.1.1 可见性验证

class MyData {

int number = 0;

public void add() {

this.number = number + 1;

}

}

// 启动两个线程,一个work线程,一个main线程,work线程修改number值后,查看main线程的number

private static void testVolatile() {

MyData myData = new MyData();

new Thread(() -> {

System.out.println(Thread.currentThread().getName()+"\t come in");

try {

TimeUnit.SECONDS.sleep(2);

myData.add();

System.out.println(Thread.currentThread().getName()+"\t update number value :"+myData.number);

} catch (InterruptedException e) {

e.printStackTrace();

}

}, "workThread").start();

//第2个线程,main线程

while (myData.number == 0){

//main线程还在找0

}

System.out.println(Thread.currentThread().getName()+"\t mission is over");

System.out.println(Thread.currentThread().getName()+"\t mission is over,main get number is:"+myData.number);

}

}

运行 方法,输出如下,会发现在 main 线程死循环,说明 main 线程的值一直是 0

workThread execute

workThread update number value :1

修改 ,,在 number 前加关键字 volatile,重新运行,main 线程获取结果为 1

workThread execute

workThread update number value :1

main execute over,main get number is:1

3.1.2 不保证原子性验证

class MyData {

volatile int number = 0;

public void add() {

this.number = number + 1;

}

}

private static void testAtomic() throws InterruptedException {

MyData myData = new MyData();

for (int i = 0; i < 10; i++) {

new Thread(() ->{

for (int j = 0; j < 1000; j++) {

myData.addPlusPlus();

}

},"addPlusThread:"+ i).start();

}

//等待上边20个线程结束后(预计5秒肯定结束了),在main线程中获取最后的number

TimeUnit.SECONDS.sleep(5);

while (Thread.activeCount() > 2){

Thread.yield();

}

System.out.println("final value:"+myData.number);

}

运行 发现最后的输出值,并不一定是期望的值 10000,往往是比 10000 小的数值。

final value:9856

为什么会这样呢,因为 在转化为字节码指令的时候是4条指令

获取原始值

将值入栈

进行加 1 操作

把 后的操作写回主内存

这样在运行时候就会存在多线程竞争问题,可能会出现了丢失写值的情况。

如何解决原子性问题呢?

加 或者直接使用 原子类。

3.1.3 禁止指令重排验证

计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排,一般分为以下 3 种

处理器在进行重排序时必须要考虑指令之间的数据依赖性,我们叫做 语义

单线程环境里确保程序最终执行结果和代码顺序执行的结果一致;但是多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。

我们往往用下面的代码验证 volatile 禁止指令重排,如果多线程环境下,`最后的输出结果不一定是我们想象到的 2,这时就要把两个变量都设置为 volatile。

public class ReSortSeqDemo {

int a = 0;

boolean flag = false;

public void mehtod1(){

a = 1;

flag = true;

}

public void method2(){

if(flag){

a = a +1;

System.out.println("reorder value: "+a);

}

}

}

实现禁止指令重排优化,从而避免了多线程环境下程序出现乱序执行的现象。

还有一个我们最常见的多线程环境中 版本的单例模式中,就是使用了 volatile 禁止指令重排的特性。

public class Singleton {

private static volatile Singleton instance;

private Singleton(){}

// DCL

public static Singleton getInstance(){

if(instance ==null){ //第一次检查

synchronized (Singleton.class){

if(instance == null){ //第二次检查

instance = new Singleton();

}

}

}

return instance;

}

}

因为有指令重排序的存在,双端检索机制也不一定是线程安全的。

why ?

Because: 初始化对象的过程其实并不是一个原子的操作,它会分为三部分执行,

给 instance 分配内存调用 instance 的构造函数来初始化对象将 instance 对象指向分配的内存空间(执行完这步 instance 就为非 null 了)

步骤 2 和 3 不存在数据依赖关系,如果虚拟机存在指令重排序优化,则步骤 2和 3 的顺序是无法确定的。如果A线程率先进入同步代码块并先执行了 3 而没有执行 2,此时因为 instance 已经非 null。这时候线程 B 在第一次检查的时候,会发现 instance 已经是 非null 了,就将其返回使用,但是此时 instance 实际上还未初始化,自然就会出错。所以我们要限制实例对象的指令重排,用 volatile 修饰(JDK 5 之前使用了 volatile 的双检锁是有问题的)。

4. 原理

volatile 可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在 JVM 底层是基于内存屏障实现的。

当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到 CPU 缓存中。如果计算机有多个CPU,每个线程可能在不同的 CPU 上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步,所以就不会有可见性问题对 volatile 变量进行写操作时,会在写操作后加一条 store 屏障指令,将工作内存中的共享变量刷新回主内存;对 volatile 变量进行读操作时,会在写操作后加一条 load 屏障指令,从主内存中读取共享变量;

通过 hsdis 工具获取 JIT 编译器生成的汇编指令来看看对 volatile 进行写操作CPU会做什么事情,还是用上边的单例模式,可以看到

PS:具体的汇编指令对我这个 Javaer 太南了,但是 JVM 字节码我们可以认识, 的含义是给一个静态变量设置值,那这里的 ,而且是第 17 行代码,更加确定是给 instance 赋值了。果然像各种资料里说的,找到了 据说还得翻阅。这里可以看下这两篇 https://www.jianshu.com/p/6ab7c3db13c3 、 https://www.cnblogs.com/xrq730/p/7048693.html )

有 volatile 修饰的共享变量进行写操作时会多出第二行汇编代码,该句代码的意思是对原值加零,其中相加指令addl前有 lock 修饰。通过查IA-32架构软件开发者手册可知,lock前缀的指令在多核处理器下会引发两件事情:

将当前处理器缓存行的数据写回到系统内存

这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效

正是 lock 实现了 volatile 的「防止指令重排」「内存可见」的特性

5. 使用场景

您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

对变量的写操作不依赖于当前值

该变量没有包含在具有其他变量的不变式中

其实就是在需要保证原子性的场景,不要使用 volatile。

6. volatile 性能

volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。

引用《正确使用 volaitle 变量》一文中的话:

很难做出准确、全面的评价,例如 “X 总是比 Y 快”,尤其是对 JVM 内在的操作而言。(例如,某些情况下 JVM 也许能够完全删除锁机制,这使得我们难以抽象地比较 和 的开销。)就是说,在目前大多数的处理器架构上,volatile 读操作开销非常低 —— 几乎和非 volatile 读操作一样。而 volatile 写操作的开销要比非 volatile 写操作多很多,因为要保证可见性需要实现内存界定(Memory Fence),即便如此,volatile 的总开销仍然要比锁获取低。

volatile 操作不会像锁一样造成阻塞,因此,在能够安全使用 volatile 的情况下,volatile 可以提供一些优于锁的可伸缩特性。如果读操作的次数要远远超过写操作,与锁相比,volatile 变量通常能够减少同步的性能开销。

参考

《深入理解Java虚拟机》

http://tutorials.jenkov.com/java-concurrency/java-memory-model.html https://juejin.im/post/5dbfa0aa51882538ce1a4ebc

《正确使用 Volatile 变量》

https://www.ibm.com/developerworks/cn/java/j-jtp06197.htm

l

正版的七日杀创完角色就跳出控制台出现null?

a7.5的解决方法是:进入游戏之后选择【游戏选项】再选【玩家】替换掉之前选择的角色后,再读取游戏或重新开始就没问题了。如果有高版本的话,最好先删除干净,然后重新安装或拷贝免安装a7.5再做以上操作。

js有哪些内置对象?

JavaScript 中对象通常包括两种类型:内置对象和浏览器对象,此外用户还可以自定义对象。在 ECMAScript 中,更精确的定义应该分为:本地对象、内置对象和宿主对象。

JavaScript常见内置对象:

String对象:字符串对象,提供了对字符串进行操作的属性和方法。

Array对象:数组对象,提供了数组操作方面的属性和方法。

Date对象:日期时间对象,可以获取系统的日期时间信息。

Boolean对象:布尔对象,一个布尔变量就是一个布尔对象。(没有可用的属性和方法)

Number对象:数值对象。一个数值变量就是一个数值对象。

Math对象:数学对象,提供了数学运算方面的属性和方法。

Object对象、RegExp对象、 Global对象、Function对象。

对象包含两个要素:

1、用来描述对象特性的一组数据,也就是若干变量,通常称为属性。

2、用来操作对象特性的若干动作,也就是若干函数,通常称为方法。

内置对象都有自己的属性和方法,访问方法如下:

对象名.属性名称

对象名.方法名称

systemnullreferenceexception怎么解决?

System.NullReferenceException 是一种常见的运行时错误,通常表示代码尝试访问空引用或已释放的对象。为了解决该错误,我们需要检查代码并尽可能避免空引用。以下是一些建议:

1. 检查空引用,使用适当的条件语句来避免访问空对象。

2. 使用变量前检查它是否为 null,或使用 C# 6.0 中的空合并运算符。

3. 确保在使用包含 null 引用的对象之前,对其进行初始化。

4. 仔细检查代码,以确保已正确地释放资源和对象。

5. 使用 Visual Studio 的调试器或打印语句来跟踪错误源。

6. 识别 NullReferenceException 的发生位置并针对该问题编写测试用例,以便在测试阶段捕获该错误。

通过遵循这些建议,我们可以降低发生 System.NullReferenceException 错误的概率,并更快地发现和解决这些错误。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,94人围观)

还没有评论,来说两句吧...