Как исправить эту ошибку, отображаемую Sonarlint?

Урезанная версия моего кода выглядит примерно так

package com.funbluebits.test;

import static java.io.File.separator;
import static java.nio.file.Files.lines;
import static java.nio.file.Paths.get;

import java.io.*;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

public class SonarLintExample {

    public static void main(String[] args) {

        SonarLintExample sle = new SonarLintExample();
        try {
            sle.handleInputFile("hello.txt");
            sle.handleInputFile("");
            sle.handleInputFile("myfile.pgp");
        }
        catch (Exception e) {

        }
    }

    public String handleInputFile(final String filePath) throws Exception {
        MarketAndProvider marketAndProvider = null;
        try {
            marketAndProvider = extractMarketAndProvider(filePath);

            if (filePath.contains(".pgp") || filePath.contains(".gpg"))
                return "encrypted";
            else {
                throw new Exception("Can only process encrypted files ");
            }

        } catch (Exception e) {
            if (marketAndProvider == null) {
                marketAndProvider = new MarketAndProvider("defaultMarket", "defaultProvider");
            }
            // real code does other stuff here too.
            throw new Exception(e);
        }
    }

    private MarketAndProvider extractMarketAndProvider(String filePath) {
        if (StringUtils.isEmpty(filePath))
        {
            return null;
        }
        int pos = filePath.indexOf(',');
        String market = filePath.substring(0,  pos);
        String provider = filePath.substring(pos+1);
        return new MarketAndProvider(market, provider);

    }

    public class MarketAndProvider {
        private final String market;
        private final String provider;

        public MarketAndProvider(String market, String provider) {
            this.market = market;
            this.provider = provider;
        }

        public String getMarket() {
            return market;
        }

        public String getProvider() {
            return provider;
        }
    }
}

Sonarlint (v1.3.1) жалуется: «Измените это условие, чтобы оно не всегда оценивалось как «ложь»» в строке, которая проверяет, является ли экземпляр нулевым. Кажется, предполагается, что в блоке try ничего не выполняется, поэтому он будет нулевым. Но это допустимо для кода, чтобы достичь этой точки, когда для «экземпляра» установлено либо значение null, либо значение.

Что мне делать, чтобы исправить это? Это ошибка в Sonarlint? Отключать правило особо не хочется - да и не знаю как, даже если бы смог.

Отредактировано: я изменил код, чтобы он был компилируемым примером. Он вырезан из реального кода и поэтому выдает ряд других ошибок SonarLint, о которых я здесь не беспокоюсь. Тем более, что marketAndProvider не используется!

Спасибо


person Ed Webb    schedule 10.03.2016    source источник
comment
Не могли бы вы отредактировать код, чтобы он компилировал и воспроизводил проблему? На данный момент отключить правила невозможно, но очень скоро это будет в SonarLint 2.0 (подключив его к серверу SonarQube).   -  person Duarte Meneses    schedule 10.03.2016
comment
Новый пример кода для демонстрации поведения. Ошибка SonarLint возникает в предложении catch для handleInputFile, но marketAndProvider в этот момент может быть нулевым или не нулевым. Спасибо за вашу быструю помощь.   -  person Ed Webb    schedule 14.03.2016


Ответы (1)


Это известная ошибка движка Symbolic Execution, влияющая на версию 3.10 плагина Java, который сам используется SonarLint 1.3.1. Проблема связана со следующим тикетом JIRA: SONARJAVA-1538.

Эта проблема будет исправлена ​​в версии 3.12 подключаемого модуля Java, которая скоро будет выпущена, и будет включена в следующую версию SonarLint.

Следовательно, в вашем коде нечего исправлять, что совершенно нормально. Проблема на стороне анализатора.

person Wohops    schedule 16.03.2016
comment
Спасибо за ответ, буду ждать следующего релиза. - person Ed Webb; 16.03.2016