错误:只能遍历数组或 java.lang.Iterable 的实例
Posted
技术标签:
【中文标题】错误:只能遍历数组或 java.lang.Iterable 的实例【英文标题】:Error: can only iterate over an array or an instance of java.lang.Iterable 【发布时间】:2014-04-20 22:35:21 【问题描述】:请帮我解决我的错误似乎无法使其工作,因为它只能迭代数组或 java.lang.Iterable 的实例。我想创建一个条形码并阅读它并将其添加到 word 文档中
Update Post nodeCollection 来自 com.aspose.words。
import com.aspose.barcode.*;
import com.aspose.barcoderecognition.BarCodeReadType;
import com.aspose.barcoderecognition.BarCodeReader;
import com.aspose.words.Document;
import com.aspose.words.DocumentBuilder;
import com.aspose.words.ImageType;
import com.aspose.words.NodeCollection;
import com.aspose.words.NodeType;
import com.aspose.words.Shape;
try
// Generate barcode image
BarCodeBuilder builder = new BarCodeBuilder();
builder.setSymbologyType(Symbology.Code39Standard);
builder.setCodeText("test-123");
String strBarCodeImageSave = "img.jpg";
builder.save(strBarCodeImageSave);
// Add the image to a Word doc
Document doc = new Document();
DocumentBuilder docBuilder = new DocumentBuilder(doc);
docBuilder.insertImage(strBarCodeImageSave);
String strWordFile = "docout.doc";
doc.save(strWordFile);
// Recognition part
// Extract image from the Word document
NodeCollection<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true, false);
int imageIndex = 0;
for(Shape shape: shapes)
if (shape.hasImage())
// If this shape is an image, extract image to file
String extension = ImageTypeToExtension(shape.getImageData().getImageType());
String imageFileName = MessageFormat.format("Image.ExportImages.0 Out.1", imageIndex, extension);
String strBarCodeImageExtracted = "" + imageFileName;
shape.getImageData().save(strBarCodeImageExtracted);
// Recognize barcode from this image
BarCodeReader reader = new BarCodeReader((BufferedImage) Toolkit.getDefaultToolkit().getImage(strBarCodeImageExtracted),BarCodeReadType.Code39Standard);
while (reader.read())
System.out.println("codetext: " + reader.getCodeText());
imageIndex++;
catch(Exception ex)
System.out.println(ex.getMessage());
private static String ImageTypeToExtension(int imageType) throws Exception
switch (imageType)
case ImageType.BMP:
return "bmp";
case ImageType.EMF:
return "emf";
case ImageType.JPEG:
return "jpeg";
case ImageType.PICT:
return "pict";
case ImageType.PNG:
return "png";
case ImageType.WMF:
return "wmf";
default:
throw new Exception("Unknown image type.");
【问题讨论】:
什么是 NodeCollection? @AKScan only iterate over an array or an instance of java.lang.Iterable
是编译器错误,而不是运行时错误。没有堆栈跟踪。
简单:不要在这里使用 for-each 循环,而是使用标准 for 循环或 while 循环。
错误信息是正确的。速记符号仅适用于数组或Iterable
s。如果您的类没有实现 Iterable,请显式询问它的迭代器并使用它;如果它没有getIterator
或等效方法,请编写一个显式循环来获取其内容。
"Update Post the nodeCollection is from the com.aspose.words."
-- 那么在来到这里之前,您应该做的第一件事就是查找此类的文档。这应该是一种反射动作。
【参考方案1】:
我假设 Nodecollection 是一个 com.aspose.words.NodeCollection。
如果你想使用 foreach 语法,你最好这样做:
Node[] shapesArray = shapes.toArray();
for (Node node : shapesArray ) ...
【讨论】:
【参考方案2】:错误:只能遍历数组或 java.lang.Iterable 的实例
它清楚地表明你应该只对可迭代的对象进行迭代。
在您使用的代码中
NodeCollection<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true, false);
...
for(Shape shape: shapes)
除非shapes
基类是java.util.Collection
或java.lang.Iterable
的实例,否则for
循环将失败。
检查NodeCollection
是否是实现java.lang.Iterable
的collection 类型类。
编辑:
nodeCollection 来自 com.aspose.words。
NodeCollection
直接实现通用Iterable
,而不指定它将处理的对象类型。因此,您应该从 NodeCollection
实例显式生成 Iterator
并在其上进行迭代。
NodeCollection<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true, false);
Iterator<Shape> shapesIterator = shapes.iterator();
...
// now use the above iterator in for loop, as below
for( Shape shape: shapesIterator )
参考a similar answer on so
【讨论】:
以上是关于错误:只能遍历数组或 java.lang.Iterable 的实例的主要内容,如果未能解决你的问题,请参考以下文章
java中Collection集合Iterator迭代器接口for each循环遍历集合或对象