Java常见错误合集

null 转基本类型

@Data
@NoArgsConstructor
@AllArgsConstructor
static class OneClass {
    private Double value;
}

@Test
public void nullToPrimitive() {
    OneClass oneClass = new OneClass(1.0);
    double value = oneClass.getValue();
    System.out.println(value);
    OneClass oneClass2 = new OneClass();
    value = oneClass2.getValue();
    System.out.println(value);
}

null指针异常

String.format中输出%

@Test
public void formatTest() {
    String str = "the fee rage is %.2f%%";
    System.out.println(String.format(str, 1.2));
}

the fee rage is 1.20%

google cache null 指针

@Test
public void nullTest1() {
    LoadingCache<String, String> cache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build(
            new CacheLoader<String, String>() {
                @Override
                public String load(String key) throws Exception {
                    return null;
                }
            });
    try {
        System.out.println(cache.get("str"));
    } catch (Exception e) {
        log.error("nullTest1 {}", e.getMessage(), e);
    }
}

报错:nullTest1 CacheLoader returned null for key str.

修改后

@Test
public void nullTest2() {
    LoadingCache<String, Optional<String>> cache =
            CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build(
                    new CacheLoader<String, Optional<String>>() {
                        @Override
                        public Optional<String> load(String key) throws Exception {
                            return Optional.ofNullable(null);
                        }
                    });
    try {
        System.out.println(cache.get("str").isPresent() ? cache.get("str") : null);
    } catch (Exception e) {
        log.error("nullTest2 {}", e.getMessage(), e);
    }
}

输出:null

double相加精度问题

@Test
public void doubleAdd() {
    System.out.println(0.3 + 0.3 + 0.3 + 0.1);
    System.out.println(Double.compare(1.0, 0.3 + 0.3 + 0.3 + 0.1) == 0);
    BigDecimal bigDecimal1 = BigDecimal.valueOf(0.3)
            .add(BigDecimal.valueOf(0.3))
            .add(BigDecimal.valueOf(0.3))
            .add(BigDecimal.valueOf(0.1));
    BigDecimal bigDecimal2 = BigDecimal.valueOf(1.0);
    System.out.println(bigDecimal1.compareTo(bigDecimal2) == 0);
}

输出:
0.9999999999999999
false
true

contains 参数是object 类型不同

@Test
public void containsTest() {
    Set<Byte> set = Sets.newHashSet((byte) 1, (byte) 2, (byte) 3);
    System.out.println(set.contains(1));
    System.out.println(set.contains((byte) 1));
}

输出:
false
true

Arrays.asList

Integer[] integers = {0, 1, 2};
List<Integer> list = Arrays.asList(integers);
System.out.println(list);
integers[0] += 1;
System.out.println(list);

输出:
[0, 1, 2]
[1, 1, 2]

Arrays.asList 产生的ArrayList,它内部的数组直接沿用了这个数组,所以数组的修改,ArrayList也会相应的修改
这个list不支持add和remove,支持set和get

源码如下
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;

    ArrayList(E[] array) {
        a = Objects.requireNonNull(array);
    }
}

未完待续……

原文地址:https://www.cnblogs.com/eaglelihh/p/13960467.html