Java方法中初始化问题讨论

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值