2013-06-24 4 views
0
public class classifyTweet { 

    public static class MapClass 
      extends Mapper<LongWritable, Text, Text, Text> { 

    static final Configuration conf = new Configuration(); 

    protected void map(LongWritable key, Text value, Context context) 
      throws IOException, InterruptedException { 

    StandardNaiveBayesClassifier classifier = new StandardNaiveBayesClassifier(NaiveBayesModel.materialize(new Path(modelPath), conf)); 

    } 
    } 
} 

Я хочу, чтобы инициализировать переменный классификатор только один раз, материализовать метод бросает IOEception, если я объявить его вне методом карты и как инициализация объекта конфигурации он дает ошибку компиляции IOException. Как я могу инициализировать его только один раз?IO исключения внутри статического класса - Java

+0

Предоставить трассировку стека этого исключения. –

+0

получение ошибки при компиляции .. незарегистрированный IOException должен быть пойман или выброшен –

ответ

1

делают StandardNaiveBayesClassifier - синглтон

public class StandardNaiveBayesClassifier { 
private static StandardNaiveBayesClassifier instance; 

public static StandardNaiveBayesClassifier getInstance(... you params) { 
    if (instance == null) 
     instance = new StandardNaiveBayesClassifier(); 
    return instance; 
} 

private StandardNaiveBayesClassifier() { 
} 

}

1

Вы можете использовать статический блок для инициализации переменной classifier только один раз.

public class classifyTweet { 

    public static class MapClass 
      extends Mapper<LongWritable, Text, Text, Text> { 

    static final Configuration conf = new Configuration(); 

    static final StandardNaiveBayesClassifier classifier; 

    static { 
     try { 
     classifier = new StandardNaiveBayesClassifier(NaiveBayesModel.materialize(new Path(modelPath), conf)); 
     } 
     catch(IOException e) { 
      e.printStackTrace(); 
      System.out.println("Initialization failed."); 
     } 
    } 

    protected void map(LongWritable key, Text value, Context context) 
      throws IOException, InterruptedException { 

    //do some work... 

    } 
    } 
} 

Я принимаю переменную modelPath находится в области видимости при создании classifier объекта в статическом блоке. Вы ничего не говорите об этом.

+0

Не работает получение такого же IOException, я думаю, потому что 'NaiveBayesModel.materialize (новый Path (modelPath), conf)' бросает IOException, я должен его поймать или использовать бросает, так это утверждение должно быть внутри нестатического метода? –

+0

@MahenderSingh Да. В самом деле. Я забыл разместить «try/catch» в статическом блоке. Обновлен ответ. – dcernahoschi