Java 常用技巧/常见错误
一、常用技巧
1. try catch语句块中try()的括号中代码作用(JDK1.7)
A. 语法格式:try(创建流对象语句,如果多个,使用分号隔开) {
// 读写数据
} catch (IOException e) {
e.printStackTrace();
}
B. 语句执行完后,会自动关闭括号中的资源,该语法确保了每个资源,在语句结束时关闭
C. 举例
2. 退出双层for循环:仅break关键字只能跳出最内层循环,若要跳出最外层循环,需要新增一个标记loop;
public static void main(String[] args) { System.out.println("双层循环开始了"); loop: for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { System.out.println("i=" + i + ", j=" +j); if (i == 2 && j == 1) { break loop; } } } System.out.println("双层循环结束了");
}
二、常见错误
1. 现象:将数组转为List后进行removeAll()操作,报java.lang.UnsupportedOperationException异常;
错误代码:
/** * 获取标记ID * @return 标记ID */ private Long getSignId() { Long[] signIds = {1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L}; List<Long> allSignIds = Arrays.asList(signIds); List<Long> existsSignIds = groupManageMapper.findSignId(); // 留下未用的标记ID allSignIds.removeAll(existsSignIds); return allSignIds.size() == 0 ? null : allSignIds.get(0); }
正确代码:
/** * 获取标记ID * @return 标记ID */ private Long getSignId() { Long[] signIds = {1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L}; List<Long> allSignIds = new ArrayList<>(Arrays.asList(signIds)); List<Long> existsSignIds = groupManageMapper.findSignId(); // 留下未用的标记ID allSignIds.removeAll(existsSignIds); return allSignIds.size() == 0 ? null : allSignIds.get(0); }
详解:
A. asList方法不适用于基本数据类型;
B. 不支持add、remove、removeAll和clear方法;
C. 如果要可变,需使用ArrayList包装下。
2. 现象:前端传递时间参数,后端Date类型无法接收,后端传递Date类型时间数据,前端展示不友好;
错误信息:
正确代码:
3. Integer类数字比较及乘法意外结果
错误代码:
public static void main(String[] args) { Integer a = 100, b = 100; Integer c = 1000, d = 1000; Integer e = 1604571697; // IntegerCache类缓存了-128到127之间的所有整数的对象 System.out.println(a == b); // true System.out.println(c == d); // false System.out.println(e * 1000); // -1746071704 }
正确代码:
public static void main(String[] args) { Integer a = 100, b = 100; Integer c = 1000, d = 1000; Integer e = 1604571697; // IntegerCache类缓存了-128到127之间的所有整数的对象 System.out.println(a.equals(b)); // true System.out.println(c.equals(d)); // true System.out.println(e.longValue() * 1000); // 1604571697000 }