HarmonyOS 运行调试时候报错SourceMap is not initialized yet?

运行调试时候,报错crash。代码如下:

父亲类代码:

export abstract class Decompressor {
  private static readonly OUR_DEFLATES = new LinkedList<NoCompressionDecompressor>();
  constructor(is?: MyBufferedInputStream, header?: LocalFileHeader) {}
  static storeDecompressor(decompressor: Decompressor) {
    if (decompressor instanceof NoCompressionDecompressor) {
      Decompressor.OUR_DEFLATES.add(decompressor as NoCompressionDecompressor);
    }
  }
  static init(is: MyBufferedInputStream, header: LocalFileHeader): Decompressor {
    throw new Error("Unsupported method of compression");
  }
  abstract read(b: Uint8Array, off: number, len: number): number;
  abstract readByte(): number;
  available(): number {
    return -1;
  }
}

子类代码:

export default class NoCompressionDecompressor extends Decompressor {
  private readonly myHeader: LocalFileHeader | null = null;
  private readonly myStream: MyBufferedInputStream | null = null;
  private myCurrentPosition: number = 0;
  constructor(is?: MyBufferedInputStream, header?: LocalFileHeader) {
    super();
    if (header !== undefined) {
      this.myHeader = header;
    }
    if (is !== undefined) {
      this.myStream = is;
    }
  }
  read(b: Uint8Array, off: number, len: number): number {
    let i = 0;
    for (; i < len; ++i) {
      let value = this.readByte();
      if (value == -1) {
        break;
      }
      if (b != null) {
        b[off + i] = value;
      }
    }
    return (i > 0) ? i : -1;
  }
  readByte(): number {
    return -1;
  }
  available(): number {
    return 0
  }
}

crashlog:

Reason:ReferenceError
Error name:ReferenceError
Error message:Decompressor is not initialized
SourceCode:
export default class NoCompressionDecompressor extends Decompressor {
^
Stacktrace:
SourceMap is not initialized yet
at func_main_0 (ReaderEngine/src/main/ets/engine/format/epub/zip/NoCompressionDecompressor.ets:4:56)
阅读 1.9k
1 个回答

通常遇到父类调用子类运行报错:“ is not initialized”,原因是:由于代码中存在循环依赖、相互引用导致的,由于ArkTS限制,循环依赖因为加载时类未初始化完成导致报错,不建议使用;如果确实要用,需要模块加载顺序调整清楚,如下这个demo:

父类:

import { B } from ‘./Son’;
export class A {
  constructor() {
  }
  getInstance() {
    if (this instanceof B) {
    }
  }
}

子类:

import { A } from ‘./Father’;
export class B extends A {
}
//运行报错,调用栈:
Reason:ReferenceError
Error name:ReferenceError
Error message:A is not initialized
SourceCode:
export class B extends A {
  ^
  Stacktrace:
    at func_main_0 (entry/src/main/ets/test/Son.ets:3:24)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进