程序中非空检查或者类型检查应该放在什么地方合适? 5C

问个问题:调用一个方法传入参数,假如参数不允许为null,所以要对参数进行非空检查,那这个检查放在什么地方合适?放在被调用的方法里还是在调用之前进行检查,或者两个地方都进行检查?

11个回答

主要看个人习惯吧。我感觉还是方法里比较好,因为可能有其他人调用你写的方法而不检查参数。

我写C/C++都是放在函数里面检查
如果在传参进行判断,你每次调用的时候都得判断是否合法,代码冗余而且不整洁
我是这样理解的,传参数时都是认为是合法的,在函数处理的时候,这里是函数内部的模块,需要内部来维护自己的是否接收处理。
其实我们刚开始学一门语言的时候,总想知道一些标准的做法和答案,但实际中,都是自己一路写的过来,最后发现别人代码风格或者一些处理方式比较好
才自己修改过来的。

你永远都不知道调别人接口或别人传过来的参数是否为空,除非接口或所传字段有文字说明“不为空“”,否则你应该总是在你本身代码中做非空判断,当然
不判断也可以,如果你考虑到空会触发异常,你可以对你的代码进行异常捕获或异常抛出,以便发生异常后及时处理

放在方法里面,方法也是一个单独模块,保证方法逻辑的完整性,对于接受过来的数据,得当成陌生的数据去处理,而不是“我知道这个一定不会是空的”就不做判断,楼上有人说了,如果别人使用你的方法,人家不一样会在之前做校验,而且在你很久之后来修改你的代码,你也可能会忘记在调用和方法前先做校验

建议:在方法里检查参数,
1,null 可能也是参数的一种可能,可以有对应的返回;
2,可反馈给调用者信息,或抛错。

肯定是进方法之前做控制比较好,JVM的栈中的栈贞就是一个方法,每次执行一个方法都要消耗一定的资源,所以在进入一个新的方法之前做逻辑判断是最好的选择

hgq0916
奔腾的野马 进方法之前是指调用方法之前,还是在方法体最前面?
接近 2 年之前 回复

按我的理解,放在被调用的方法里面是比较好的,如果程序有多处地方调用你这个方法,难道每一次调用都要做判断吗,何不封装起来放在方法里面,提高方法的可用性,而且也有其他人调用你的方法可能考虑得不周全,没做判断导致程序出错

开发时方法的编写者和调用者可能不是同一个人,要这样想问题,在写方法时,要考虑到别人调用你的方法是否会出现问题,怎么解决,很显然在拿到null值时需要抛出异常,空指针异常不能抛,必须是受检查的异常,可以自定义一个异常
public void test(String s) throws MessageException/*自定义异常*/ {
try {
s.replaceAll("","");
} catch(NullPointerException e) {
//捕获空指针异常,抛出自定义异常
throw new MessageException("s不能为null!");
}
}
,当然,小程序不需要太规范可以直接抛出Exception,比如Class类的forname方法抛出ClassNotFoundException,需要调用者自行处理;
在调用方法时,要把方法当成别人写的,你只知道方法名、参数列表,抛出的异常,返回值类型,以及它的功能,就像使用jdk的方法一样,看得懂它的API一样,那么,这个方法抛出了受检查的异常,调用时需要捕获它,在try中写程序正常运行的分支,在catch中写非正常也就是null时的处理。
最后回到这个问题,方法的参数是否为null未知,这就又多了一方,至少有三个人参与,调用方法的一方如果只想程序往正常分支走,可以在调用方法前进行非空判断。

参数检查还是自己做,一场可以抛给调用者处理

关于这点,你可以多看些jdk的源码,比如下面这段

public final SelectionKey register(Selector sel, int ops,
Object att)
throws ClosedChannelException
{
synchronized (regLock) {
if (!isOpen())
throw new ClosedChannelException();
if ((ops & ~validOps()) != 0)
throw new IllegalArgumentException();
if (blocking)
throw new IllegalBlockingModeException();
SelectionKey k = findKey(sel);
if (k != null) {
k.interestOps(ops);
k.attach(att);
}
.......


jdk有很多类似的代码,在函数开始的时候,会对对象的状态、函数参数进行一些检查,因为这些可能导致业务的异常,所以在函数开始的时候进行检查并适当的抛出异常或者进行其他赋值操作等,用于保证下面的业务正常进行
希望回答能帮到你

共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐