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