LAB Data Structures
LAB Data Structures CS 230
Popular in Course
Popular in ComputerScienence
This 10 page Class Notes was uploaded by Jordon Hermiston on Thursday October 29, 2015. The Class Notes belongs to CS 230 at Wellesley College taught by Panagiotis Metaxas in Fall. Since its upload, it has received 16 views. For similar materials see /class/230931/cs-230-wellesley-college in ComputerScienence at Wellesley College.
Reviews for LAB Data Structures
Report this Material
What is Karma?
Karma is the currency of StudySoup.
You can buy or earn more Karma at anytime and redeem it for class notes, study guides, flashcards, and more!
Date Created: 10/29/15
Appendix B Debuggingl There are a few di erent kinds of errors that can occur in a program and it is useful to distinguish between them in order to track them down more quickly 0 Compiletime errors are produced by the compiler and usually indicate that there is something wrong with the syntax of the program Example omitting the semicolon at the end of a statement 0 Runtime errors are produced by the runtime system if something goes wrong while the program is running Most runtime errors are Exceptions Example an in nite recursion eventually causes a StackOver owExcep tion 0 Semantic errors are problems with a program that compiles and runs but doesn t do the right thing Example an expression may not be evaluated in the order you expect yielding an unexpected resu t The rst step in debugging is to gure out which kind of error you are dealing with Although the following sections are organized by error type there are some techniques that are applicable in more than one situation B1 Compiletime errors The compiler is spewing error messages If the compiler reports 100 error messages that doesn t mean there are 100 errors in your program When the compiler encounters an error it gets thrown o track for a while It tries to recover and pick up again after the rst error but sometimes it fails and it reports spurious errors In general only the rst error message is reliable I suggest that you only x one error at a time and then recompile the program You may nd that lThis appendix appears in Allen B Downey How to Think Like a Computer Scientist Java Version 2002 2 APPENDIX B DEBUGGINGl one semicolon xes 100 errors Of course if you see several legitimate error messages you might as well x more than one bug per compilation attempt I m getting a weird compiler message and it won t go away First of all read the error message carefully It is written in terse jargon but often there is a kernel of information there that is carefully hi en If nothing else the message will tell you where in the program the prob lem occurred Actually it tells you where the compiler was when it noticed a problem which is not necessarily where the error is Use the information the compiler gives you as a guideline but if you don t see an error where the compiler is pointing broaden the search Generally the error will be prior to the location of the error message but there are cases where it will be somewhere else entirely For example if you get an error message at a method invocation the actual error may be in the method de nition If you are building the program incrementally you should have a good idea about where the error is It will be in the last line you added If you are copying code from a book start by comparing your code to the book s code very carefully Check every character At the same time remember that the book might be wrong so if you see something that looks like a syntax error it might be If you don t nd the error quickly take a breath and look more broadly at the entire program Now is a good time to go through the whole program and make sure it is indented properly I won t say that good indentation makes it easy to nd syntax errors but bad indentation sure makes it harder Now start examining the code for the common syntax errors 1 Check that all parentheses and brackets are balanced and properly nested All method de nitions should be nested within a class de nition All program statements should be within a method de nition 2 Remember that upper case letters are not the same as lower case letters 9quot Check for semicolons at the end of statements and no semicolons after squigglybraces 4 Make sure that any strings in the code have matching quotation marks and that you use doublequotes not single 5 For each assignment statement make sure that the type on the left is the same as the type on the right 6 For each method invocation make sure that the arguments you provide are in the right order and have right type and that the object you are invoking the method on is the right type B N COMPILE TIME ERRORS 3 7 If you are invoking a fruitful method make sure you are doing something with the result If you are invoking a void method make sure you are not trying to do something with the result 90 If you are invoking an object method make sure you are invoking it on an object with the right type If you are invoking a class method from outside the class where it is de ned make sure you specify the class name F3 Inside an object method you can refer to the instance variables without specifying an object If you try that in a class method you will get a confusing message like Static reference to nonstatic variable77 If nothing works move on to the next sectionw I can t get my program to compile no matter What I do If the compiler says there is an error and you don t see it that might be because you and the compiler are not looking at the same code Check your develop ment environment to make sure the program you are editing is the program the compiler is compiling If you are not sure try putting an obvious and deliberate syntax error right at the beginning of the program Now compile again If the compiler doesn t nd the new error there is probably something wrong with the way you set up the project Otherwise if you have examined the code thoroughly it is time for desperate measures You should start over with a program that you can compile and then gradually add your code back 0 Make a copy of the le you are working on If you are working on Fredjava make a copy called Fredjava old 0 Delete about half the code from Fredjavai Try compiling again 7 If the program compiles now then you know the error is in the other half Bring back about half of the code you deleted and repeat 7 If the program still doesn t compile the error must be in this half Delete about half of the code and repeat 0 Once you have found and xed the error start bringing back the code you deleted a little bit at a time This process is called debugging by bisection77 As an alternative you can comment out chunks of code instead of deleting them For really sticky syntax problems though I think deleting is more reliableiyou don t have to worry about the syntax of the comments and by making the program smaller you make it more readable 4 APPENDIX B DEBUGGINGT B2 Runtime errors My program hangs If a program stops and seems to be doing nothing we say it is hanging77 Often that means that it is caught in an in nite loop or an in nite recursion o If there is a particular loop that you suspect is the problem add a print statement immediately before the loop that says entering the loop77 and another immediately after that says exiting the loop77 Run the program If you get the rst message and not the second you ve got an in nite loop Go to the section titled In nite loop77 0 Most of the time an in nite recursion will cause the program to run for a while and then produce a StackOver owException If that happens go to the section titled In nite recursion77 If you are not getting a StackOver owException but you suspect there is a problem with a recursive method you can still use the techniques in the in nite recursion section If neither of those things works start testing other loops and other recur sive methods 0 If none of those things works then it is possible that you don t understand the ow of execution in your program Go to the section titled Flow of execution77 In nite 100p If you think you have an in nite loop and think you know what loop is causing the problem add a print statement at the end of the loop that prints the values of the variables in the condition and the value of the condition For example while xgt0ampampylt0 do something to x do something to y Systemoutprintln quotx2 quot x Systemoutprintln quoty quot y Systemoutprintln quotcondition quot x gt O ampamp y lt 0 Now when you run the program you will see three lines of output for each time through the loop The last time through the loop the condition should be false If the loops keeps going you will be able to see the values of x and y and you might gure out why they are not being updated correctly B2 RUN TIME ERRORS 5 In nite recursion Most of the time an in nite recursion will cause the program to run for a while and then produce a StackOver owException If you suspect that method is causing an in nite recursion start by checking to make sure that there is a base case In other words there should be some condition that will cause the method to return without making a recursive invocation If not then you need to rethink the algorithm and identify a base case If there is a base case but the program doesn t seem to be reaching it add a print statement at the beginning of the method that prints the parameters Now when you run the program you will see a few lines of output every time the method is invoked and you will see the parameters If the parameters are not moving toward the base case you will get some ideas about why not Flow of execution If you are not sure how the ow of execution is moving through your program add print statements to the beginning of each method with a message like en tering method foo77 where foo is the name of the method Now when you run the program it will print a trace of each method as it is invoked It is often useful to print the parameters each method receives when it is invoked When you run the program check whether the parameters are reason able and check for one of the classic errorsiproviding parameters in the wrong or er When I run the program I get an Exception If something goes wrong during run time the Java runtime system prints a message that includes the name of the exception the line of the program where the problem occurred and a stack trace The stack trace includes the method that is currently running and then the method that invoked it and then the method that invoked that and so on In other words it traces the path of method invocations that got you to where you are The rst step is to examine the place in the program where the error occurred and see if you can gure out what happened NullPointerException You tried to access an instance variable or invoke a method on an object that is currently null You should gure out what variable is null and then gure out how it got to be that way Remember that when you declare a variable with an object type it is initially null until you assign a value to it For example this code causes a NullPointerException 6 APPENDIX B DEBUGGINGT Point blank System out println bla11kX ArrayIndexOutOfBoundsException The index you are using to access an array is either negative or greater than array length 1 If you can nd the site where the problem is add a print statement immediately before it to print the value of the index and the length of the array Is the array the right size Is the index the right value Now work your way backwards through the program and see where the array and the index come from Find the nearest assignment statement and see if it is doing the right thing If either one is a parameter go to the place where the method is invoked and see where the values are coming from StackOverFlowException See In nite recursion I added so many print statements I get inundated With output One of the problems with using print statements for debugging is that you can end up buried in output There are two ways to proceed either simplify the output or simplify the program To simplify the output you can remove or comment out print statements that aren t helping or combine them or format the output so it is easier to understand To simplify the program there are several things you can do First scale down the problem the program is working on For example if you are sorting an array sort a small array If the program takes input from the user give it the simplest input that causes the error Second clean up the program Remove dead code and reorganize the pro gram to make it as easy to read as possible For example if you suspect that the error is in a deeplynested part of the program try rewriting that part with simpler structure If you suspect a large method try splitting it into smaller methods and test them separately Often the process of nding the minimal test case leads you to the bug For example if you nd that a program works when the array has an even number of elements but not when it has an odd number that gives you a clue about what is going on Similarly rewriting a piece of code can help you nd subtle bugs If you make a change that you think doesn t affect the program and it does that can tip you off B3 SEMANTIC ERRORS 7 B3 Semantic errors My program doesn t work In some ways semantic errors are the hardest because the compiler and the runtime system provide no information about what is wrong Only you know what the program was supposed to do and only you know that it isn t doing it The rst step is to make a connection between the program text and the behavior you are seeing You need a hypothesis about what the program is actually doing One of the things that makes this hard is that computers run so fast You will often wish that you could slow the program down to human speed but there is no straightforward way to do that and even if there were it is not really a good way to debug ere are some questions to ask yourself o Is there something the program was supposed to do but doesn t seem to be happening Find the section of the code that performs that function and make sure it is executing when you think it should Add a print statement to the beginning of the suspect methods o Is something happening that shouldn t Find code in your program that performs that function and see if it is executing when it shouldn t o Is a section of code producing an effect that is not what you expected Make sure that you understand the code in question especially if it in volves invocations to builtin Java methods Read the documentation for the methods you invoke Try out the methods by invoking the methods directly with simple test cases and check the results In order to program you need to have a mental model of how programs work If your program that doesn t do what you expect very often the problem is not in the program it s in your mental model The best way to correct your mental model is to break the program into its components usually the classes and methods and test each component independently Once you nd the discrepancy between your model and reality you can solve the problem Of course you should be building and testing components as you develop the program If you encounter a problem there should be only a small amount of new code that is not known to be correct Here are some common semantic errors that you might want to check for o If you use the assignment operator instead of the equality operator in the condition of an if while or for statement you might get an expression that is sytactically legal but it doesn t do what you expect 0 When you apply the equality operator to an object it checks shallow equality If you meant to check deep equality you should use the equals method or de ne one for userde ned objects 8 APPENDIX B DEBUGGINGl 0 Some Java libraries expect userde ned objects to de ne methods like equals If you don t de ne them yourself you Will inherit the default behavior from the parent class Which may not be What you want 0 In general inheritance can cause subtle semantic errors because you may be executing inherited code Without realizing it Again make sure you understand the ow of execution in your program I ve got a big hairy expression and it doesn t do What I expect Writing complex expressions is ne as long as they are readable but they can be hard to debug It is often a good idea to break a complex expression into a series of assignments to temporary variables For example bobby setColor bobby getColorO darker 0 Can be reWritten as Color bobbyColor bobbygetColor Color darker bobbyColordarker 0 bobby setColor darker The explicit version is easier to read because the variable names provide addi tional documentation and easier to debug because we can check the types of the intermediate variables and display their values Another problem that can occur With big expressions is that the order of evaluation may not be What you expect For example if you are translating the expression into Java you might Write double y x 2 MathPI That is not correct because multiplication and division have the same prece dence and are evaluated from left to right So this expression computes gar2 A good way to debug expressions is to add parentheses to make the order of evaluation explicit double y x 2 MathPI Any time you are not sure of the order of evaluation use parentheses Not only Will the program be correct in the sense of doing What you intend it Will also be more readable for other people Who haven t memorized the rules of precedence B3 SEMANTIC ERRORS 9 I ve got a method that doesn t return What I expect If you have a return statement with a complex expression you don t have a chance to print the return value before returning Again you can use a tempo rary variable For example instead of public Picture fourPics Picture p1 Picture p2 Picture p3 Picture p4 return above beside p1 p2 beside p3 p4 You could write public Picture fourPics Picture p1 Picture p2 Picture p3 Picture p4 Picture rowl beside p1 p2 Picture row2 beside p3 p4 Picture grid above rowl row2 return grid Now you have the opportunity to print or display any of rowl row2 or grid before returning My print statement isn t doing anything If your use the println method the output gets displayed immediately but if you use print at least in some environments the output gets stored without being displayed until the next newline character gets output If the program terminates without producing a newline you may never see the stored output If you suspect that this is happening to you try changing all the print statements to println I m really really stuck and I need help First of all try getting away from the computer for a few minutes Computers emit waves that a ect the brain causing the following symptoms 0 Frustration andor rage o Superstitious beliefs the computer hates me and magical thinking the program only works when I wear my hat backwards77 0 Random walk programming the attempt to program by writing every possible program and choosing the one that does the right thing If you nd yourself su ering from any of these symptoms get up and go for a walk When you are calm think about the program What is it doing What are some possible causes of that behavior When was the last time you had a working program and what did you do next Sometimes it just takes time to nd a bug I often nd bugs when I am away from the computer and I let my mind wander Some of the best places to nd bugs are trains showers and in bed just before you fall asleep 10 APPENDIX B DEBUGGINGl No I really need help It happens Even the best programmers occasionally get stuck Sometimes you work on a program so long that you can t see the error A fresh pair of eyes is just the thing Before you bring someone else in make sure you have exhausted the tech niques described here You program should be as simple as possible and you should be working on the smallest input that causes the error You should have print statements in the appropriate places and the output they produce should be comprehensible You should understand the problem well enough to describe it concise y When you bring someone in to help be sure to give them the information they need 0 What kind of bug is it Compiletime runtime or semantic o If the bug occurs at compiletime or runtime what is the error message and what part of the program does it indicate 0 What was the last thing you did before this error occurred What were the last lines of code that you wrote or what is the new test case that fails o What have you tried so far and what have you learned When you nd the bug take a second to think about what you could have done to nd it faster Next time you see something similar you will be able to nd the bug more quickly Remember in this class the goal is not to make the program work The goal is to learn how to make the program work
Are you sure you want to buy this material for
You're already Subscribed!
Looks like you've already subscribed to StudySoup, you won't need to purchase another subscription to get this material. To access this material simply click 'View Full Document'