Java中判断Integer是否为null的详细解析

这篇具有很好参考价值的文章主要介绍了Java中判断Integer是否为null的详细解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介
在java编写过程中,我们会使用到各种各样的表达式,在使用表达式的过程中,有哪些安全问题需要我们注意的呢?一起来看看吧。

来看看小编挑选的这本书对你是否有用:

注意表达式的返回值
我们在使用JDK库的时候,一定要注意认真的读一下JDK中方法的含义和它的返回值。

有些返回值可能表示这个操作是否成功,有的返回值可能是方法操作的结果。我们看两个常见的例子:

public void deleteFileWrong(){
File file= new File(“/tmp/www.flydean.com.txt”);
file.delete();
System.out.println(“File delete success!”);
}

public void deleteFileRight(){
    File file= new File("/tmp/www.flydean.com.txt");
    if(file.delete()){
        System.out.println("File delete success!");
    }
}

先看一个文件删除的例子,delete方法是有返回值的,所以我们在调用delete方法之后,一定要判断一下返回值,看是否删除成功。

再看一个常见的String中字符替换的例子:

public void stringReplaceWrong(){
String url=“www.flydean.com”;
url.replace(“www”,“WWW”);
System.out.println(“replaced url…”+url);
}
public void stringReplaceRight(){
String url=“www.flydean.com”;
url=url.replace(“www”,“WWW”);
System.out.println(“replaced url…”+url);
}
我们要记住,String是不可变的,所以它的replace方法,会返回一个替换过后的String,但是原String是不变的,所以我们需要将返回值重新赋值。

注意避免NullPointerException
NullPointerException应该是最最常见的运行时异常了。怎么避免这个异常呢?

我们要做的就是在调用object的方法时候,一定要判断这个object是不是为空。

在JDK8之后,我们引入了Stream操作:

public void streamWrong(Collection collection){
collection.stream().filter(obj->obj.equals(“www.flydean.com”));
}
Stream操作的过程中,我们需要注意stream中的元素是否为空。

有时候,我们可能觉得已经判断是为空了,但是条件判断不准确,导致未知的异常,看下面这个例子:

public int countWrong(Collection 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 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工具类中的方法来进行两个数组的比较:

Boolean boolA=true;
Boolean boolB=true;
System.out.println(boolA==boolB);

基础类型的封装类间的比较
在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.com”;
String stringB=“www.flydean.com”;
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 shortSet= new HashSet<>();
for(int i=0;i<10;i++){
shortSet.add((short)i);
shortSet.remove(i);
}
System.out.println(shortSet.size());
}
上面代码我们定义了一个Short的集合,然后将0-9添加进去,接着我们又调用了remove方法把i从集合删除。

但是最后输出结果是10,表明我们并没有删除成功。为什么呢?

看下HashSet的remove方法:

public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
remove方法的参数是Object,我们传入的i是int类型的,跟short不匹配,所以导致删除失败。

我们需要这样修改:

public void typeMatch(){
HashSet shortSet= new HashSet<>();
for(int i=0;i<10;i++){
shortSet.add((short)i);
shortSet.remove((short)i);
}
System.out.println(shortSet.size());
}

Asset的副作用
我们会使用Asset语句在代码中做调试使用,在使用的过程中需要注意Asset语句不要对系统的业务逻辑产生副作用,也就是说即使Asset语句不运行,也不会修改代码的业务逻辑。

看下面的例子:

public void assetWrong(ArrayList list){
assert list.remove(0)>0;
}
上的代码我们从list中删除第一个元素,并判断删除的元素是否大于0.

上面的代码如果assert语句不执行的话,会导致业务逻辑也不执行,所以需要修改成下面这样:

public void assetRight(ArrayList list){
int result=list.remove(0);
assert result>0;
}
本文的例子:

learn-java-base-9-to-20/tree/master/security

补充:java中判断变量非空
1.当判断的变量为数值型时(integer)

先判断是否为空 在判是否为零

if (id != null && id != 0) {
return false;//不为空
}
2.当判断的变量为字符串时时(String)

Strings.isNotBlank(name){
return false;//不为空
}
3.当判断的变量为对象时(people)

!Objects.isNull(easyData){
return false;//不为空
}
4.当判断的变量为集合时(Lsit)

CollectionUtils.isEmpty(list){
return true;//为空
}

Integer id = 0;
String name = null;
public class People {
}
List list = new ArrayList<>();文章来源地址https://www.toymoban.com/news/detail-535468.html

到了这里,关于Java中判断Integer是否为null的详细解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Java中将Double转换为Integer

    首先,初始化一个double值 现在,使用intValue()方法将Double转换为Integer值 以下是在Java中将Double转换为Integer的程序 输出结果

    2024年02月08日
    浏览(33)
  • Integer、Long 等包装类 == 值判断、地址判断与缓存

    先看下以下代码和输出 a=aa? true  b=bb? true  c=cc? false  d=dd? false  e=ee? true  f=ff? true  那么为什么会会出现这样的结果呢? 这是因为==只有在Java基本类型(short,int,long,byte,char,float,double,boolean)中比较的是值,其他类型中比较的是内存地址。因此,InteGer类中==比较的是

    2024年02月10日
    浏览(28)
  • Java转换为十进制——Integer.parseInt的使用

    一、什么是Integer.parseInt Integer.parseInt(String)就是将String字符类型数据转换为Integer整型数据,如果遇到不能转换的字符则会抛出异常! 简而言之,这个代码就是用来把任何进制的数据转化成10进制的数据。 二、使用方法 格式为:Integer.parselnt(\\\"String\\\",目前的进制) (1)以Java九进

    2024年02月14日
    浏览(34)
  • Java BigDecimal、Integer、Long、Double类型数值累加求和

    注意 Double小数点失真问题解决 : 先把Double转为BigDecimal,再求和。代码如下 : 如果此篇文章有帮助到您, 希望打大佬们能 关注 、 点赞 、 收藏 、 评论 支持一波,非常感谢大家! 如果有不对的地方请指正!!! 参考1

    2024年02月02日
    浏览(35)
  • java.lang.String cannot be cast to java.lang.Integer异常

    在java中无法直接将String类型强制转换为Integer类型。 Java中的String和Integer是两种不同的数据类型,它们之间不能直接进行强制类型转换。这主要是因为它们在底层的表示方式和数据结构上有很大的差别。 String是一个不可变的字符序列,用于表示文本数据。它是通过字符数组来

    2024年02月05日
    浏览(34)
  • java判断字符串是否和空字符串(““)相等、是否和空引用(null)相等,比较顺序不同导致出现死代码(Dead code)

    我在用Java实现需求的时候,用到了字符串跟空字符串(“”)比较,跟空引用null比较,两个比较语句的顺序不同,一个顺序出现了死代码(Dead code)。 下面这个代码片段,字符串line跟空字符串(“”)的比较放在跟null的比较前面,编译器提醒红色方框中的代码是死代码:

    2024年02月14日
    浏览(51)
  • int和Integer的区别,Java为什么要设计包装类呢?

    1.默认值不同 作为成员变量来说,int的初始默认值为 0 ,而Integer为 null 。 2.存储的内存位置不同 Integer是一个类,其对象存储在 堆 内,int是基本数据类型,存放在 栈 中。 3.作用不同 Integer类里面封装了很多的属性以及方法,使用起来会更加的 灵活 。 Java为什么要设计基本类

    2024年02月13日
    浏览(37)
  • 在使用TreeMap时遇到Cannot invoke “java.lang.Integer.intValue()“

    问题代码: 执行代码会抛出 java.lang.NullPointerException: Cannot invoke \\\"java.lang.Integer.intValue()\\\" because the return value of \\\"java.util.TreeMap.floorKey(Object)\\\" is null ,这是因为map.floorKey在无返回值时会返回null,而int无法接null。另外, intValue() 这个是因为,Java发现外面是int接,会自动拆箱将Inte

    2024年02月12日
    浏览(37)
  • 已解决java.lang.String cannot be cast to java.lang.Integer异常的正确解决方法,亲测有效!!!

    已解决java.lang.String cannot be cast to java.lang.Integer异常的正确解决方法,亲测有效!!! 开发中经常会遇到java.lang.String cannot be cast to java.lang.Integer异常,记录下我怎么解决的。 这个错误是因为你试图将一个字符串对象转换为整数对象,但是类型不匹配。 下滑查看解决方法 在

    2023年04月08日
    浏览(62)
  • 已解决java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String异常的

    已解决java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String异常的正确解决方法,亲测有效!!! java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String的错误通常发

    2024年01月21日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包