2013-05-01 51 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