java编码陷阱
Posted gonghaiyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java编码陷阱相关的知识,希望对你有一定的参考价值。
java类型转换
下面代码如果不加L,将导致int类型超范围,不会自动升级为Long,从而导致结果与实际不符。
public static boolean isValidity(String faceResultTime, int internalHour) {
boolean valid = false;
if (StringUtils.isNotEmpty(faceResultTime)) {
valid = (System.currentTimeMillis() - DateUtils.parseDateTime(faceResultTime).getTime()) > internalHour * 3600 * 1000L ? false : true;
}
return valid;
}
请求头过大
解决方式
#端口配置
server:
port: 8090
tomcat:
# 配置tomct的基本目录(用于存放临时文件等数据)
basedir: /home/credit/xx/runtime
#配置http传输支持压缩
compression:
enabled: true
mime-types: application/json,application/xml,text/html,text/xml,text/plai
max-http-header-size: 10000000
公司固话
/**
* 公司固定电话
* 0-9的数字或-,且11位或12位
*/
@NotBlank(message = "公司固定电话不能为空")
@Pattern(regexp = "(0\\\\d{2,3}-[1-9]\\\\d{6,7})|(^[1][3,4,5,7,8][0-9]{9}$)", message = "公司固定电话不满足电话格式")
private String companyLandline;
关于方法是抛出异常还是包装后返回
在京东时,针对已知的异常,比如参数校验错误、用户操作错误、登录密码错误。这些通过校验可以知道的异常,是通过在service封装返回的。如果是不知道的异常,则会报错,只要报错,就会通过切面的方式将错误信息推送给我们开发人员手机上。所以,报错就是我们未知的错误或者是代码的BUG。这也是alibaba编码规范中的要求。
但是在美的,很多人习惯用throw new Exception()的方式进行抛出异常,只要不满足要求,就会抛出来。
基本类型包装类比较
包装类对象不可使用“==”符做比较运算,如果要进行比较运算时,最好使用java类库中的compareTo方法。
jdk8中groupingBy的用法
/**
*
*
* @param clientId
* @param applyNo
* @return
*/
private VoucherInfo2Vo getVoucherInfo(String clientId, String applyNo) {
VoucherInfo2Vo voucherInfoVo = new VoucherInfo2Vo();
XdImageFile voucherImage = ymImageStoreService.getApplyFileByType(clientId, applyNo, ImageFileType.IMG_CONSUMER_VOUCHERS.getCode());
List<XdImageFile> otherMaterialListFile = getApplyFileListByType(clientId, applyNo, TCLDict.FILE_STYLE_OTHER_MATERIAL);
if (voucherImage != null) {
ConsumeProofVo consumeProofVo = new ConsumeProofVo();
consumeProofVo.setFileId(voucherImage.getId());
consumeProofVo.setFileType(voucherImage.getFileType());
consumeProofVo.setImageThumbUrl(ymImageStoreService.getImgUrl(voucherImage.getThumbBatchNo(), voucherImage.getThumbFileName()));
consumeProofVo.setImageUrl(ymImageStoreService.getImgUrl(voucherImage.getOriginBatchNo(), voucherImage.getOriginFileName()));
voucherInfoVo.setConsumeProof(consumeProofVo);
}
if (CollectionUtils.isNotEmpty(otherMaterialListFile)) {
Map<String, List<XdImageFile>> map = otherMaterialListFile.stream().collect(
Collectors.groupingBy(e -> e.getFileType()));
List<OtherProofVo> otherProofVoList = new ArrayList<>();
for (Map.Entry<String, List<XdImageFile>> entry : map.entrySet()) {
OtherProofVo otherProofVo = new OtherProofVo();
otherProofVo.setProofType(entry.getKey());
otherProofVo.setProofTypeDesc(ImageFileType.parse(entry.getKey()).getDesc());
List<ConsumeProofVo> consumeProofVoList = new ArrayList<>();
List<XdImageFile> xdImageFileList = entry.getValue();
for (XdImageFile f : xdImageFileList) {
ConsumeProofVo consumeProofVo = new ConsumeProofVo();
consumeProofVo.setFileId(f.getId());
consumeProofVo.setFileType(f.getFileType());
consumeProofVo.setImageThumbUrl(ymImageStoreService.getImgUrl(f.getThumbBatchNo(), f.getThumbFileName()));
consumeProofVo.setImageUrl(ymImageStoreService.getImgUrl(f.getOriginBatchNo(), f.getOriginFileName()));
consumeProofVoList.add(consumeProofVo);
}
otherProofVo.setProofFileList(consumeProofVoList);
otherProofVoList.add(otherProofVo);
}
voucherInfoVo.setOtherProof(otherProofVoList);
}
return voucherInfoVo;
}
null的输出
String ss = null;
System.out.println(ss);//null
System.out.println(ss + "") ;//null
关于java包装类型比较
低于128的时候,IntegerCache会缓存。
Integer a = null;
System.out.println(a == 512);//NullPointerException
Integer b = new Integer(1024);
Integer c = new Integer(1024);
System.out.println(b == c);//false
System.out.println(b.equals(c));//true
为什么equals可以,请看equals源码。
Integer.java
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
身份证尾号为x
#face++人脸时,忽略身份证大小写对比
xdBasecust.getCertNo().equalsIgnoreCase(idCardORCResult.getString("id_card_number")
联系人姓名不能含有表情符及个人邮箱
/**
* 联系人姓名
*/
@NotBlank(message = "联系人姓名不能为空")
@Size(max = 20)
@Pattern(regexp = "(?!([\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]))", message = "居住地址中不能含有表情符")
private String name;
/**
* 联系人手机号
*/
@NotBlank(message = "联系人手机号不能为空")
@Pattern(regexp = "^1[0-9]{10}$", message = "联系人手机号不满足手机格式")
private String mobileNo;
/**
* 公司固定电话
* 0-9的数字或-,且11位或12位
*/
@NotBlank(message = "公司固定电话不能为空")
@Pattern(regexp = "(^0([0-9]|[-]){6,13}$)|(^[1][3,4,5,7,8,9][0-9]{9}$)", message = "请输入正确的公司电话")
private String companyLandline;
/**
* 个人邮箱
*/
@NotBlank(message = "个人邮箱不能为空")
@Pattern(regexp = "^[A-Za-z0-9(\\\\.)+\\\\u4e00-\\\\u9fa5]+@[a-zA-Z0-9_-]+(\\\\.[a-zA-Z0-9_-]+)+$", message = "个人邮箱不满足邮箱格式")
private String personalMailbox;
在大多数JVM中,Object.hashCode()与内存位置无关
对于OpenJDK和HotSpot JVM,hashCode()是按需生成的,并存储在对象的标头中。 使用Unsafe,您可以查看是否已设置hashCode。
重写equals方法的时候为什么需要重写hashcode
equals()方法和hashcode()方法是Object类的两个方法。从下面的代码中可以看到equals方法比较的是内存地址是否相等,因此一般情况下也无法满足两个对象值的比较。
- 如果要满足两个对象的值是否相等,需要重写equals方法。
- 如果在使用HashMap等容器类时,用对象当做key进行比较时,如下代码,此时,需要重写hashCode是为了让同一个Class对象的两个具有相同值的对象的Hash值相等。
- 同时重写hashCode()与equals()是为了满足HashSet、HashMap等此类集合的相同对象的不重复存储。
//Object.java
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
//Test.java
Student s1 = new Student(1,"June");
Student s2 = new Student(1,"June");
Map<Object,String> testMap = new HashMap<Object,String>();
testMap.put(s1, "美国学生");
System.out.println(s1.equals(s2));//对象比较
那该如何重写该对象呢?如下仅仅是个示例。大家要根据自己的对象进行改写。
public class Student {
private int age;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
}
double的使用
double a = 0.0d;
double b = 0d;
if(a == b) {//这两者是相等的
System.out.println("test");
}
java代码不能实现对jar包中的配置文件改写
原本打算读取IO流后写入流的方式进行重写jar包中的配置文件。但是这种方式在jar包中配置文件根本就不支持写。
@PostConstruct
public void initEAP() throws Exception {
org.springframework.core.io.Resource resource = new ClassPathResource("/conf/eap-ssapi.conf");
InputStream is = resource.getInputStream();
Properties configs = new Properties();
configs.load(is);
Config.getInstance().load("/conf/eap-ssapi.conf");
Config.getInstance().get("test");
configs.setProperty("loan", loanAddr);
String key = "loan";
MyProperties myProps = new MyProperties(configs);
FileOutputStream out = null;
FileLock lock = null;
is.close();
try {
out = new FileOutputStream(resource.getFile());
FileChannel channel = out.getChannel();
lock = channel.tryLock();
if (lock == null) {
throw new Exception("file is being edited: " + resource.getFile());
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = new Date();
myProps.store(out, "Last edit time: " + format.format(date));
} finally {
try {
out.close();
} catch (Exception var28) {
}
try {
lock.release();
} catch (Exception var27) {
}
}
Util.storeProperties2(resource.getURI().getPath(), configs, "loan");
}
以上是关于java编码陷阱的主要内容,如果未能解决你的问题,请参考以下文章