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);
}
}