«NullPointerException» может быть брошено;"setCredentials ()" может возвращать ноль - PullRequest
0 голосов
/ 06 июня 2018

Почему Сонар помечает это как возможное исключение NullPointerException?

public void credentialSetter(@Headers Map<String, Object> headersMap) {

    SoapHeader uName = new SoapHeader(new QName(NAMESPACE_URL, USERNAMETOKEN), 
            setCredentials(USERNAMETOKEN, this.username).getDocumentElement());

    SoapHeader pTxt = new SoapHeader(new QName(NAMESPACE_URL, P), 
            setCredentials(P, this.pas).getDocumentElement());

Оно всплывает в "setCredentials" оба раза, я пытался окружить его оператором if, чтобы проверить, не является ли оно нулевым,также попытался проверить, является ли он нулевым в реальном методе, чтобы охватить всю базу.

private Document setCredentials(String credential, String value) {
    StringWriter writer = new StringWriter();
    JAXBContext context;
    try {
        if (null != credential && null != value) {
            context = JAXBContext.newInstance(value.getClass());
            QName qName = new QName(NAMESPACE_URL, credential);
            JAXBElement<String> root = new JAXBElement<>(qName, String.class, value);
            context.createMarshaller().marshal(root, writer);
            return DocumentBuilderFactory.newInstance().newDocumentBuilder()
                    .parse(new InputSource(new StringReader(writer.toString())));
        }
    } catch (Exception e) {
        LOG.error("Error converting {} to XML {}", credential, e);
    }
    return null;
}

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Последняя строка setCredentials() возвращает ноль, поэтому есть вероятность, что две следующие строки выдают NullPointerException.Обертывание вашей логики в нулевой проверке здесь не очень помогает, потому что есть вероятность, что она вернет null

SoapHeader uName = new SoapHeader(new QName(NAMESPACE_URL, USERNAMETOKEN), 
        setCredentials(USERNAMETOKEN, this.username).getDocumentElement());

SoapHeader pTxt = new SoapHeader(new QName(NAMESPACE_URL, P), 
        setCredentials(P, this.pas).getDocumentElement());

Решением будет использование следующего

SoapHeader uName;
Document document = setCredentials(USERNAMETOKEN, this.username);
if (document != null) {
    uName = new SoapHeader(new QName(NAMESPACE_URL, USERNAMETOKEN), 
            document.getDocumentElement());
} else {
    // whatever you need to do
}
0 голосов
/ 06 июня 2018

Ваш метод setCredentials() может возвращать нуль: return null;

Сонар обнаруживает это + тот факт, что вы используете возвращенный объект для .getDocumentElement(), что выводит в NPE, так как это нулевая ссылка.

Если вы хотите переопределить это (не рекомендую делать это), верните новый экземпляр Document вместо null (при условии, что метод newInstance () фактически возвращает новый экземпляр):

private Document setCredentials(String credential, String value) {
StringWriter writer = new StringWriter();
JAXBContext context;
try {
    if (null != credential && null != value) {
        context = JAXBContext.newInstance(value.getClass());
        QName qName = new QName(NAMESPACE_URL, credential);
        JAXBElement<String> root = new JAXBElement<>(qName, String.class, value);
        context.createMarshaller().marshal(root, writer);
        return DocumentBuilderFactory.newInstance().newDocumentBuilder()
                .parse(new InputSource(new StringReader(writer.toString())));
    }
} catch (Exception e) {
    LOG.error("Error converting {} to XML {}", credential, e);
}
return DocumentBuilderFactory.newInstance();

}

0 голосов
/ 06 июня 2018

Вы вызываете getDocumentElement() для setCredentials's возвращаемого значения, которое может быть null.Если бы это было так, вы бы получили исключение.Вот причина, почему Сонар предупреждает вас.

ОК, у вас есть основная логика setCredentials с try-catch, но вы все равно возвращаете null в случае ошибок.

Как общая идея, вы могли бы сделать что-то вроде этого:

Document credentials = setCredentials(USERNAMETOKEN, this.username);
if (null != credentials){
    SoapHeader uName = new SoapHeader(new QName(NAMESPACE_URL, USERNAMETOKEN), 
            credentials.getDocumentElement());
}
...