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
    }

 

posted @ 2019-03-26 08:33  如幻行云  阅读(159)  评论(0编辑  收藏  举报