2015-05-19 3 views
-1

Мне нужно создать библиотеку классов, которая позволяет мне читать разные файлы (.dat-файлы с различными представлениями данных внутри них) и создавать объекты с их контентом (для каждой строки один объект).Внедрение интерфейса Iterator с обработкой исключений

Мне также нужно создать единичный тест, который начнет чтение файла, поэтому мне не нужно сначала читать весь файл и сохранять содержимое в массиве. Я хочу использовать заводскую модель.

Вот моя реализация класса, который реализует интерфейс итератора-

package klassenbibliothek; 
public class MyReader implements Iterator<Object> 
{ 
    BufferedReader reader; 
    MyReader(BufferedReader myReader) 
    { 
     reader = myReader; 
    } 

    @Override 
    public boolean hasNext() // aus Stackoverflow, von mir abgeändert 
    { 
     try { 
      return reader.ready(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     finally 
     { 
      throw new NoSuchElementException(); 
     } 
    } 

    @Override 
    public String next() 
    { 
     //return SubstancesFileObjectCreator(reader.readLine()); 
     try { 
      return reader.readLine(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     finally 
     { 
      // return null; 
      throw new NoSuchElementException(); 
     } 
    } 
} 

Мой вопрос: почему я получаю сообщение об ошибке «наконец, блок не завершаться нормально»? Я ничего не возвращаю, я просто бросаю исключение.

Я хочу использовать методы hasNext() и next() в своем модульном тесте, чтобы модульный тест мог контролировать, когда он начинает читать файл. Единичный тест находится в другом пакете.

Вот мои другие классы: класс AbstractFileObjectCreator

package klassenbibliothek; 
public abstract class AbstractFileObjectCreator 
{ 
    public abstract AbstractFileObject createFileObject(String line); 
} 

класс SubstancesFileObjectCreator

package klassenbibliothek; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class SubstancesFileObjectCreator extends AbstractFileObjectCreator 
{ 
    MyReader myReader; 

    public void makeReader() throws IOException 
    { 
     String dataFileName = "C:/temp/Substances.dat"; 
     BufferedReader bReader = new BufferedReader(new  FileReader(dataFileName)); 
     myReader = new MyReader(bReader); 
    } 

    @SuppressWarnings("null") 
    public AbstractFileObject createFileObject(String line) 
    { 
     AbstractFileObject mySubstance = null; 

     String lineValues[] = myReader.next().split("\t"); 
     if(lineValues[0].equals("R")) 
     { 
      boolean dutyToDeclare_local; 
      boolean isUnwanted_local; 
      boolean isProhibited_local; 
      boolean isReach_local; 
      boolean isDeleted_local; 
      boolean isHidden_local; 
      String nodeidRaw = lineValues[1]; 
      float nodeid = Float.parseFloat(nodeidRaw); 
      String casNrRaw = lineValues[2]; 
      String euIndexCodeRaw = lineValues[3]; 
      String einecsCodeRaw = lineValues[4]; 
      String dutyToDeclareRaw = lineValues[5]; 
      if(dutyToDeclareRaw.equals(1)) 
      { 
       dutyToDeclare_local = true; 
      } 
      else 
      { 
       dutyToDeclare_local = false; 
      } 
      String isUnwantedRaw = lineValues[6]; 
      if(isUnwantedRaw.equals("1")) 
      { 
       isUnwanted_local = true; 
      } 
      else 
      { 
       isUnwanted_local = false; 
      } 
      String isProhibitedRaw = lineValues[7]; 
      if(isProhibitedRaw.equals("1")) 
      { 
       isProhibited_local = true; 
      } 
      else 
      { 
       isProhibited_local = false; 
      } 
      String isReachRaw = lineValues[8]; 
      if(isReachRaw.equals("1")) 
      { 
       isReach_local = true; 
      } 
      else 
      { 
       isReach_local = false; 
      } 
      String isDeletedRaw = lineValues[9]; 
      if(isDeletedRaw.equals("1")) 
      { 
       isDeleted_local = true; 
      } 
      else 
      { 
       isDeleted_local = false; 
      } 
      String isHiddenRaw = lineValues[10]; 
      if(isHiddenRaw.equals("1")) 
      { 
       isHidden_local = true; 
      } 
      else 
      { 
       isHidden_local = false; 
      } 
      mySubstance = new Substance(nodeid, casNrRaw, euIndexCodeRaw, einecsCodeRaw, dutyToDeclare_local, isUnwanted_local, isProhibited_local, isReach_local, isDeleted_local, isHidden_local); 
      // und weiter... 
     } 
     else 
     { 
      String languageCode = lineValues[1]; 
      String name = lineValues[2]; 
      // Synonym-Objekt erzeugen und zu Substance-Objekt hinzufügen 
      Synonym newSynonym = new Synonym(languageCode, name); 
      mySubstance.addAppendix(newSynonym); 
      while(myReader.hasNext()) 
      { 
       String lineValues_synonyms[] = myReader.next().split("\t"); 
       String lineValuesZero = lineValues_synonyms[0]; 
       if(lineValuesZero.equals("R")) 
       { 
        break; // nicht so gut glaube ich!!! 
       } 
       String languageCode_next = lineValues_synonyms[1]; 
       String name_next = lineValues_synonyms[2]; 
       Synonym newSynonym_next = new Synonym(languageCode_next, name_next); 
       mySubstance.addAppendix(newSynonym_next); 
      } 

     } 
     return mySubstance; 
    } 
} 

класс AbstractFileObject

package klassenbibliothek; 

public abstract class AbstractFileObject 
{ 
    boolean isDeleted; 

    public AbstractFileObject(boolean isDeleted) 
    { 
     this.isDeleted = isDeleted; 
    } 

    public boolean getIsDeleted() 
    { 
     return isDeleted; 
    } 

    public abstract void addAppendix(Object newAppendix); 
} 

Класс вещества

public class Substance extends AbstractFileObject 
{ 
    private float nodeid; 
    private String casNr; 
    private String euIndexCode; 
    private String einecsCode; 
    private boolean dutyToDeclare; 
    private boolean isUnwanted; 
    private boolean isProhibited; 
    private boolean isReach; 
    private boolean isDeleted; 
    private boolean isHidden; 

    private ArrayList<Synonym> synonymList; 

    public Substance(float nodeid, String casNr, String euIndexCode, String einecsCode, 
     boolean dutyToDeclare, boolean isUnwanted, boolean isProhibited, boolean isReach, 
     boolean isDeleted, boolean isHidden) 
    { 
     super(isDeleted); 
     this.nodeid = nodeid; 
     this.casNr = casNr; 
     this.euIndexCode = euIndexCode; 
     this.einecsCode = einecsCode; 
     this.dutyToDeclare = dutyToDeclare; 
     this.isUnwanted = isUnwanted; 
     this.isProhibited = isProhibited; 
     this.isReach = isReach; 
     //this.isDeleted = isDeleted; 
     this.isHidden = isHidden; 
    } 
    // getter and setter 
} 

класс Синоним тест

package klassenbibliothek; 

public class Synonym 
{ 
    private String languageCode; 
    private String name; 

    public Synonym(String languageCode, String name) 
    { 
     this.languageCode = languageCode; 
     this.name = name; 
    } 

    public String getLanguageCode() 
    { 
     return languageCode; 
    } 

    public String getName() 
    { 
     return name; 
    } 
} 

блок

package klassenbibliothek.test; 
import static org.junit.Assert.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 

public class SubstancesTest { 
    @Test 
    public void test() { 
     //fail("Not yet implemented"); 
     long startTimeNanos = System.nanoTime(); 

     /* 
     * While... iterator over data file 
     */ 
    } 
} 

Могу ли я, используя шаблон фабрики в правильном направлении? Я очень смущен.

+1

* «почему я получаю это сообщение об ошибке», наконец, блок не завершается нормально? «Я не возвращаю что-то, я просто бросаю исключение». * И бросание экзекеза предотвращает, наконец, завершение нормально. Вы знаете, что такое выступление? Знаете ли вы, что такое блок «finally»? – Tom

+0

вы переопределяете метод 'next'' Iterator', если вы всегда должны генерировать исключение, что бы ни случилось, тогда следующий метод должен «бросить» исключение «NoSuchElementException», а затем он не будет переопределять класс 'Iterator'' следующий' способ. – Blip

ответ

1

Окончательный блок всегда выполняется, если перед ним есть блок try. Таким образом, ваш всегда бросает NoSuchElementException().

finally 
     { 
      // return null; 
      throw new NoSuchElementException(); 
     } 

Вы должны что-то сделать в нем и не выбрасывать исключение.

+0

ОК, что имеет смысл. Но я не знаю, что я должен добавить в блок finally. Я должен использовать исключение handlung, и метод hast возвращает String, так что я должен положить в блок finally, который не конфликтует с meanung метода next() и hasNext()? –

+0

Как и Некрео: «Наконец, блоки обычно для очистки. Закройте материал, возможно, запишите что-нибудь, ... вам также не нужно использовать окончательный блок! Они не являются обязательными. Я предполагаю, что вы немецкие, поскольку у пакетов есть немецкие имена. Если это так, это отличное чтение о try-catch-finally и java в целом: [Java ist auch eine Insel] (http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_06_001.htm) – hamena314

0

И наконец, блоки предназначены для очистки. Они не должны специально бросать подобные исключения. Переместите исключение из блока finally.

0

Удалите исключение throw из блока finally и поместите его в блок catch или в другое место. Наконец, блок должен выпустить ресурсы, которые вы могли бы использовать в своей программе.

Смежные вопросы