{"record":{"id":"dbac563f3e85a6c6","repo":"donnemartin/interactive-coding-challenges","slug":"array-cannot-be-none","errorCode":null,"errorMessage":"array cannot be None","messagePattern":"array cannot be None","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"online_judges/merge_ranges/merge_ranges_solution.ipynb","lineNumber":140,"sourceCode":"  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Code\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class Solution(object):\\n\",\n    \"\\n\",\n    \"    def merge_ranges(self, array):\\n\",\n    \"        if array is None:\\n\",\n    \"            raise TypeError('array cannot be None')\\n\",\n    \"        if not array:\\n\",\n    \"            return array\\n\",\n    \"        sorted_array = sorted(array)\\n\",\n    \"        merged_array = [sorted_array[0]]\\n\",\n    \"        for index, item in enumerate(sorted_array):\\n\",\n    \"            if index == 0:\\n\",\n    \"                continue\\n\",\n    \"            start_prev, end_prev = merged_array[-1]\\n\",\n    \"            start_curr, end_curr = item\\n\",\n    \"            if end_prev < start_curr:\\n\",\n    \"                # No overlap, add the entry\\n\",\n    \"                merged_array.append(item)\\n\",\n    \"            else:\\n\",\n    \"                # Overlap, update the previous entry's end value\\n\",\n    \"                merged_array[-1] = (start_prev, max(end_prev, end_curr))\\n\",\n    \"        return merged_array\"\n   ]\n  },","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/donnemartin/interactive-coding-challenges/blob/358f2cc60426d5c4c3d7d580910eec9a7b393fa9/online_judges/merge_ranges/merge_ranges_solution.ipynb#L122-L158","documentation":"Raised by Solution.merge_ranges when the array argument is None; iterating/sorting None would crash with a less clear TypeError, so the method fails fast with an explicit message. None is treated as a programming/caller error, distinct from an empty list which returns [].","triggerScenarios":"Calling merge_ranges(None) or passing a variable that was initialized to None and never assigned (e.g. a failed fetch of meeting ranges).","commonSituations":"Optional upstream data (CSV column, API response field) that is None when missing, or a default parameter of None used as a sentinel.","solutions":["Initialize the argument to [] instead of None when data may be empty.","Guard at the call site: merge_ranges(ranges or []).","Catch TypeError if None can legitimately flow through and handle it."],"exampleFix":"# before\nmerged = Solution().merge_ranges(meetings)  # meetings may be None\n\n# after\nmerged = Solution().merge_ranges(meetings or [])","handlingStrategy":"type-guard","validationCode":"ranges = ranges if ranges is not None else []\nmerged = Solution().merge_ranges(ranges)","typeGuard":"def is_range_list(x):\n    return isinstance(x, list) and all(isinstance(r, (list, tuple)) and len(r) == 2 for r in x)","tryCatchPattern":"try:\n    merged = Solution().merge_ranges(ranges)\nexcept TypeError as e:\n    if 'cannot be None' in str(e):\n        merged = []\n    else:\n        raise","preventionTips":["Never use None as the empty-input sentinel; use [].","Coalesce optional values with 'or []' before passing."],"tags":["python","null-check","input-validation","typeerror"],"backgroundTag":"none-argument-guard","analyzedSha":"358f2cc60426d5c4c3d7d580910eec9a7b393fa9","analyzedAt":"2026-08-28T10:16:54.480Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}