【问题标题】:Why am I getting Error 1007: Instantiation attempted on a non contructor, on Android only?为什么我会收到错误 1007:仅在 Android 上尝试在非构造函数上实例化?
【发布时间】:2015-05-07 00:08:44
【问题描述】:

我之前看到过这个错误,通常是当我们试图为解释器尚未看到的对象调用构造函数时。很可能是实例化的动态尝试。但是,我目前仅在 Android 设备上的执行行中遇到错误。

参见下面的有罪功能 -

public class XMLBuilder
{

    private var elementClasses:Dictionary;
    private var elements:Dictionary;

    public function XMLBuilder() 
    {
        elementClasses = new Dictionary();
        elements = new Dictionary();
    }

    public function buildFromXML(xml:XML):void 
    {
        elements = new Dictionary();

        var element:StardustElement;
        var node:XML;
        for each (node in xml.*.*) {
        //error thrown on line below// 
        element = StardustElement(new elementClasses[node.name()] ());
            if (elements[node.@name] != undefined) {
                throw new DuplicateElementNameError("Duplicate element name: " + node.@name, node.@name, elements[node.@name], element);
            }
            elements[node.@name.toString()] = element;
        }
        for each (node in xml.*.*) {
            element = StardustElement(elements[node.@name.toString()]);
            element.parseXML(node, this);
        }
    }

    public function registerClass(elementClass:Class):void {
        var element:StardustElement = StardustElement(new elementClass());
        if (!element) {
            throw new IllegalOperationError("The class is not a subclass of the StardustElement class.");
        }
        if (elementClasses[element.getXMLTagName()] != undefined) {
            throw new IllegalOperationError("This element class name is already registered: " + element.getXMLTagName());
        }
        elementClasses[element.getXMLTagName()] = elementClass;
    }
}

对象“elementClasses”是一个包含一组类的字典。 (在这种情况下,我已经在 iOS 和 Android 上进行调试时进行了检查)。并且评估 'elementClasses[node.name()] is Class' 返回 true。

有人知道 AIR 中的任何怪癖会导致这种情况仅在 Android 上发生吗?或者这个函数中有什么跳出来的?

【问题讨论】:

  • 也许只是将其分解并首先存储在变量中,然后将所有内容放在一起。
  • 我所拥有的解决方法的主要思想是某种引导程序,其中可以通过此函数实例化的每个可能的类在应用程序启动期间实例化一次。确保解释器在执行此函数之前知道它的构造函数。
  • 但是,这仍然不能真正解释为什么这在 iOS 上很好,但在 Android 上会抛出错误。
  • 请贴出elementClasses的声明/定义,trace(elementClasses[node.name()])的结果是什么? trace(node.name()) 的结果是什么?
  • 更新了原始代码 sn-p 以包含 elementClass Dictionary 的构造函数和声明。还包括填充 elementClasses 的函数。去检查 trace(node.name())

标签: actionscript-3 flash air


【解决方案1】:

因此,在 AS3 XML 中 node.name() 将返回一个 QName 对象。如果您查看我的registerClass(elementClass:Class),您会看到我们正在使用返回字符串的 element.getXMLTagName() 将类添加到 elementClasses 字典。

现在,显然在 AIR iOS 中,如果我们尝试查找 someDict[someQName]、someQName.toString() 或尝试某种类型的转换。 而在 AIR Android 中,它似乎会尝试使用 QName 对象本身作为键。

我会说 Android 实现具有预期的行为,但它对我来说绝对是可疑的......

下面的固定代码。基本上用node.name().localName 代替。

public function buildFromXML(xml:XML):void 
{
    elements = new Dictionary();

    var element:StardustElement;
    var node:XML;
    for each (node in xml.*.*) {

    element = StardustElement(new elementClasses[node.name().localName] ());
        if (elements[node.@name] != undefined) {
            throw new DuplicateElementNameError("Duplicate element name: " + node.@name, node.@name, elements[node.@name], element);
        }
        elements[node.@name.toString()] = element;
    }
    for each (node in xml.*.*) {
        element = StardustElement(elements[node.@name.toString()]);
        element.parseXML(node, this);
    }
}

public function registerClass(elementClass:Class):void {
    var element:StardustElement = StardustElement(new elementClass());
    if (!element) {
        throw new IllegalOperationError("The class is not a subclass of the StardustElement class.");
    }
    if (elementClasses[element.getXMLTagName()] != undefined) {
        throw new IllegalOperationError("This element class name is already registered: " + element.getXMLTagName());
    }
    elementClasses[element.getXMLTagName()] = elementClass;
}

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多