Debugging
Debugging
1
Program Errors
• Compiler errors (syntax errors)
• Runtime errors
• Logic errors
2
Compiler Errors
• Syntax error
• Error in usage of Java
• Detected by the compiler
• A program with compilation errors cannot
be run
• Syntax warning
• Warning message generated by the
compiler
• The program can be run
3
Compiler Errors
• Very common (but sometimes hard to
understand). Examples of syntax errors:
• Forgetting a semicolon
• Leaving out a closing bracket }
• Redeclaring a variable
• Others?
4
Compiler Errors
• Hints to help find/fix compiler errors:
• Compiler errors are cumulative: when you fix
one, others may go away
• Read the error messages issued by the
compiler!
• Realize that the error messages from the
compiler are often (seemingly) not very
helpful
• The compiler does not know what you
intended to do, it merely scanns the Java
code
5
Runtime Errors
• Runtime error: program runs but gets
an exception error message
• Program may be terminated
• Runtime errors can be caused by
• Program bugs
• Bad or unexpected input
• Hardware or software problems in the
computer system
6
Runtime Errors
• Very common runtime errors are:
• null reference (NullPointerException)
• no object is referenced by the reference
variable, i.e. it has the value null
• array index out of bounds
(ArrayIndexOutOfBoundsException)
• Running out of memory
• e.g. from creating a new object every
time through an infinite loop
7
Runtime Errors
• Hints to help find/fix runtime errors:
• Check the exception message for the method and
line number from which it came
• Note that the line in the code that caused the
exception may not be the line with the error
• Example: consider the code segment
int [] nums = new int[10];
for (int j=0; j<=10; j++)
nums[j] = j;
• The exception will be at the line
nums[j] = j;
but the error is in the previous line
8
Logic Errors
• Logic error: program runs but results
are not correct
9
Logic Errors
• Very common logic errors are:
• using == instead of the equals method
• infinite loops
• misunderstanding of operator precedence
• starting or ending at the wrong index of an
array
• If index is invalid, you would get an exception
• misplaced parentheses (so code is either
inside a block when it shouldn’t be, or vice
versa)
10
Logic Errors
• Be careful of where you declare variables!
• Keep in mind the scope of variables
• Instance variables?
• Formal parameters?
• Local variables?
• Example:
private int numStudents; // an attribute, to be
// initialized in some method
…
public void someMethod(){
int numStudents = …; // not the attribute!
…
}
11
Testing vs Debugging
• Testing: to identify any problems before
software is put to use
• “Testing can show the presence of
bugs but can never show their
absence”.
• Debugging: locating bugs and fixing
them
12
Hints for Success
• When writing code:
• Understand the algorithm before you start
coding!
• Start small!
• Write and test first simpler methods (e.g.
getters, setters, toString)
• Then write and test each of the more
complex methods individually
• Check your code first by a preliminary hand
trace
• Then try running it
13
Debugging Strategies
• Trace your code by hand
• Add main method to the class
• Add print statements to your code
14
Tracing by Hand
• Tracing by hand
• Good starting point with small programs or
simple methods
• Problem: sometimes you do what you think
the computer will do, but that is not what it
actually does
• Example: you may write that 9/5 is 1.8,
but it is really 1
• Hint: draw diagrams of reference
variables and what object(s) they are
pointing to!
15
Adding a main Method
• Adding a main method to the class
• Conventionally placed at the end of the
class code, after all the other methods
• What are the advantages of having the test
driver (main method) right in the class,
rather than creating another class that is
just a test program?
16
Using Print Statements
• Using print statements
• Insert System.out.println() statements at key
locations
• To show values of significant variables
• To show how far your code got before there
was a problem
• In the print statement, it’s a good idea to
specify
• The location of the trace (what method)
• The variable name as well as its value
17
Debuggers
• All Integrated Development Environments
have an interactive debugger feature
• You can single-step step through your
code (one statement at a time)
• You can see what is stored in variables
• You can set breakpoints
• You can “watch” a variable or expression
during execution
18
Defensive Programming
• Write robust programs
• Include checking for exceptional conditions; try
to think of situations that might reasonably
happen, and check for them
• Examples: files that don’t exist, bad input data
• Generate appropriate error messages,
and either allow the user to reenter the
data or exit from the program
• Throw exceptions (see Introduction to
Exceptions notes)
• Can aid in finding errors or in avoiding errors
• Example: invalid arguments
(IllegalArgumentException) 19