Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Programming in Java Exception Handling 蔡文能 交通大學資訊工程學系 [email protected] 交通大學資訊工程學系 Java More Java Examples Exception example try { readFromFile("datafile"); } catch (FileNotFoundException e) { System.err.println("Error: File not found"); } 交通大學資訊工程學系 蔡文能 第2頁 Java More Java Examples Exception Handling: Some Options Print something Throw a new exception Re-Throw the exception Fix the problem Exit 交通大學資訊工程學系 蔡文能 第3頁 Java More Java Examples Exception Handling: Printing You can print a stack trace by calling the exception method printStackTrace() Sometimes it's better to send error messages to stderr: System.err.println("Error: invalid thingy"); Some applications log error messages file logging service (syslog). 交通大學資訊工程學系 蔡文能 第4頁 Java More Java Examples Exception Handling: throw • You can throw an exception from an exception handler (a catch block). • Allows you to change exception type and/or error message. • You can also alter the base of the stack trace •fillInStackTrace() 交通大學資訊工程學系 蔡文能 第5頁 Java More Java Examples Exception example public class ThrowUp { public static void main(String[ ] args) { String tmp; try { // generate an ArrayIndexOutOfBoundsExceptions .. // .. (on purpose!). for (int i=0 ; i<args.length+10 ; i++) { tmp = args[i]; } System.out.println("I made it!"); } catch (ArrayIndexOutOfBoundsException up) { throw new SecurityException("Trouble"); } } // main } 交通大學資訊工程學系 蔡文能 第6頁 Java More Java Examples Exception Handling: Re-throw • You can throw an exception from an exception handler (a catch block) without changing anything: • called rethrowing • The caller needs to deal with the exception. • This also happens if you don't catch the exception! • sometimes you need to take some action and then rethrow the exception. 交通大學資訊工程學系 蔡文能 第7頁 Java More Java Examples Another way to re-throw You can allow selected types of exceptions to be propogated to the caller of your method: void blah() throws IOException { Within blah() you don't need to catch these exceptions (to be able to compile). 交通大學資訊工程學系 蔡文能 第8頁 Java More Java Examples Exception Handling: Fix the problem. • You can't fix things and then resume execution automatically • you can do this in C++. • You can have a loop the retries the code again. 交通大學資訊工程學系 蔡文能 第9頁 Java More Java Examples Exception Handling: exiting • Sometimes the error is fatal, and you want to stop the program immediately. System.exit(); 交通大學資訊工程學系 蔡文能 第10頁 Java Wait.java More Java Examples public class Wait { public static void main(String[ ] args) { boolean done=false; int seconds=0; try { seconds = Integer.parseInt(args[0]); } catch (Exception e) { System.out.println("Please specify the number of seconds"); System.exit(1); } long initialtime = System.currentTimeMillis( ); while (!done) { try { if (System.currentTimeMillis()-initialtime < seconds*1000) throw new Exception("Not Yet - keep trying"); done=true; } catch (Exception e) { System.out.println(e); } } System.out.println("Done!\n"); } } 交通大學資訊工程學系 蔡文能 第11頁 Java More Java Examples How/when do you generate exceptions? Use throw: throw new Exception("broken!"); You can use throw anywhere. you detect some error that means the following code should not be executed. In some cases, you can think of throw as an alternate return 交通大學資訊工程學系 蔡文能 第12頁 Java More Java Examples Exception Enforcement In general, you do the following: specify what exceptions each method can generate. (throw) write code to catch all exceptions that can be generated by a method call. The compiler (usually) enforces this it is a compilation error to call a method without catching it's declared exception types. 交通大學資訊工程學系 蔡文能 第13頁 Java More Java Examples RunTime Exceptions There are exceptions that are generated by the system (that are usually caused by programming mistakes): NullPointerException (null references) ArrayIndexOutOfBoundsException If you don't catch these, a stack trace will be generated and the program will terminate. The compiler does not force you to catch these exceptions. 交通大學資訊工程學系 蔡文能 第14頁 Java More Java Examples Exception Types Exceptions are objects! Exception types are classes. A (quite large!) hierarchy of classes. All exception types are derived from the class Exception there are some methods defined in this base class. 交通大學資訊工程學系 蔡文能 第15頁 Java NullPointer.java import java.util.*; public class NullPointer { public static void main(String[ ] args) { Date f = new Date(); f=null; PrintSomething2(f); // comment out to test PrintSomething PrintSomething(f); } // no checks, if x is null runtime exception default behavior static void PrintSomething(Object x) { System.out.println(x.getClass( ).getName()); } // we explicitly check for runtime exception! static void PrintSomething2(Object x) { try { System.out.println(x.getClass().getName()); } catch (RuntimeException re) { System.out.println("Fatal Error!"); System.exit(1); } } // main } 交通大學資訊工程學系 蔡文能 More Java Examples 第16頁 Java More Java Examples Exception Type Hierarchy (partial) Throwable Exception Error VirtualMachineError RunTimeException IOException NullPointerException EOFException ArithmeticException 交通大學資訊工程學系 蔡文能 第17頁 Java More Java Examples Some Exception Methods These are actually inherited from throwable printStackTrace() fillInStackTrack() getMessage() 交通大學資訊工程學系 蔡文能 第18頁 Java More Java Examples Creating Your Own Exception Types It is often useful to create your own type of exception. generally all you create is a name. you can get fancy and add new methods to your exception class(es). User-defined Exception Type class FooException extends Exception { } // .. class BlahException extends Exception { BlahException(){} BlahException(String s) { super(s); } } // .. throw new BlahException("Invalid blah"); 交通大學資訊工程學系 蔡文能 第19頁 Java More Java Examples using finally try { statements . . . } catch (ExceptionType1 ename1) { error handling statements . . . } catch (ExceptionType2 ename2) { error handling statements . . . } finally { … this code always executed … } 交通大學資訊工程學系 蔡文能 第20頁 Java More Java Examples Why finally? What is there to clean up? No memory cleanup required in Java! No destructors to call! Sometimes you need to set the state of things (fields) to some stable (acceptable) state. 交通大學資訊工程學系 蔡文能 第21頁 Java More Java Examples Exception Handling 謝謝捧場 http://www.csie.nctu.edu.tw/~tsaiwn/oop/ 蔡文能 交通大學資訊工程學系 蔡文能 第22頁