1、Math.abs()不一定会返回正数

  1. String str = "";
  2. int result = Math.abs(str.hashCode()) % 3; //有可能会返回负数哦
  3. Math.abs(Integer.MIN_VALUE);//返回的就是负数,因为内存溢出了

2、不要在finally块中使用return、或者throw异常

在finally中使用return或者throw异常时,会吞掉try或catch中的结果。

  1. //在finally中使用return
  2. public static void main(String[] args){
  3. System.out.println(test());//输出"finally"
  4. }
  5. public static String test(){
  6. try{
  7. int resutl = 100/0;
  8. return "try";
  9. }catch(Exception e){
  10. return "catch";
  11. }finally {
  12. return "finally";
  13. }
  14. }
  1. //在finally中throw异常
  2. public static void main(String[] args) throws Exception {
  3. throwTest(); //抛出ClassNotFoundException
  4. }
  5. public static void throwTest() throws Exception {
  6. try{
  7. throw new RuntimeException();
  8. }catch(Exception e){
  9. throw new ClassCastException();
  10. }finally {
  11. throw new ClassNotFoundException();
  12. }
  13. }

3、catch了InterruptException后要根据情况决定是否重新调用Thread.interrupt()方法

线程Thread中有一个标识flag用来记录当前线程是否被中断,默认为false,通过Thread.isInterrupt()方法可以获取该标识,当调用了Thread.interrupt方法时,会将该标识改为false,该线程会在合适的时机抛出InterruptException,且将该标识重新改为false(蓝色字体部分的内容尚未验证)。

  1. //调用Thread.sleep()方法时会抛出InterruptException异常。
  2. public static void main(String[] args) {
  3. Runnable thread = new MyThread();
  4. Thread t1 = new Thread(thread);
  5. t1.start();
  6. t1.interrupt();
  7. System.out.println("t1.isInterrupted(): "+ t1.isInterrupted());
  8. try {
  9. TimeUnit.SECONDS.sleep(4);
  10. } catch (InterruptedException e) {
  11. //此处catch了InterruptedException,但是我只是为了sleep而已,并非要在这里处理中断的业务逻辑,所以应当重新调用Thread.interrupt()方法再次标识为中断
  12. Thread.currentThread.interrupt();
  13. }
  14. t1.interrupt();
  15. System.out.println("t1.isInterrupted(): "+ t1.isInterrupted());
  16. }

4、禁止使用BigDecimal(double)的方式把一个Double转换为BigDecimal

  1. public static void main(String[] args) {
  2. BigDecimal bigDecimal = new BigDecimal(0.1);
  3. System.out.println(bigDecimal.toString());//结果是:0.1000000000000000055511151231257827021181583404541015625
  4. }
  5. //得到的结果并非是想要的0.1,可能会导致到意想不到的结果
  1. //优先推荐入参为 String 的构造方法,或使用 BigDecimal.valueOf() 方法
  2. public static void main(String[] args) {
  3. BigDecimal bigDecimal = new BigDecimal("0.1");
  4. BigDecimal bigDecimal1 = BigDecimal.valueOf(0.1);
  5. System.out.println(bigDecimal.toString()+"------"+bigDecimal1.toString());
  6. //结果是:0.1------0.1
  7. }