2014-04-28 32 views
-1

我掃描使用強化的代碼後發現了以下問題路徑操作和空尊重問題....如何解決以下示例

1>路徑操縱問題:

private MimeMessage prepareMessage(EmailMessage req) throws EmailProviderException { 
     long start=System.currentTimeMillis(),finish=0; 
    try { 
     MimeMessage message = emailSender.createMimeMessage(); 

     // Create a multipart message 
     MimeMessageHelper helper = new MimeMessageHelper(message, true); 

     // Set email addresses 
     helper.setFrom(convertAddress(req.getFromAddress())); 
     helper.setTo(convertAddress(req.getToAddress())); 
     helper.setCc(convertAddress(req.getCcAddress())); 
     helper.setBcc(convertAddress(req.getBccAddress())); 

     // Set subject and body 
     helper.setSubject(req.getEmailSubject()); 
     String emailBody = req.getEmailBody(); 
     String emailMime = req.getEmailMimeType(); 

     MimeBodyPart messagePart = new MimeBodyPart(); 
     DataSource bodyDataSource = new ByteArrayDataSource(emailBody, emailMime); 
     messagePart.setDataHandler(new DataHandler(bodyDataSource)); 
     helper.getMimeMultipart().addBodyPart(messagePart); 

     // Add attachments 
     List<EmailAttachment> lAttach = req.getEmailAttachment(); 
     if (lAttach != null) { 
      for (EmailAttachment attachMnt: lAttach) { 
       DataSource dSource = new ByteArrayDataSource(attachMnt 
         .getContent(), attachMnt 
         .getMimeType()); 
       helper.addAttachment(attachMnt.getFileName(), dSource); 
      } 
     } 

     finish=System.currentTimeMillis(); 
     statsLogger.info(new FedExLogEntry("prepareMessage took {0}ms",new Object[]{finish-start}));  

     return message; 

    } catch (Exception e) { 

     // Covers MessagingException, IllegalStateException, IOException, MailException 
     String emsg = new StringBuilder("Unable to prepare smtp message.") 
      .append("\n").append(req.toString()).toString(); 
     logger.warn(emsg, e); 
     throw new EmailProviderException(emsg, e); 
    } 
} 

空取消引用問題

問題1.

public byte[] toByteArray(Notification nd) throws EmailProviderException { 

    String message = null; 

    try { 
     JAXBContext jc = JAXBContext.newInstance(nd.getClass()); 
     if (jc != null) { 
      Marshaller m = jc.createMarshaller(); 
      StringWriter sw = new StringWriter(); 
      m.marshal(nd, sw); 
      message = sw.toString(); 
     } 

    } catch (JAXBException e) { 
     throw new EmailProviderException("Unable to convert NDS notification to byte array.", e); 
    } 

    return message.getBytes(); 
} 

空取消引用問題2 ..

private void addLastUpdatedHours(
    List<LocationHoursForADate> masterHours, List<LocationHoursWithSearchedDate> hoursToAdd, Map<String,String> scheduleTypeIncludesMap){ 
    String prevScheduleTypeCode = null; 
    String prevHourTypeCode = null; 
    Date searchedDate = null; 

    // Build map of locationHours to searchDates 
    List<LocationHours> locationHours = null; 
    Map<Date, List<LocationHours>> locationHoursSearchDatesMap = new HashMap<Date, List<LocationHours>>(); 
    for(LocationHoursWithSearchedDate locationHoursWithSearchedDate : hoursToAdd) { 
     if(scheduleTypeIncludesMap.containsKey(locationHoursWithSearchedDate.getLocationHoursPK().getScheduleTypeCd())) { 
      searchedDate = locationHoursWithSearchedDate.getLocationHoursPK().getSearchedDate(); 
      locationHours = locationHoursSearchDatesMap.get(searchedDate); 
      if(locationHours==null) { 
       locationHours = new ArrayList<LocationHours>(); 
       locationHoursSearchDatesMap.put(searchedDate,locationHours); 
      } 
      locationHours.add(locationHoursWithSearchedDate.createLocationHours()); 
     } 
    }   

    for(Map.Entry<Date,List<LocationHours>> entry : locationHoursSearchDatesMap.entrySet()) { 
     prevHourTypeCode = null; 
     prevScheduleTypeCode = null; 
     searchedDate = entry.getKey(); 
     for(LocationHours hour: entry.getValue()){ 
      // new ST & new 01, add it 
      if((prevScheduleTypeCode == null) && (prevHourTypeCode == null)){ 
       masterHours.add(new LocationHoursForADate(searchedDate, hour)); 
       prevScheduleTypeCode = hour.getLocationHoursPK().getScheduleTypeCd(); 
       prevHourTypeCode = hour.getLocationHoursPK().getHoursTypeCd(); 
      } 
      else{ 
       //same ST 
       if(prevScheduleTypeCode.equals(hour.getLocationHoursPK().getScheduleTypeCd())){ 
        // same 01, skip this schedule 
        if(prevHourTypeCode.equals(hour.getHoursType().getHoursTypeCd())){ 
         continue; 
        } 
        else { //new 01, add it 
         masterHours.add(new LocationHoursForADate(searchedDate, hour)); 
         prevScheduleTypeCode = hour.getLocationHoursPK().getScheduleTypeCd(); 
         prevHourTypeCode = hour.getLocationHoursPK().getHoursTypeCd();      
        } 
       } 
       else{ //new ST, add it 
        masterHours.add(new LocationHoursForADate(searchedDate, hour)); 
        prevScheduleTypeCode = hour.getLocationHoursPK().getScheduleTypeCd(); 
        prevHourTypeCode = hour.getLocationHoursPK().getHoursTypeCd();           
       } 
      } 
     } 
    } 
} 

}

+2

沒有人會讀整個代碼,清脆,突出問題在哪裏。 –

+0

至少,請在每種情況下指出確切的路線。 – polypiel

回答

0

好,第二種情況(空順從1)很容易被發現。

問題是,如果在try-catch塊中存在異常,則對象message將爲空,因此最終指令返回message.getBytes()將引發NullPointerException

的一種方式,以避免它正在改變return語句是這樣的:

return message != null ? message.getBytes() : null; 

但也許,你會更願意引發異常...