2

在练习中,我必须为 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();
        }
    }

有没有办法让它变得更好?

4

2 回答 2

1

你可以 ...

  • in method next(): 将两个 try-catch 块统一为一个
  • 在构造函数中使用 try-catch-block进行赋值int data = is.read();,因此摆脱最外层的 try-catch-block。

在捕获 IOExceptions 时,不是简单地调用e.printStackTrace();并继续执行程序,更好的做法是使此类的用户能够通过重新抛出一些 RuntimeException 以编程方式处理错误(不需要声明,因此不会违反可迭代接口):

catch(IOException e) {
    throw new RuntimeException(e);
}
于 2013-05-01T14:44:57.883 回答
1

try-catch您可以通过组合以下两个块来稍微清理它next()

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;
}

编辑
根据下面的讨论更改了代码

于 2013-05-01T14:51:06.343 回答