刚来公司老大吩咐我做Code Quality. 需要做到所有的项目的Blocker 和 Critical 的数量为0.当时我觉得很难,因为我已经没有做个Java项目,所以面对这些Issue有点害怕,毕竟我的改动会造成整个项目的问题。当时就连一个空格老大都严格的要求我,格式有一点点的错误老大就回reject的提交的代码。。。。。。一把辛酸泪啊!想想刚来的时候神马Jekins,神马Jira,神马Sonar简直了!!!
我遇到Issue主要包括:
我依稀记得我当时做的第一个Blocker就是,项目中出现最多的问题 “Catch Exception instead of Throwable” 这是一个很普遍的错误。
catch (Exception t) {
Log.logError(getClass(),"Error Collecting Metrics", t);
}
catch(Throwablet){
Log.logError(getClass(),"Error Collecting Metrics", t);
}
原因: Throwable 包括了Exception 和 error ,catch 的只是Exception, error 是不需要的catch的,如果catch有可能造成很严重的后果。
` This exceptionwill often get logged in a separate file (System.err) making debugging more complex than itneeds
“equals(Object obj)” and “hashCode()“ shouldbe overridden in pairs(BadPractice)
这两个问题其实很深奥,必须了解hashMap的存储机制,后续我会详细解释,记住一点hashCode相同equals不一定相同。
下面介绍的都是Critical的问题, Critical是
try {
InputStreaminputStream =null;
inputStream= new FileInputStream(downloadFile);
byte[]buffer = new byte[BUFFER_SIZE];
intbytesRead =-1;
while((bytesRead= inputStream.read(buffer))!= -1) {
output.write(buffer,0, bytesRead);
}
} catch(Exception e) {
thrownew WebApplicationException(e);
}
try (InputStreaminput = newFileInputStream(downloadFile)){
byte[]buffer = new byte[BUFFER_SIZE];
intbytesRead =-1;
while ((bytesRead= input.read(buffer))!= -1) {
output.write(buffer,0, bytesRead);
}
}catch (Exception e) {
throw new WebApplicationException(e);
}
if (OPEN_FILE_COUNT== 0.00 || CONFIG_VALUE == 0.00)
if (OPEN_FILE_COUNT== 0L || CONFIG_VALUE == 0L)
原因:计算机表示实数的精度问题
for(Integer index : this.clients.keySet()){
Zclientc = this.clients.get(index);
Map
for (Map.Entry
Integerindex = entry.getKey();
ZClientc = entry.getValue();
原因:提高效率,因为EntrySet 会比keySet访问的次数减少一次。
在动态加载资源的时候如果使用class.getClassLoader(),可能会导致和当前线程所运行的类和加载器不一致。
这个问题没有实质性的理解。。。。。。。
private staticStreamDatastreamInstance= null;
public static StreamDatagetStreamInstance(){
if (streamInstance== null) {
streamInstance= new StreamData();
}
return streamInstance;
}
privatestatic StreamDatastreamInstance= new StreamData();
publicstatic StreamDatagetStreamInstance(){
return streamInstance;
}
后续将在单例模式中详细的解释
if (dir.isDirectory()){
String[]children = dir.list();
for (Stringchild : children) {
return traverse(newFile(dir,child));
}
}
if (dir.isDirectory()){
String[]children = dir.list();
if(children !=null){
for (Stringchild : children) {
return traverse(newFile(dir,child));
}
}
}
很简单不解释
if (null!= reqHead&& !reqHead.equals(null))
if (null!= reqHead)
这代码使一个指向外部多个对象的引用指向了一个内部对象存储地址
privateString[] ruleName;
publicString[] getName() {
String[]temp = ruleName;
return temp;
}
public void setName(String[]name) {
String[] temp = name;
this.ruleName= temp;
}
String是一个不可变类,调用String上的任何操作都会返回新的String对象,虽然String是一个class,但实际上对它的任何操作都可以把它看成基本数据类型,比如s.trim方法是不会改变s值。
Stringtext = null;
while ((text = reader.readLine())!= null) {
lineNumber++;
text.trim();
text = text.trim();
Integer portNumber= null;
if (port!= null) {
portNumber= new Integer((int)port.intValue());}
portNumber= Integer.valueOf(port.intValue());
if (disabled.equals(true)){
log.info("NucleonExtension Framework is disabled...");
return;
}
if (disabled.equals("true"))