Sonar扫描的NPE问题解决方案
Sonar扫描的NPE问题
report this on Sonar Community: Commons-lang StringUtils isNotBlank method still raise NPE
有人遇到了相同的问题,官方猜测是没有正确的配置 sonar.java.libraries
SonarQube上的确提示——
手动验证,将commons-lang3-3.7.jar添加到 sonar.java.libraries 参数里,问题解决。
下一步需要处理的方式——
将项目的依赖都复制到固定的目录,然后将这个目录传递给 sonar.java.libraries 参数。
dependency:copy-dependencies 的官方用法。
理论上这样就可以解决这个问题,需要验证的是多模块的项目的依赖是否可以全部正确复制到正确的目录下。
Java的异常中什么是”被检查的异常“,什么是”不被检查的异常“?被检查是怎样检查的?
Java中异常分为2种情况One:已检查异常(编译异常)Two:未检查异常(RunIng异常)检查时异常指的是在编译期间Java的编译器对代码的一种检测比如 int i;System.out.println(i+2);在编译期就过不去,Java对变量的使用必须初始化为检查异常就比较多了数组越界,类型转换错误,空指针……..在程序跑起来之后才晓得
java用ireport 打印报表,求助大神
将需要批量打印的内容生成的结果集传递给报表模板就可以了,会自动批量打印。
不预览循环批量打印要怎样实现?
需要调用打印接口 JasperPrintManager类可以直接实现打印。具体资料你可以参考Api
我用的是printReport 方法。
主要就是先在服务器端生成JasperPrint对象,返回给客户端。
下面代码百度到的,你可以参考。
import java.io.File;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.lowagie.text.ExceptionConverter;
import com.sofn.struts.dto.UserInfoDTO;
import com.sofn.struts.op.UserInfo;
import com.sofn.util.UserSessionOperate;
public class ReportViewAction extends Action {
(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response)
throws Exception {
//已编译文件路径和格式
String fp =this.getServlet().getServletContext().getRealPath(“/”)+ “report\\jasper\\”+ request.getAttribute(“rdoc”)+ “.jasper”;
File reportFile = new File(fp);
// System.out.println(“报表路径!!!!!!!”+reportFile);
Map parameters = (Map) request.getAttribute(“paras”);
byte[] bytes = null;
List list = new ArrayList();
DataSource ds = null;
JasperPrint jasperPrint=null;
//参数传递
UserSessionOperate uso = new UserSessionOperate();
String user = uso.getUser(request);
UserInfo eidr = new UserInfo();
UserInfoDTO eidrdto = null;
String deptname = “物流部门”;
String username = “陈云刚”;
parameters.put(“marker”, username);
parameters.put(“bumen”, deptname);
//数据库连接
try {
String source = “java:comp/env/jdbc/posuse”;
Context ic = null;
if (ic == null)
ic = new InitialContext();
ds = (DataSource) ic.lookup(source);
if (ds == null) {
System.out.println(“Reportview—-22222!”);
}
} catch (NameNotFoundException nfe) {
nfe.toString());
} catch (Exception ne) {
ne.printStackTrace();
}
//使用数据源
if (request.getAttribute(“datasource”) != null) {
list = (List) request.getAttribute(“reportlist”);
JRBeanCollectionDataSource jds =new JRBeanCollectionDataSource(list); //使用数据源
}
//使用SQL查询
try {
jasperPrint =JasperFillManager.fillReport(reportFile.getPath(),parameters,ds.getConnection());//填充报表数据生成JasperPrint对象
JasperPrintManager.printReport(jasperPrint, false);//2008-08-25 直接打印,不用预览PDF直接打印 true为弹出打印机选择.false为直接打印.
} catch (JRException jre) {
//System.out.println(“Reportview—-JRException88888”);
jre.printStackTrace();
} catch (ExceptionConverter ec) {
ec.getLocalizedMessage());
ec.printStackTrace();
} catch (NullPointerException npe) {
npe.getLocalizedMessage());
npe.getMessage());
npe.toString());
System.err);
} catch (Exception ee) {
ee.printStackTrace();
}
//输出
response.setContentType(“application/octet-stream”);
ServletOutputStream ouputStream = response.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
oos.writeObject(jasperPrint);//将JasperPrint对象写入对象输出流中
oos.flush();
oos.close();
ouputStream.flush();
ouputStream.close();
return mapping.findForward(“view”); //转向
}
}
如何更好地使用Java 8的Optional
Java8中的Optional是一个可以包含或不可以包含非空值的容器对象,在StreamAPI中很多地方也都使用到了Optional。java中非常讨厌的一点就是nullpoint,碰到空指针就会出错抛Exception,然后需要逐行检查是哪个对象为空,带来大量的不必要精力损耗,抛出NPE错误不是用户操作的错误,而是开发人员的错误,应该被避免,那么只能在每个方法中加入非空检查,阅读性和维护性都比较差。如下面这个代码的手工非空检查:publicvoidaddAddressToCustomer(Customercustomer,AddressnewAddress){if(customer==null||newAddress==null)return;if(customer.getAddresses()==null){customer.setAddresses(newArrayList());}customer.addAddress(newAddress);}另外还有一些开发人员喜欢通过非空检查来实现业务逻辑,空对象不应该用来决定系统的行为,它们是意外的Exceptional值,应当被看成是错误,而不是业务逻辑状态。当我们一个方法返回List集合时,应该总是返回一个空的List,而不是Null,这就允许调用者能够遍历它而不必检查Null,否则就抛出NPE。但是如果我们根据标识键ID查询数据库,没有查到,需要返回一个空对象怎么?有人建议抛出Exception,其实这不符合函数方法一进一出的原则,变成一个函数方法有两个返回,一个是正常返回,一个出错Exception,函数式编程范式告诫我们不要轻易抛Exception。这时Java8的Optional就发挥作用了,允许我们返回一个空的对象。Optional有方法isPresent()和get()是用来检查其包含的对象是否为空或不是,然后返回它,如:OptionalsomeValue=someMethod();if(someValue.isPresent()){//checksomeValue.get().someOtherMethod();//retrieveandcall}但是这种用法并不能体现Java8的全部好处,你可以将Optional看成是需要使用某个T值的方法之间某种中间人或者协调者Mediator,而不只是一个普通对象的包装器。如果你有一个值返回类型T,你有一个方法需要使用这个值,那么你可以让Optional处于中间,确保它们之间交互进行,而不必要人工干预。这样,协调者Optional能够照顾T的值提供给你的方法作为输入参数,在这种情况下,如果T是空,可以确保不会出错,这样在T值为空时也可以让一切都正常运作,你也可以让Optional执行其他动作,如执行一段代码块等等,这样它就实际上是语言机制的很好的补充。下面这个案例涉及到Lambda表达式方法引用,是将单词流中第一个以”L”开始单词取出,作为返回结果是一个Optional。