1.今天代码中,发现引用参数为null,方法中初始化后,没有返回。方法外使用引用还是null,程序运行报空指针异常。这对该问题,讨论一下为什么会这样?
线上代码:
public DtsParkRecord insertOrUpdateRecord(DtsParkRecord record,ParkRecord parkRecord, int flag,Integer plateColor ,Integer carType) {
if(record == null) { //记录为空,保存,否则更新。
record=new DtsParkRecord(parkRecord,flag,plateColor, carType);
String parkCode = parkRecord.getParkCode();
Park park = getPark(parkCode);
long parkId = 0L;
if(null != park){
parkId = park.getParkId();
}
record.setParkId(parkId);
// 保存发送信息
record.setCreatedtime(new Date());
parkRecordDao.insertSelective(record);
}else {
if(DtsParkRecord.TYPE_MODIFY == flag) {
if(StringUtils.isNotStrTrimNull(record.getExittime())) {
//已出场车辆不允许修改
log.info("{}:已出场车辆不允许修改",record.getParkrecordid());
return null;
}
record=new DtsParkRecord(parkRecord,flag,plateColor, carType);
}else if(DtsParkRecord.TYPE_EXIT == flag){
/*
* 将出场流水id、出场流水号、出场数据源、出场时间更新到数据库
*/
record=new DtsParkRecord(parkRecord,flag,plateColor, carType);
record.setSuccess(DtsParkRecord.FALSE);
updateRecord(record);
}
}
return record;
}
DtsParkRecord record初始化以后,不返回对象。方法外面还是null。
考虑到为什么会出现这样的情况,做了一下测试。同时方法参数不仅是对象,如果是基础数值类型会怎么样?赋值后是否有改变?
/**
* 方法内部初始化局部变量
*/
public class MethodRef2 {
public static void main(String[] args) {
User a = null;
init(a);
if(a != null){
System.out.println(a.toString());
}else{
System.out.println("a 为空!");
}
//System.out.println(a.toString());
//字符串
String name = "jack";
init(name);
System.out.println(name);
int b = 10;
initInt(b);
System.out.println(b);
}
public static void init(String name){
if(name.equals("jack")){
name += "good";
}
}
public static void initInt(int a){
a = 2;
}
public static void init(User a){
if(a == null){
a= new User();
a.setAge(11);
a.setName("jack");
}
}
public static class User{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return this.age+","+this.name;
}
}
}
运行结果
a 为空!
jack
10
原因
方法在执行的时候有栈帧的概念,入栈的时候只是压栈方法参数是传入参数的副本
传入参数的副本。不是传入参数本身。如果是null对象,则参数本身,参数副本指向null对象。对参数副本指向一个新对象,不会影响参数本身。如果他们指向同一个user对象,则副本修改对象,等同于修改参数本身对象。
参考文章
[https://blog.csdn.net/fenglllle/article/details/81389286]