{"record":{"id":"f0b94675b404b811","repo":"krahets/hello-algo","slug":"queue-is-empty-f0b946","errorCode":null,"errorMessage":"Queue is empty","messagePattern":"Queue is empty","errorType":"exception","errorClass":"IndexError","httpStatus":null,"severity":"error","filePath":"en/codes/ruby/chapter_stack_and_queue/linkedlist_queue.rb","lineNumber":55,"sourceCode":"      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### Dequeue ###\n  def pop\n    num = peek\n    # Delete head node\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### Access front element ###\n  def peek\n    raise IndexError, 'Queue is empty' if is_empty?\n\n    @front.val\n  end\n\n  ### Convert linked list to Array and return ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n\n### Driver Code ###\nif __FILE__ == $0","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/krahets/hello-algo/blob/69932aed1891a7b7f6a0de88cd116d3fe13e7032/en/codes/ruby/chapter_stack_and_queue/linkedlist_queue.rb#L37-L73","documentation":"Raised by LinkedListQueue#peek (en/codes/ruby/chapter_stack_and_queue/linkedlist_queue.rb:55) when the queue is empty. peek dereferences @front.val; the guard rejects it because @front is nil when size == 0. pop calls peek first, so dequeue on an empty queue surfaces the same message.","triggerScenarios":"Calling queue.peek or queue.pop when queue.size == 0 — before the first enqueue, or after the head has advanced past every node via successive pops.","commonSituations":"A BFS work-queue drained to empty then peeked again; a producer/consumer loop where the consumer outruns the producer; test code that pops more than it enqueues.","solutions":["Check queue.is_empty? before peek or pop.","Track enqueued/dequeued counts and never dequeue more than enqueued.","Rescue IndexError around dequeue and treat empty as a normal idle state."],"exampleFix":"# before\nqueue = LinkedListQueue.new\nqueue.pop # raises IndexError, \"Queue is empty\"\n\n# after\nqueue.pop unless queue.is_empty?","handlingStrategy":"validation","validationCode":"queue.pop unless queue.is_empty?","typeGuard":"def queue_nonempty?(q); q.respond_to?(:is_empty?) && !q.is_empty?; end","tryCatchPattern":"begin\n  queue.pop\nrescue IndexError\n  nil\nend","preventionTips":["Check is_empty? before peek/pop.","Never dequeue more times than you enqueued.","Use emptiness as the idle/exit signal in consumer loops."],"tags":["ruby","queue","linked-list","precondition","indexerror"],"backgroundTag":null,"analyzedSha":"69932aed1891a7b7f6a0de88cd116d3fe13e7032","analyzedAt":"2026-08-13T23:02:37.581Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}