{"record":{"id":"0d25ecb74824c846","repo":"krahets/hello-algo","slug":"error-0d25ec","errorCode":null,"errorMessage":"佇列為空","messagePattern":"佇列為空","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"zh-hant/codes/zig/chapter_stack_and_queue/linkedlist_queue.zig","lineNumber":48,"sourceCode":"        // 析構函式（釋放記憶體）\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // 獲取佇列的長度\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // 判斷佇列是否為空\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // 訪問佇列首元素\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"佇列為空\");\n            return self.front.?.val;\n        }  \n\n        // 入列\n        pub fn push(self: *Self, num: T) !void {\n            // 在尾節點後新增 num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // 如果佇列為空，則令頭、尾節點都指向該節點\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // 如果佇列不為空，則將該節點新增到尾節點後\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/krahets/hello-algo/blob/69932aed1891a7b7f6a0de88cd116d3fe13e7032/zh-hant/codes/zig/chapter_stack_and_queue/linkedlist_queue.zig#L30-L66","documentation":"Unrecoverable Zig @panic from peek() on the singly-linked-list queue. Guard `if (self.size() == 0) @panic(\"佇列為空\")` runs before `self.front.?.val`, preventing a null optional unwrap. Peeking an empty queue is defined as a logic error.","triggerScenarios":"Call peek() on a LinkedListQueue with zero elements (never enqueued, or fully dequeued). Reached by helper code that peeks before the first push or after the final pop.","commonSituations":"BFS/level-order traversal peeking after draining the last node; polling a queue before the producer enqueues; UI/log code displaying the queue head without a size check.","solutions":["Gate with `if (!q.isEmpty())` before peek().","Loop `while (!q.isEmpty())` for consumption so no peek runs at size 0.","Wrap with a ?T-returning helper for callers that legitimately face an empty queue."],"exampleFix":"// before\nconst head = q.peek();\n// after\nconst head = if (q.isEmpty()) null else q.peek();","handlingStrategy":"validation","validationCode":"// call BEFORE peek()\nif (q.isEmpty()) return null;\nconst head = q.peek();","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check isEmpty()/size() before peek().","Consume with `while (!q.isEmpty())` so peek never runs at size 0.","Build a ?T-returning wrapper if empty-peek is legitimate."],"tags":["zig","queue","peek","data-structure","empty-state"],"backgroundTag":null,"analyzedSha":"69932aed1891a7b7f6a0de88cd116d3fe13e7032","analyzedAt":"2026-08-13T23:02:37.581Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}