【问题标题】:Error: can only iterate over an array or an instance of java.lang.Iterable错误:只能遍历数组或 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." -- 那么在来到这里之前,您应该做的第一件事就是查找此类的文档。这应该是一种反射动作。

标签: java arrays for-loop


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多