2013-05-01 53 views
1

在練習中,我必須爲InputStream創建一個迭代器。 的目標是,用戶可以這樣做:Iterator for InputStream

for(byte b : new InputStreamToIterable(myInputStream)){ 
//do stuff with byte 
} 

我完成了創建它和它的作品很好,但迭代器method是不是很優雅(很多try/catch)。

@Override 
    public Iterator<Byte> iterator() { 
     // TODO Auto-generated method stub  
     try { 
      return new Iterator<Byte>() { 

       int data = is.read(); 
       @Override 
       public boolean hasNext() { 
        // TODO Auto-generated method stub 
        return data != -1; 
       } 

       @Override 
       public Byte next() { 
        // TODO Auto-generated method stub 
        if(!hasNext()){ 
         try { 
          is.close(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 

        int a = data; 
        try { 
         data = is.read(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        return (byte)a; 
       } 

       @Override 
       public void remove() { 
        // TODO Auto-generated method stub 
        throw new UnsupportedOperationException(); 
       } 
      }; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      throw new UnsupportedOperationException(); 
     } 
    } 

有沒有辦法讓它更好?

回答

1

你可以...

  • 在方法next():統一兩個的try-catch塊成一個單一的一個
  • 做作業int data = is.read();在構造函數中,用一個try-catch塊,和所以擺脫最外層的try-catch-block。

當追趕,而不是簡單地調用e.printStackTrace();並繼續執行程序中的IOExceptions,更好的做法是使這個類的用戶通過重新拋出一些RuntimeException的(這不需要聲明以編程方式處理錯誤所以不違反Iterable接口):

catch(IOException e) { 
    throw new RuntimeException(e); 
} 
1

你可以一定程度上受到兩個try-catchnext()結合清理:

boolean isClosed = false; 
@Override 
public Byte next() { 
    if(isClosed) throw new NoSuchElementException(); 
    int a = data; 
    try { 
     if(!hasNext()) { 
      is.close(); 
      isClosed = true; 
     } else 
      data = is.read();  
    } catch(IOException e) { throw new RuntimeException(e); } 
    return (byte)a; 
} 

編輯
改變根據的`!hasNext()`分支下面

+0

討論的代碼,'NoSuchElementException'應按拋出http://docs.oracle.com/javase/6/ docs/api/java/util/Iterator.html – fjf2002 2013-05-01 14:59:20

+0

如果我關閉了流,拋出這個異常並不是強制的,對吧? – user2336315 2013-05-01 15:05:32

+0

只有當你試圖訪問一個不存在的元素時,纔會拋出它,所以基本上如果在'is.close()'後面再次調用next()。 – 2013-05-01 15:09:02