Ошибка компиляции Java, отправка свойств при вызове метода

#java #properties

#java #свойства

Вопрос:

Я внес некоторые изменения в исходный код. Я все еще должен учитывать, если свойства не загружаются. Надеюсь, это сработает.

общедоступный класс AnalyzerDriver {

     private List<Analyzer> analyzers = new ArrayList<Analyzer>();
    private Map<String, Integer> tokenCounts;
    private Properties properties;

    public AnalyzerDriver() {
    }

    public static void main(String[] args) {
        AnalyzerDriver analyzerDriver = new AnalyzerDriver();
        analyzerDriver.loadProperties();

        // these three lines are causing the error
        analyzerDriver.analyzers.add(new SummaryReport(properties));
        analyzerDriver.analyzers.add(new UniqueTokenAnalyzer(properties));
        analyzerDriver.analyzers.add(new BigWordAnalyzer(properties));

    }

    public void loadProperties() {
        properties = new Properties();
        try {
            properties.load(this.getClass().getResourceAsStream("config/analyzer.properties"));
        } catch (IOException ioe) {
            System.out.println("Can't load the properties file");
            ioe.printStackTrace();
        } catch (Exception e) {
            System.out.println("Problem: "   e);
            e.printStackTrace();
        }
    }
}


public class SummaryReport implements Analyzer {

    private int totalTokensCount;
    private Properties properties;

    public SummaryReport() {
    }

    public SummaryReport(Properties properties) {
        this.properties = properties;
    }
}
  

// изменения

public static void main(строка [] аргументы) {

     AnalyzerDriver analyzerDriver = new AnalyzerDriver();
    analyzerDriver.loadProperties();
    analyzerDriver.addAnalyzer();


}

public void addAnalyzer() {

    analyzers.add(new SummaryReport(properties));
    analyzers.add(new UniqueTokenAnalyzer(properties));
    analyzers.add(new BigWordAnalyzer(properties));

}

public void loadProperties()  {
    properties = new Properties();
    try {
       properties.load(this.getClass().getResourceAsStream("config/analyzer.properties"));
    }
    catch(IOException ioe) {
        System.out.println("Can't load the properties file");
        ioe.printStackTrace();
    }
    catch(Exception e) {
        System.out.println("Problem: "   e);
        e.printStackTrace();
    }
}
  

}

Комментарии:

1. обратите внимание, что распечатка точной ошибки, которую вы получаете, ускорит скорость, с которой будет дан ответ на ваш вопрос 🙂

Ответ №1:

Ваш main метод ссылается непосредственно на свойство экземпляра properties

Одним из решений было бы, чтобы properties переменная была локальной main и передавалась непосредственно в Analyzer реализации. Если он больше нигде не используется AnalyzerDriver , просто верните свойства из loadProperties и сохраните в локальном.

Вам нужно будет решить, что делать, если свойства не загружаются (чего вы сейчас не делаете).

 ... main(...) {
    Properties properties = loadProperties();
    analyzerDriver.analyzers.add(new SummaryReport(properties));
    ....
  

Редактировать Я удалил решение, на которое ссылается Усман, имея средство получения для возврата экземпляра properties … свойство.

 analyzerDriver.analyzers.add(new SummaryReport(analyzerDriver.getProperties()));
  

Комментарии:

1. @jeff Другими словами, вызов метода должен быть analyzerDriver.analyzers.add(новый сводный отчет(analyzerDriver.properties)); или лучше analyzerDriver.analyzers.add(новый сводный отчет(analyzerDriver.GetProperties()));

2. @UsmanSaleem Я отредактировал это решение из-под вас 😉 Но да, геттер был бы другим вариантом. В этом случае, вероятно, достаточно использовать локальный, но вы правы, я должен был оставить это решение!

Ответ №2:

У вас есть пара проблем.

main() является статическим методом; он не может получить доступ ни к каким нестатическим переменным AnalyzerDriver класса. properties является частной переменной экземпляра.

После этого вы пытаетесь получить доступ к частной переменной экземпляра ( analyzers ) извне instance ( analyzerDriver ), чтобы добавить свои драйверы.

Вероятно, вы хотите создать общедоступный метод analyzerDriver для добавления Analyzer экземпляров.

 public void addAnalyzer(Analyzer a) 
{ 
    analyzers.add(a);
}
  

Но это все еще оставляет проблему ваших свойств. Это действительно зависит от вашего дизайна и того, что вы делаете, но я бы, вероятно, внедрил AnalyzerFactory (фабричный шаблон), который загружал свойства, а затем создавал для вас экземпляры ваших объектов анализатора:

 AnalyzerFactory factory = new AnaylyzerFactory();
Analyzer a = factory.get("SummaryReport");
analyzerDriver.addAnalyzer(a);