Skills-4-SE runtime-error-explainer
Explains runtime errors and compilation failures with actionable debugging guidance. Use when Python or Java code throws runtime exceptions (NullPointerException, TypeError, AttributeError, etc.), compilation errors (syntax errors, type mismatches, import failures), or dependency issues. Analyzes error messages, stack traces, and code context to identify root causes and provide concrete fixes with examples. Distinct from test-related errors - focuses on errors during normal code execution and build processes.
git clone https://github.com/ArabelaTso/Skills-4-SE
T=$(mktemp -d) && git clone --depth=1 https://github.com/ArabelaTso/Skills-4-SE "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/runtime-error-explainer" ~/.claude/skills/arabelatso-skills-4-se-runtime-error-explainer && rm -rf "$T"
skills/runtime-error-explainer/SKILL.mdRuntime Error Explainer
Analyze runtime and compilation errors with clear explanations and actionable fixes.
Core Capabilities
This skill helps debug runtime and compilation errors by:
- Parsing error output - Extract key information from error messages and stack traces
- Identifying root causes - Determine why errors occur during execution or compilation
- Explaining clearly - Translate technical errors into understandable language
- Providing fixes - Suggest concrete code changes with before/after examples
- Preventing recurrence - Recommend best practices to avoid similar errors
Error Analysis Workflow
Step 1: Gather Error Context
Collect all relevant information about the error.
Essential Information:
- Complete error message and stack trace
- Programming language and version
- Code that triggered the error
- How the error was triggered (command, action, input)
Additional Context (if available):
- Recent code changes
- Environment details (OS, IDE, dependencies)
- Input data or parameters that caused error
- Configuration files
How to Gather:
# Python - Run with full traceback python script.py # Python - More verbose error output python -v script.py # Java - Compile with verbose output javac -verbose MyClass.java # Java - Run with stack trace java -XX:+ShowCodeDetailsInExceptionMessages MyClass
Step 2: Categorize the Error
Identify the error type using
references/error_catalog.md:
Error Categories:
-
Syntax/Compilation Errors
- Python: SyntaxError, IndentationError
- Java: Compilation errors (missing semicolons, type errors)
-
Runtime Errors
- Python: TypeError, AttributeError, ValueError, KeyError, IndexError
- Java: NullPointerException, IllegalArgumentException, ArrayIndexOutOfBoundsException
-
Import/Dependency Errors
- Python: ImportError, ModuleNotFoundError
- Java: ClassNotFoundException, NoClassDefFoundError
-
Type Errors
- Python: TypeError (wrong types in operations)
- Java: Type mismatch compilation errors
-
Name/Reference Errors
- Python: NameError, UnboundLocalError
- Java: Variable not initialized, cannot find symbol
Step 3: Extract Key Information
Pull out critical details from the error.
From Error Message:
- Error type and name
- Error description
- Line number where error occurred
- File name
- Variable names or values involved
From Stack Trace:
- Execution path leading to error
- Function/method call chain
- Origin of error in your code vs. library code
Example Python Error:
Traceback (most recent call last): File "app.py", line 45, in <module> result = process_user(None) File "app.py", line 12, in process_user return user.name.upper() AttributeError: 'NoneType' object has no attribute 'name'
Extracted Information:
- Error type:
AttributeError - Problem: Tried to access
on.nameNone - Location:
line 12, inapp.py
functionprocess_user - Root cause:
parameter isuserNone
Step 4: Identify Root Cause
Analyze why the error occurred.
Common Root Causes:
Syntax/Compilation:
- Missing or mismatched parentheses/brackets
- Incorrect indentation (Python)
- Missing semicolons (Java)
- Typos in keywords or variable names
Runtime:
- Null/None values where objects expected
- Wrong data types in operations
- Index out of bounds
- Missing dictionary keys
- Division by zero
- File not found
Import/Dependency:
- Module/package not installed
- Incorrect import path
- Circular imports
- Classpath issues (Java)
See
references/error_catalog.md for detailed root cause analysis for each error type.
Step 5: Provide Explanation
Structure the explanation with clear sections.
Explanation Template:
## Error Summary [One-sentence description of what went wrong] ## What Happened [Explain the error in plain language] **Error Type:** [Error name and category] **Location:** [File and line number] **Problem:** [What specifically failed] ## Root Cause [Explain why this happened - the underlying issue] ## How to Fix ### Solution 1: [Most common fix] ⭐ [Specific code change or action] ```[language] # Before [problematic code] # After [fixed code]
Why this works: [Brief explanation]
Solution 2: [Alternative approach]
[Another fix if Solution 1 doesn't apply]
Verification
[How to verify the fix works]
[command to test]
Prevention
[How to avoid this error in future]
- [Best practice 1]
- [Best practice 2]
- [Tool or technique recommendation]
### Step 6: Suggest Next Steps Provide actionable debugging guidance. **If fix is straightforward:** - Show exact code change - Provide command to verify - Mention related code to review **If more investigation needed:** - Suggest adding print/logging statements - Recommend debugging tools - Propose simplification to isolate issue **If environmental issue:** - Suggest checking installation/versions - Recommend environment verification - Propose configuration review ## Common Error Patterns ### Python: AttributeError - NoneType **Error:**
AttributeError: 'NoneType' object has no attribute 'method_name'
**Explanation:** ```markdown ## Error Summary Attempted to call a method on None instead of an object instance. ## What Happened **Error Type:** AttributeError **Problem:** Code tried to access an attribute or method on `None` Python functions return `None` by default if no explicit return statement is used. When you try to call a method on `None`, you get this error. ## Root Cause Common causes: 1. Function didn't return a value but you expected an object 2. Variable not initialized before use 3. Database/API query returned no result 4. Method called before object creation ## How to Fix ### Solution 1: Add None check ⭐ ```python # Before result = get_user(user_id) name = result.name # Crashes if result is None # After result = get_user(user_id) if result is not None: name = result.name else: name = "Unknown"
Why this works: Defensively handles the case where
get_user returns None.
Solution 2: Fix the source function to always return a value
# Before def get_user(user_id): if user_id in users: return users[user_id] # Implicitly returns None # After def get_user(user_id): if user_id in users: return users[user_id] return User(id=user_id, name="Guest") # Return default user
Solution 3: Use walrus operator with conditional (Python 3.8+)
# Assign and check in one line if (result := get_user(user_id)) is not None: name = result.name
Verification
python script.py
Prevention
- Always check return values before using them
- Use type hints:
def get_user(user_id: int) -> Optional[User]: - Add assertions:
assert result is not None, "User not found" - Use Optional type and handle None explicitly
### Python: ImportError / ModuleNotFoundError **Error:**
ModuleNotFoundError: No module named 'requests'
**Explanation:** ```markdown ## Error Summary Python cannot find the module you're trying to import. ## What Happened **Error Type:** ModuleNotFoundError (Python 3) or ImportError (Python 2) **Problem:** The module is not installed or not in Python's path ## Root Cause 1. Package not installed via pip 2. Wrong virtual environment activated 3. Typo in module name 4. Package installed in different Python version ## How to Fix ### Solution 1: Install the missing package ⭐ ```bash # Install package pip install requests # Or if using Python 3 explicitly pip3 install requests # Or with specific Python version python -m pip install requests
Why this works: Makes the package available to your Python environment.
Solution 2: Activate correct virtual environment
# Check current environment which python # Activate virtual environment source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows # Install package in virtual environment pip install requests
Solution 3: Check for typos
# Wrong import reqests # Typo # Correct import requests
Verification
python -c "import requests; print('Success')"
Prevention
- Use requirements.txt:
pip install -r requirements.txt - Use virtual environments for project isolation
- Document all dependencies
- Use
to capture dependenciespip freeze > requirements.txt
### Java: NullPointerException **Error:**
Exception in thread "main" java.lang.NullPointerException at com.example.MyClass.process(MyClass.java:25)
**Explanation:** ```markdown ## Error Summary Attempted to use an object reference that is null. ## What Happened **Error Type:** NullPointerException **Location:** MyClass.java, line 25 **Problem:** Tried to access a method or field on a null object ## Root Cause Common causes: 1. Object not initialized before use 2. Method returned null unexpectedly 3. Array element is null 4. Forgotten to instantiate object ## How to Fix ### Solution 1: Add null check ⭐ ```java // Before String name = user.getName().toUpperCase(); // After if (user != null && user.getName() != null) { String name = user.getName().toUpperCase(); } else { String name = "UNKNOWN"; }
Why this works: Prevents accessing methods on null references.
Solution 2: Use Optional (Java 8+)
// Before public User getUser(int id) { return userMap.get(id); // Returns null if not found } String name = getUser(123).getName(); // NPE if user not found // After public Optional<User> getUser(int id) { return Optional.ofNullable(userMap.get(id)); } String name = getUser(123) .map(User::getName) .orElse("Unknown");
Solution 3: Initialize objects properly
// Before private User user; // Field is null by default public void process() { user.getName(); // NullPointerException } // After private User user = new User(); // Initialize at declaration // Or in constructor public MyClass() { this.user = new User(); }
Solution 4: Use Objects utility (Java 7+)
import java.util.Objects; // Throw meaningful exception if null Objects.requireNonNull(user, "User must not be null"); String name = user.getName();
Verification
javac MyClass.java && java MyClass
Prevention
- Initialize all object fields
- Use Optional for potentially null values
- Add @Nullable/@NonNull annotations
- Enable null-safety warnings in IDE
- Consider using Objects.requireNonNull() for critical parameters
### Java: ClassNotFoundException **Error:**
java.lang.ClassNotFoundException: com.example.MyClass at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
**Explanation:** ```markdown ## Error Summary Java cannot find the specified class at runtime. ## What Happened **Error Type:** ClassNotFoundException **Problem:** Class exists in source code but not found when running ## Root Cause 1. Class not in classpath 2. Package name doesn't match directory structure 3. .class file not compiled 4. Typo in class name 5. JAR file not included ## How to Fix ### Solution 1: Check classpath ⭐ ```bash # Compile with source files in correct package structure javac -d bin src/com/example/MyClass.java # Run with classpath pointing to bin directory java -cp bin com.example.MyClass
Why this works: Ensures compiled .class files are in classpath.
Solution 2: Verify package structure matches directories
Project structure should be: src/ com/ example/ MyClass.java
// MyClass.java must declare matching package package com.example; public class MyClass { public static void main(String[] args) { System.out.println("Hello"); } }
Solution 3: Include JAR files in classpath
# If MyClass is in external JAR java -cp "lib/mylib.jar:." com.example.MyClass # Windows (use semicolon) java -cp "lib/mylib.jar;." com.example.MyClass
Solution 4: Use Maven/Gradle (recommended)
Maven automatically manages classpaths.
<!-- pom.xml --> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>my-library</artifactId> <version>1.0.0</version> </dependency> </dependencies>
Verification
# Check if class file exists ls bin/com/example/MyClass.class # Verify package declaration matches head -1 src/com/example/MyClass.java
Prevention
- Use build tools (Maven, Gradle) to manage dependencies
- Follow Java package naming conventions
- Keep package declarations synchronized with directory structure
- Use IDE features to auto-manage imports and packages
### Python: SyntaxError **Error:**
File "script.py", line 10 if x == 5 ^ SyntaxError: invalid syntax
**Explanation:** ```markdown ## Error Summary Code has syntax error preventing Python from parsing it. ## What Happened **Error Type:** SyntaxError **Location:** Line 10 **Problem:** Missing colon at end of if statement ## Root Cause Python syntax violated - common causes: - Missing colons after if/for/while/def/class - Unmatched parentheses/brackets - Incorrect indentation - Invalid operator usage ## How to Fix ### Solution 1: Add missing colon ⭐ ```python # Before if x == 5 print("Five") # After if x == 5: print("Five")
Why this works: Python requires colon to start code blocks.
Solution 2: Check for unmatched brackets
# Before result = calculate(a, b, (c + d) print(result) # After result = calculate(a, b, (c + d)) print(result)
Solution 3: Fix indentation
# Before (mixing tabs and spaces) def my_function(): x = 5 return x # Indentation error # After (consistent spaces) def my_function(): x = 5 return x
Verification
# Python will parse file without running python -m py_compile script.py # Or just run it python script.py
Prevention
- Use IDE with syntax highlighting
- Enable linting (pylint, flake8)
- Use auto-formatters (black, autopep8)
- Configure editor to show whitespace characters
### Java: Type Mismatch Compilation Error **Error:**
MyClass.java:15: error: incompatible types: int cannot be converted to String String result = 42; ^
**Explanation:** ```markdown ## Error Summary Trying to assign value of wrong type to variable. ## What Happened **Error Type:** Compilation error - type mismatch **Location:** Line 15 **Problem:** Assigning int (42) to String variable ## Root Cause Java is statically typed - variables can only hold values of declared type or compatible types. ## How to Fix ### Solution 1: Convert type explicitly ⭐ ```java // Before String result = 42; // After String result = String.valueOf(42); // or String result = Integer.toString(42); // or String result = "" + 42; // Concatenation with empty string
Why this works: Explicitly converts int to String.
Solution 2: Change variable type
// Before String result = 42; // After int result = 42;
Solution 3: Use correct literal type
// Before (assigning int to double) double price = 10; // Works but not ideal // After (use double literal) double price = 10.0;
Verification
javac MyClass.java
Prevention
- Use proper type conversions
- Be aware of implicit type casting rules
- Use IDE suggestions for quick fixes
- Understand primitive types vs object types (int vs Integer)
## Language-Specific Notes ### Python Error Characteristics **Common Patterns:** - Runtime errors only (no compilation phase) - Clear stack traces with file/line numbers - Descriptive error messages - Exception hierarchy (all inherit from BaseException) **Key Files to Check:** - Module `__init__.py` for package imports - `sys.path` for import resolution - Virtual environment activation **Debugging Tools:** ```bash # Interactive debugging python -m pdb script.py # Print traceback programmatically import traceback traceback.print_exc()
Java Error Characteristics
Common Patterns:
- Compilation errors vs runtime errors
- Less descriptive error messages than Python
- Line numbers in stack traces
- Checked vs unchecked exceptions
Key Files to Check:
(Maven) orpom.xml
(Gradle)build.gradle- Package structure matches directory structure
- CLASSPATH environment variable
Debugging Tools:
# Verbose compilation javac -verbose MyClass.java # Show detailed exception messages (Java 14+) java -XX:+ShowCodeDetailsInExceptionMessages MyClass # Using debugger jdb MyClass
Quick Reference: Error Categories
| Category | Python Examples | Java Examples | Common Fix |
|---|---|---|---|
| Null/None errors | AttributeError on None | NullPointerException | Add null checks |
| Type errors | TypeError | Type mismatch error | Fix types or convert |
| Import errors | ModuleNotFoundError | ClassNotFoundException | Check imports/classpath |
| Syntax errors | SyntaxError | Compilation errors | Fix syntax |
| Index errors | IndexError | ArrayIndexOutOfBoundsException | Check array bounds |
| Name errors | NameError | Cannot find symbol | Fix variable names |
| Key errors | KeyError | - | Check dict keys exist |
Resources
- Comprehensive catalog of Python and Java errors with detailed examples, root causes, and solutionsreferences/error_catalog.md
- Systematic debugging strategies, tools, and techniques for complex errorsreferences/debugging_guide.md
Best Practices
- Read the full error message - Don't skip stack traces
- Identify error location - Line number and file are critical
- Understand the error type - Each type has typical causes
- Check recent changes - Often errors relate to recent edits
- Reproduce consistently - Ensure error happens reliably
- Simplify to isolate - Remove code until error disappears
- Use debugging tools - Debuggers are more powerful than print statements
- Fix root cause, not symptoms - Adding try/except without understanding hides problems
- Add defensive code - Null checks, type validation prevent errors
- Learn from errors - Understand why it happened to prevent recurrence