工作中遇到一些问题[一直更新中]

  1. null 和空值 ''的对比
    null 是一种特殊的类型,是空指针,null 本身就是未知的,不确定它的大小和值,因此 null 不能用来比较,也无法与其本身比较,在 java 中容易抛出空指针异常NullPointerException。
    例如:
boolean value2 = (Index.getDown()==null) && (fillValue<=Index.getUp());

Down 和 Up 都为 null 值,而代码中用fillValue和 null 做比较,于是便抛出空指针异常NullPointerException
另外在数据库中如果设置 null 很容易报错,而且 null 会额外占用空间。
但’‘是一个长度为 0 的字符串,对于字符串’',isEmpty()方法检查字符串的长度是否为0。当然 isEmpty 也可以用来查询 null,下面贴上源码:

public static boolean isEmpty(Object obj) {
        if (null == obj) {
            return true;
        } else if (obj instanceof CharSequence) {
            return StrUtil.isEmpty((CharSequence)obj);
        } else if (obj instanceof Map) {
            return MapUtil.isEmpty((Map)obj);
        } else if (obj instanceof Iterable) {
            return IterUtil.isEmpty((Iterable)obj);
        } else if (obj instanceof Iterator) {
            return IterUtil.isEmpty((Iterator)obj);
        } else {
            return ArrayUtil.isArray(obj) ? ArrayUtil.isEmpty(obj) : false;
        }
    }
  1. ==和 equals 的对比
    == 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
    ==代码示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
equals 代码示例:

class Cat {
    public Cat(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

public boolean equals(Object obj) {
    return (this == obj);
}

原来 equals 本质上就是 ==。
那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

  1. java 抛出 NullPointerException的可能情况
    在Java中,NullPointerException(空指针异常)通常发生在尝试访问空引用的情况下。以下是一些可能导致NullPointerException的常见情况:
    (1)访问空对象的实例变量或方法:当一个对象引用为null时,尝试访问该对象的实例变量或调用其方法会触发NullPointerException。例如:
String str = null;
int length = str.length(); // 试图调用空字符串的length()方法

(2)访问数组中的空元素:当尝试访问数组中的空元素时,也会引发NullPointerException。例如:

String[] array = new String[3];
String str = array[0]; // array[0]为null
int length = str.length(); // 试图访问空字符串的length()方法

(3)在条件语句中使用空对象:当尝试在条件语句中使用空对象时,可能会导致NullPointerException。例如:

String str = null;
if (str.equals("Hello")) { // 试图在空字符串上调用equals方法
    // do something
}

(4)在自动拆箱时空指针:当试图在一个null对象上进行自动拆箱(将包装类转换为基本数据类型)操作时,也会抛出NullPointerException。例如:

Integer num = null;
int value = num; // 自动拆箱,抛出NullPointerException

(5)调用返回null的方法:当调用一个方法,该方法返回null,并且尝试对返回的null对象进行操作时,可能会导致NullPointerException。例如:

String str = getNullString();
int length = str.length(); // getNullString()方法返回null

这些只是NullPointerException可能发生的一些常见情况,实际上还有其他情况可能导致该异常。因此,在编写Java代码时,始终应该小心处理空引用,并且进行适当的空引用检查以避免NullPointerException的发生

  1. 造成数据库抛出不良值的可能情况
    (1)数据值无法转换为目标类型:当试图将一个不能被正确转换为目标数据类型的值存储到数据库中时,就会出现此错误。例如,尝试将一个字符串转换为double类型并存储到数据库中,但该字符串的内容无法正确转换为double类型。
    (2)数据值为null但数据库列不允许null值:如果将一个Java实体类属性设置为null,但对应的数据库列不允许接受null值,则会导致此错误。
    (3)数据值超出了数据库列的范围:如果尝试将一个超出数据库列定义的范围的值存储到数据库中,例如,尝试将一个超出double类型范围的值存储到double类型的列中,就会出现此错误。
    (4)PostgreSQL JDBC驱动程序版本与数据库版本不兼容:有时,使用的PostgreSQL JDBC驱动程序版本可能与数据库版本不兼容,这可能导致数据类型转换错误。

  2. java 中 this 的用法

  3. optional 中的 get 和 ifPresent 方法有什么不同
    (1)get() 方法:
    get() 方法用于从 Optional 对象中获取值。如果 Optional 对象包含了一个非空的值,则返回该值,否则抛出 NoSuchElementException 异常。由于抛出异常的可能性,使用 get() 方法时需要确保 Optional 中的值不为空,否则可能引发异常。
    源码如下:

 public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

(2)ifPresent() 方法:
ifPresent() 方法接受一个 Consumer 函数式接口作为参数,如果 Optional 对象包含了一个非空的值,则调用该函数。这种方式更安全,因为不需要担心空指针异常,也不需要手动检查 Optional 是否包含值。如果 Optional 对象为空,该方法不执行任何操作。
源码如下:

 public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }

综上所述,主要区别在于 get() 方法直接获取值,但需要注意可能抛出异常,而 ifPresent() 方法则更安全,它接受一个 Consumer 参数,用于处理 Optional 中的值,但不会引发异常。通常建议优先使用 ifPresent() 方法,以避免空指针异常。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值