Request processing failed; nested exception is java.lang.NullPointerException

一直报错显示:Servlet[springmvc]的Servlet.service()引发了具有根本原因的异常Request processing failed; nested exception is java.lang.NullPointerException
报错如下:
java.lang.NullPointerException
at com.util.CommDAO.select(CommDAO.java:520)
at com.util.Info.getInventory(Info.java:678)
at com.controller.OrdermsgController.faHuo(OrdermsgController.java:314)

这是错误界面:

img


OrdermsgController.faHuo的代码如下:

//发货
    @RequestMapping("admin/faHuo")
    public String faHuo(Ordermsg ordermsg,HttpServletRequest request){
        Ordermsg order = ordermsgDAO.findById(ordermsg.getId());
        List<Ordermsgdetails> list = ordermsgdetailsDAO.selectorderDetails(order.getOrderno());        
        boolean flag = true;
        for(Ordermsgdetails ordermsgdetails:list){
            int inventoryrecord = Info.getInventory(ordermsgdetails.getProductid());//库存数量
            if(inventoryrecord<ordermsgdetails.getNum()){
                flag = false;
                break;
            }
        }
        if(flag==true){
            for(Ordermsgdetails omd:list){
                Inventory inv = new Inventory();
                inv.setNum(omd.getNum());
                inv.setType("out");
                inv.setProductid(String.valueOf( omd.getProductid()));
                inventoryDAO.add(inv);
            }
            ordermsg.setShstatus("待收货");
            ordermsgDAO.update(ordermsg);
            return "redirect:orderList.do";
        }else{
            return "redirect:orderList.do?msg=msg";
        }
        
    }

Info.getInventory对应代码如下:

//库存
      @Autowired
      public static int getInventory(int id) {
          int num=0;
          int intotal = 0;
          int outtotal = 0;
          CommDAO dao = new CommDAO();  
          List<HashMap> inlist = dao.select("select * from inventory where type='in' and productid='"+id+"'");
          List<HashMap> outlist = dao.select("select * from inventory where type='out' and productid='"+id+"'");
          for(HashMap inmap:inlist){
              intotal+=Integer.parseInt(inmap.get("num").toString());
          }
          for(HashMap outmap:outlist){
              outtotal+=Integer.parseInt(outmap.get("num").toString());
          }
          if(intotal>=outtotal){
              num = intotal-outtotal;
          }
        return num;
    }

CommDAO.select对应代码如下:

public List<HashMap> select(String sql)
{ 
    System.out.println(sql);
    List<HashMap> list = new ArrayList();
    try {
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery(sql);
        ResultSetMetaData rsmd = rs.getMetaData();
    
        while(rs.next())
        {
            HashMap map = new HashMap();
            int i = rsmd.getColumnCount();
            for(int j=1;j<=i;j++)
            {
                if(!rsmd.getColumnName(j).equals("ID"))
                {
                    String str = rs.getString(j)==null?"": rs.getString(j);
                    if(str.equals("null"))str = "";
                    map.put(rsmd.getColumnName(j), str);
                }
                else
                    map.put("id", rs.getString(j));
            }
            list.add(map);
        }
        rs.close();
        st.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        
        if(sql.equals("show tables"))
        list = select("select table_name from   INFORMATION_SCHEMA.tables");
        else
            e.printStackTrace();
    }
    return list;
}

在百度找了好多方法试了都不管用,急需各位解惑

CommDAO.java的520行空指针,520行代码是什么