Integer封包解包的问题

Integer封包解包问题

问题背景

今天在写一个判断语句的时候,突然出现了一个空指针异常,其伪代码如下所示

//实体类
@Data
public class DemoBean{
private Integer demoType;
private String name;
}
--------------------------------
//业务类1 DemoService1.class
...
DemoBean demoBean=demoService.getDemoBean();
demoService2.saveData(demoBean==null?"":demoBean.getName(),demoBean==null?0:demoBean.getDemoType());

...
----------------------------------
//业务类2:DemoService2.class
public void saveData(String name,Integer demoType){
//处理业务
...
}

问题发现

乍一看上述的代码似乎没有什么问题(忽略参数繁琐以及其他问题,这里只是为了展示空指针产生的原因),如果demoBean里面的字段都有值的话,上面的代码没有任何问题。但是如果demoBean的结构是如下代码所示

demoBean={"name":"哈哈哈","beanType:null}

猜测一下会产生什么问题?会产生空指针,是不是一脸懵,看代码判断没问题怎么就会产生空指针了。。。。

原因分析

我们只是看源代码估计是不好理解,但是如果把编译之后的class文件反编译再去看的话估计就很好理解了,下面代码是反编译之后的结果

this.demoService2.saveData((demoBean==null)?"":demoBean.getName(),Integer.valueOf((demoBean==null)?0:demoBean.getDemoType().intValue()));

那么为什么会产生空指针就显而易见了,修改方法就是把0用包装类包装一下:

Integer.valueOf(0);

注:本文所用java版本为jdk1.8-0_301,其他编译版本未尝试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void CPackDlg::OnBtnPack() { // TODO: Add your control notification handler code here CFileDialog savedlg(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"(类型:*.free)|*.free||"); if (IDOK != savedlg.DoModal()) return; int nTimeBegin = time(NULL); int nMiliTimeBegin = timeGetTime(); CString strPathName = savedlg.GetPathName(); CString strExt = savedlg.GetFileExt(); if (strExt!="free") strPathName+=".free"; int nFileNum = m_listFile.GetCount(); m_progress.SetRange(0,nFileNum); FILE* pFilePack = fopen(strPathName.GetBuffer(0),"wb"); if(!pFilePack) return; int nNumWrite = fwrite(&nFileNum;,sizeof(int),1,pFilePack); for (int i=0;i<nFileNum;i++) { CString str; m_listFile.GetText(i,str); int nFileNameLen = str.GetLength(); fwrite(&nFileNameLen;,sizeof(int),1,pFilePack); fwrite(str.GetBuffer(0),1,nFileNameLen,pFilePack); FILE* pFileOri = fopen(str.GetBuffer(0),"rb"); if (!pFileOri) { char buf[256]; sprintf(buf,"文件:\"%s\"不存在,打包失败!",str.GetBuffer(0)); fclose(pFilePack); MessageBox(buf); return; } fseek(pFileOri,0,SEEK_END); int nFileSize = ftell(pFileOri); fwrite(&nFileSize;,1,sizeof(int),pFilePack); fseek(pFileOri,0,SEEK_SET); // //方法一:这种方法效率比较低 // while(nFileSize-->0) // { // char c; // fread(&c,1,1,pFileOri); // fwrite(&c,1,1,pFilePack); // } //方法二:这种方法效率比较高 char *pBuf = new char[nFileSize]; fread(pBuf,1,nFileSize,pFileOri); fwrite(pBuf,1,nFileSize,pFilePack); delete []pBuf; m_progress.SetPos(i+1); fclose(pFileOri); } fclose(pFilePack); int nTimeEnd = time(NULL); int nMiliTimeEnd = timeGetTime(); char bufTime[128] = ""; char bufMiliTime[128] = ""; sprintf(bufTime,"打包用时:%d秒",nTimeEnd-nTimeBegin); sprintf(bufMiliTime,"打包用时:%d毫秒",nMiliTimeEnd-nMiliTimeBegin); if (nTimeEnd-nTimeBegin==0) MessageBox(bufMiliTime); else MessageBox(bufTime); } void CPackDlg::OnBtnUnpack() { // TODO: Add your control notification handler code here CStrin
### 回答1: 易语言是一种可视化编程语言,用于开发Windows平台的应用程序。封包解包工具是指用于将数据进行打包和拆包的工具,主要用于网络编程中数据的传输和通信。 易语言中有一些第三方库和插件可以用于实现TCP封包解包的功能。这些库和插件提供了一些函数和方法,方便开发人员在易语言中进行数据的封包解包。 TCP封包是将数据按照一定的格式进行打包,以便于在网络上进行传输。常用的封包格式有固定长度封包、变长封包和自定义格式封包等。使用易语言进行TCP封包时,可以使用这些第三方库和插件中提供的函数,按照指定的封包格式将数据进行打包。 TCP解包是将封包后的数据拆分成可识别的数据。解包操作与封包相反,通过读取封包中的长度字段和标识字段等信息,将封包还原为原始数据。易语言中的TCP解包工具可以根据封包格式的规则进行解包操作,并将解包后的数据返回给开发人员使用。 使用易语言进行TCP封包解包的工具可以帮助开发人员简化数据传输的过程,提高开发效率和数据传输的安全性。通过这些工具,开发人员可以方便地进行数据的封包解包操作,从而更好地实现网络通信功能。 ### 回答2: 易语言是一种编程语言,它可以用于开发Windows系统下的应用程序。TCP封包解包工具是易语言提供的一个工具,用于处理TCP协议传输的数据包。 在网络通信中,数据的传输是以数据包的形式进行的。TCP封包解包工具可以帮助程序员处理从网络接收到的数据包,以及将要发送的数据转换为合适的格式进行传输。 封包指的是将数据转换为特定格式的过程。TCP封包解包工具可以将数据按照协议要求的格式进行封装,例如添加报文头部、计算校验和等操作,以便正确地发送给对方。 解包指的是将接收到的数据包进行解析的过程。TCP封包解包工具可以按照协议规定的格式解析数据包,并提取出其中的有效信息,以便程序能够正确地处理这些数据。 TCP封包解包工具可以帮助程序员简化网络通信的开发过程,使得开发人员能够更加专注于实现业务逻辑。它提供了一套封包解包的接口和函数库,开发者只需要调用相应的函数来完成数据的封包解包操作即可。 总之,易语言TCP封包解包工具是易语言提供的一个工具,用于处理TCP协议传输的数据包,使开发者能够更加方便地进行网络通信的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值