错误:只能遍历数组或 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? @AKS can only iterate over an array or an instance of java.lang.Iterable 是编译器错误,而不是运行时错误。没有堆栈跟踪。 简单:不要在这里使用 for-each 循环,而是使用标准 for 循环或 while 循环。 错误信息是正确的。速记符号仅适用于数组或Iterables。如果您的类没有实现 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.Collectionjava.lang.Iterable 的实例,否则for 循环将失败。

检查NodeCollection 是否是实现java.lang.Iterablecollection 类型类。


编辑

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 的实例的主要内容,如果未能解决你的问题,请参考以下文章

php foreach只能遍历数组么

java中Collection集合Iterator迭代器接口for each循环遍历集合或对象

SQL 编译错误:从 S3 复制到 Snowflake 时,JSON 文件格式只能生成一列类型变量或对象或数组

PHP 数组遍历 foreach 语法结构

java怎么遍历一个枚举数组的所有集合?

js常用循环方式的比较