如何避免出现“未将对象引用设置到对象的实例”?

康斯坦汀 2011-09-15 05:25:01
例如我有一个实例,这个实例有可能是NULL的。如果避免出现“未将对象引用设置到对象的实例”异常?

程序中到处都是这样的代码写日志:

MyClass.ClsLogHandler.Info("测试日志!");

而这个ClsLogHandler是一个static类实例,它可能是null的,当它是null时,这句话就会报
“未将对象引用设置到对象的实例”异常,只好如此判断:

方式1:

if (MyClass.ClsLogHandler != null)
MyClass.ClsLogHandler.Info("测试日志!");

方式2:

try{
MyClass.ClsLogHandler.Info("测试日志!");
}
catch {};

但是这两种方式都给调用者增加了负担。他们只想这样:

MyClass.ClsLogHandler.Info("测试日志!");

然后,当MyClass.ClsLogHandler为null时,程序什么都不做,如何做到???






...全文
367 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongxyt2 2011-09-19
  • 打赏
  • 举报
回复
未将对象的实例创建为对象的引用
1、ViewState 对象为Null。
2、DateSet 为空。
3、sql语句或Datebase的原因导致DataReader空。
4、声明字符串变量时未赋空值就应用变量。
5、未用new初始化对象。
6、Session对象为空。
7、对控件赋文本值时,值不存在
8、使用Request.QueryString()时,所获取的对象不存在,或在值为空时未赋初始值
9、使用FindControl时,控件不存在却没有做预处理
10、重复定义造成未将对象引用设置到对象的实例错误
康斯坦汀 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liuloves 的回复:]

可以用Null Object模式来解决.不用判别是否为空直接调用就行了 而且也不会出现错误.
[/Quote]

谢谢,在你回答之前,以这么解决了,看了你的回答才知道这叫Null Object模式啊。
LiuLoves 2011-09-17
  • 打赏
  • 举报
回复
可以用Null Object模式来解决.不用判别是否为空直接调用就行了 而且也不会出现错误.
康斯坦汀 2011-09-15
  • 打赏
  • 举报
回复
5楼的在常规场合可能可以解决,但是需要把所有判断函数都变成static的。
在MEF下可能还是不行,因为MEF没有new实例,它是装进来的,如何判断自身是否已创建?
明天继续研究,MEF带来的难题。
康斯坦汀 2011-09-15
  • 打赏
  • 举报
回复
看来是没说清楚,我是用MEF晚期绑定写的日志服务模块,MyClass.ClsLogHandler就是动态装入的
服务实例,这个服务可能完全不存在. (如异常服务要写日志,它动态加载,某些小程序可能不需要日志)
而当它不存在时,不影响原有代码。而这个MyClass.ClsLogHandler的所有方法是动态加载进来的,
MyClass.ClsLogHandler必须有为空的时候,这是程序需要。

5楼说的有点意思,不过,这样做会不会所有函数都要定义成static成员?否则能判断么?



赳赳老陈 2011-09-15
  • 打赏
  • 举报
回复
晕倒 你就不能另外封装一个方法给调用者,然后在这个方法内部处理一下???

public static void Log(string msg)
{
if (MyClass.ClsLogHandler != null)
MyClass.ClsLogHandler.Info(msg);
}
  • 打赏
  • 举报
回复
代码异常是不可消除的,要不然干嘛还有异常处理机制,如果你不判断,又怎么能防止异常的发生哪
  • 打赏
  • 举报
回复
MyClass.ClsLogHandler类里定义一个静态私有成员,在info方法中判断为空直接return退出方法

public class Singleton
{
private static Singleton m_instance = null;

private Singleton()
{
}
public static Singleton getInstance()
{
if(m_instance==null)
{
m_instance=new Singleton();
}
return m_instance;
}
}
gomoku 2011-09-15
  • 打赏
  • 举报
回复
保证MyClass.ClsLogHandler不为空,不就解决问题了?
心灵彩虹 2011-09-15
  • 打赏
  • 举报
回复
try{
MyClass.ClsLogHandler.Info("测试日志!");
}
catch {
return;
};

小童 2011-09-15
  • 打赏
  • 举报
回复
看下你ClsLogHandler怎么写得
gong_chen 2011-09-15
  • 打赏
  • 举报
回复
把判断封装到方法内部
if (MyClass.ClsLogHandler != null)
MyClass.ClsLogHandler.Info("测试日志!");

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧