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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!