java编程常见错误汇总 (持续更新)

1. 判断String类型数据要用 "equals" 而非 "==", 否则会出现判断条件总是成立或者不成立而走入错误的 if 分支。

2. 较大数据进行 "*" 或者 "+" 运算时, 要在阿拉伯数字后面加上"L"防止溢出,在真实环境上吃过亏,debug花了不下半个小时啊~~~~谨记!!!

3. 基础类型数据不可以被赋值为 null, 直接赋值的话编译器当然会提示你这样做不对,但是隐式的赋值就不一定了,比如以下这种情况:

 

this.setRecommend_id(sm != null ? sm.getId() : null);

这里 recommend_id 为 int类型变量,setRecommend_id是它的set函数, sm是另外一个类,以上的写法编译器并不会指出它有错误,但是一旦 sm == null 成立,程序运行时就会抛出 NullPointerException 异常,所以平时一定要注意变量是用基础类型还是包装类型

4. String转为数字变量的时候要贴别注意小数点后位数,比如 String str = "3", Double.parseDouble(str)这个函数有可能会返回 3.0000000000001(原因我也不清楚,以后有时间有心情可以研究)。因此我们需要手动将输出结果四舍五入,比如:

String.format("%.2f", new Double(str)).toString()

5. 判断相等符号 "==" 经常会误写成 "=", 如果可以让编译器自己判断这种错误就好了,其实也不难,只要写代码时注意一些小trick即可:

int a = 0;
// 该写法容易出错
if (a == 0) {
    logger.info("OK")    
}
// 安全写法
if (0 == a) {
    logger.info("OK")    
}
// 如果误写为以下情形,编译器会报错
if (0 = a) {
    logger.info("OK")    
}

6. java当中的for each 循环中,被循环的主体不能为null,否则会报错,例如以下代码运行就会报错NullPointerException:

List<Integer> list = null;
        
 for (Integer e : list){
     System.out.println("e");
}

7. java当中有时候会出现 e.getmessage() 为空的情况,如下图所示:

        try {
        // 我的代码
        }catch (Exception e) {

            throw new RuntimeException("安卓通知基本信息设置出错" + e.getMessage());
        }   

其打印出来的信息可能是 runtimeException + null , 原因e.getMessage抓取的 NullPointerException(说明一下上文跳出的的exception就是nullPointerException)就是null。

那怎么办,简单,logger.error("",e) 是可以抓住这样的exception的。在上面加上一行,logger.error("msg", e)即可

8. java类内容打印,经过实验应该是调用 get 方法,特殊的地方是 boolean 值调用is方法, 值得注意的是get方法返回值要和原先值对应,比如原先是Boolean get函数的返回值换成了boolean,就打不出来了~~~

public class RecmndedMemInfo {
    

    private Boolean transfered; 

    public boolean getTransfered() { // 这里应该改成 Boolean, 否则打印为空
        return transfered;
    }

    public void setTransfered(Boolean transfered) {
        this.transfered = transfered;
    }

    public String toString(){
        try {
            return JSON.json(this);
        } catch (Exception e) {
            return "";
        }
        
    }
    
    public static void main(String[] args) {
        
        RecmndedMemInfo rm = new RecmndedMemInfo();        

        rm.setTransfered(null);
        
        System.out.println(rm); // 打印显示为空
    }
    
}

  

原文地址:https://www.cnblogs.com/yxmfighting/p/7280911.html