java判断integer是否为空_java安全编码指南之:表达式规则
简介
在java编写过程中,我们会使⽤到各种各样的表达式,在使⽤表达式的过程中,有哪些安全问题需要我们注意的呢?⼀起来看看吧。
注意表达式的返回值
我们在使⽤JDK库的时候,⼀定要注意认真的读⼀下JDK中⽅法的含义和它的返回值。
有些返回值可能表⽰这个操作是否成功,有的返回值可能是⽅法操作的结果。我们看两个常见的例⼦:
public void deleteFileWrong(){
File file= new File("/tmp/");
file.delete();
System.out.println("File delete success!");
}
public void deleteFileRight(){
File file= new File("/tmp/");
if(file.delete()){
System.out.println("File delete success!");
}
}
先看⼀个⽂件删除的例⼦,delete⽅法是有返回值的,所以我们在调⽤delete⽅法之后,⼀定要判断⼀下返回值,看是否删除成功。
java怎么编写再看⼀个常见的String中字符替换的例⼦:
public void stringReplaceWrong(){
String url="www.flydean";
System.out.println(""+url);
}
public void stringReplaceRight(){
String url="www.flydean";
place("www","WWW");
System.out.println(""+url);
}
我们要记住,String是不可变的,所以它的replace⽅法,会返回⼀个替换过后的String,但是原String是不变的,所以我们需要将返回值重新赋值。
注意避免NullPointerException
NullPointerException应该是最最常见的运⾏时异常了。怎么避免这个异常呢?
我们要做的就是在调⽤object的⽅法时候,⼀定要判断这个object是不是为空。
在JDK8之后,我们引⼊了Stream操作:
public void streamWrong(Collection<Object> collection){
collection.stream().filter(obj->obj.equals("www.flydean"));
}
Stream操作的过程中,我们需要注意stream中的元素是否为空。
有时候,我们可能觉得已经判断是为空了,但是条件判断不准确,导致未知的异常,看下⾯这个例⼦:
public int countWrong(Collection<Object> collection, Object object){
int count=0;
if(collection ==null){
return count;
}
for(Object element: collection){
if((element ==null && object== null)
|| element.equals(object)){
count++;
}
}
return count;
}
这个例⼦是⽤来查collection中到底有多少元素和object相同,如果两者都为空,也记为相同。
但是上⾯的例⼦有⼀个漏洞,它没有考虑element ==null ⽽ object !=null的情况,所以会导致NullPointerException的⽣成。我们需要这样修改:
public int countRight(Collection<Object> collection, Object object){
int count=0;
if(collection ==null){
return count;
}
for(Object element: collection){
if((element ==null && object== null)
|| (element !=null && element.equals(object))){
count++;
}
}
return count;
}
数组相等的判断
如果我们需要⽐较两个数组是否相等,其实我们想⽐较的是两个数组中的元素是否相等。
我们知道数组是⼀个特殊的Object,那么数组对象也有⼀个equals⽅法,考虑下⾯的例⼦:
public boolean compareWrong(){
int[] array1 = new int[10];
int[] array2 = new int[10];
return array1.equals(array2);
}
返回的结果是false,因为数组直接使⽤了Object中定义的equals⽅法,我们看下该⽅法的定义:
public boolean equals(Object obj) {
return (this == obj);
}
可以看到,该⽅法⽐较的是两个地址是否相等。所以我们的到了false结果。
其实,我们可以使⽤Arrays.equals⼯具类中的⽅法来进⾏两个数组的⽐较:
public boolean compareRight(){
int[] array1 = new int[10];
int[] array2 = new int[10];
return Arrays.equals(array1, array2);
}
基础类型的封装类间的⽐较
在java中,我们知道有⼀些基础类型像boolean, byte,char, short, int他们会有相对应的封装类型:
Boolean,Byte,Character,Short,Integer等。
我们可以直接将基础类型的值赋值给封装类型,封装类型会⾃⾏进⾏转换。
考虑下⾯的例⼦:
Boolean boolA=true;
Boolean boolB=true;
System.out.println(boolA==boolB);
结果是多少呢?
答案是true。为什么两个不同对象的⽐较会是true呢?
在回答这个问题之前,我们看⼀下字符串的⽐较:
String stringA="www.flydean";
String stringB="www.flydean";
System.out.println(stringA==stringB);
这个我们⼤家应该都知道,因为String有⼀个字符串常量池,直接从字符串常量构建的String对象,其实是同⼀个对象。同样的对于Boolean和Byte来说,如果直接从基础类值构建的话,也是同⼀个对象。
⽽对于Character来说,如果值的范围在u0000 to u007f,则属于同⼀个对象,如果超出了这个范围,则是不同的对象。对于Integer和Short来说,如果值的范围在-128 and 127,则属于同⼀个对象,如果
超出了这个范围,则是不同的对象。再考虑下⾯的例⼦:
Boolean boolA=true;
Boolean boolC=new Boolean(true);
System.out.println(boolA==boolC);
输出的结果是false,因为boolC使⽤了new关键字,构建了⼀个新的对象。
集合中类型不匹配
现在java集合可以通过指定类型,从⽽只存储特定类型的对象。考虑下⾯的⼀个例⼦:
public void typeMismatch(){
HashSet<Short> shortSet= new HashSet<>();
for(int i=0;i<10;i++){
shortSet.add((short)i);
}
System.out.println(shortSet.size());
}
上⾯代码我们定义了⼀个Short的集合,然后将0-9添加进去,接着我们⼜调⽤了remove⽅法把i从集合删除。
但是最后输出结果是10,表明我们并没有删除成功。为什么呢?
看下HashSet的remove⽅法:
public boolean remove(Object o) {
ve(o)==PRESENT;
}
remove⽅法的参数是Object,我们传⼊的i是int类型的,跟short不匹配,所以导致删除失败。
我们需要这样修改:
public void typeMatch(){
HashSet<Short> shortSet= new HashSet<>();
for(int i=0;i<10;i++){
shortSet.add((short)i);
}
System.out.println(shortSet.size());
}
Asset的副作⽤
我们会使⽤Asset语句在代码中做调试使⽤,在使⽤的过程中需要注意Asset语句不要对系统的业务逻辑产⽣副作⽤,也就是说即使Asset 语句不运⾏,也不会修改代码的业务逻辑。
看下⾯的例⼦:
public void assetWrong(ArrayList<Integer> list){
assert ve(0)>0;
}
上的代码我们从list中删除第⼀个元素,并判断删除的元素是否⼤于0.
上⾯的代码如果assert语句不执⾏的话,会导致业务逻辑也不执⾏,所以需要修改成下⾯这样:
public void assetRight(ArrayList<Integer> list){
int ve(0);
assert result>0;
}
本⽂的例⼦:
learn-java-base-9-to-20/tree/master/security
本⽂已收录于www.flydean/java-security-code-line-expresion/最通俗的解读,最深刻的⼲货,最简洁的教程,众多你不知道的⼩技巧等你来发现!欢迎关注我的:「程序那些事」,懂技术,更懂你!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论