Java常见问题

Equals 和 “==” 比较?

Java 中,字面整数默认 int 型;浮点数默认 double 类型。使用 “==”比较的时候,默认会把 year 转换成 int 型再和 2021 比较。使用对象的 “eqauls” 比较,会比较两者的类型。所以第一个比较为 true,第二个比较 false。

package com.fdtest.gameserver;

import java.util.Objects;

public class HelloTest {
   public static void main(String[] args) {
      short year = 2021;
      System.out.println(year == 2021);   // true
      System.out.println(Objects.equals(year, 2021));  // false
   }
}

获取奖品导致的死循环

策划有个需求,必须从奖池中随机出3个奖品,然后你写了下面的代码:

while (true){
   // get reward from pool
   
   // if reward count equal three, then break
}

这个时候策划漏配置了数据,导致了死循环。
所以有些必要的措施还是需要的,比如服务器启动的时候检查数据配置是否正确或者执行上面的代码前,加一句检查。

Javabean反序列化后都为默认值

有个JavaBean以json的格式存储(fastjson库), 在从数据库获取数据,反序列化的时候,所有字段都为默认值的情况。
原因:定义的 javabean 没有空构造函数。
解决:遵循 javabean 的编码规范

  • JavaBean类必须是一个公共类,并将其访问属性设置为public,如:public class User{…}。
  • JavaBean类必须有一个空的构造函数。
  • JavaBean类不应有公共实例变量。

使用第三方库的 @schedule 的bug

使用第三方框架的注解 @Schedule 进行定时任务的执行。
需要每天凌晨5点执行1次代码,使用了注解 :

@Scheduled(cron = "0 0 5 * * *")

结果,任务在 4 点59 秒到 5点之间执行了,导致了任务没有执行成功。所以不要盲目相信第三方的代码。

jvm没有指定编码,导致数据存入数据库乱码

原因: 启动 java 服务器的时候,没有指定编码,jvm 默认使用了系统编码 (系统 GBK)

System.getProperty("file.encoding")

而数据库使用的是 utf8mb4 编码,所以导致了中文存入数据库的时候乱码了。

解决: 启动指定参数 -Dfile.encoding=utf-8

Disruptor 导致的cpu使用高

原因: litchi 运行时,配置debug为false时,Disruptor 配置为 SleepingWaitStrategy 。由于线程很多,频繁的切换导致了 cpu 使用很高。详见 Disruptor 等待策略引发的 CPU 负载异常问题 以及 disrupter 并发框架

解决: 使用其他等待策略(WaitStrategy),比如:com.lmax.disruptor.BlockingWaitStrategy

三元表达式拆包

问题: 执行下面的代码,报空指针异常:

boolean condition = false;
Double value1 = 1.0D;
Double value2 = 2.0D;
Double value3 = null;
Double result = condition ? value1 * value2 : value3;

原因:

  • 若两个表达式类型相同,返回值类型为该类型;
  • 若两个表达式类型不同,但类型不可转换,返回值类型为 Object 类型;
  • 若两个表达式类型不同,但类型可以转化,先把包装数据类型转化为基本数据类型,然后按照基本数据类型的转换规则 (byte < short(char)< int < long < float < double) 来转化,返回值类型为优先级最高的基本数据类型。

详见 Java 的这些坑

对 Collection.emptyList 和 Arrays.asList 的返回做 add 操作

看如下代码:

	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(1, 2);
		list.add(0, 1);
	}

会报异常 UnsupportedOperationException, 原因是两个函数的返回的 list 是内部类,虽然都继承了 AbstractList 类,但是没有 ArrrayList 对应的 add 方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值