CS61B Lecture #12: Additional OOP Details, Exceptions
Last modified: Wed Feb 19 13:35:52 2020
CS61B: Lecture #12 1
Copyright By PowCoder代写 加微信 powcoder
Parent Constructors
• In lecture notes #5, talked about how Java allows implementer of a class to control all manipulation of objects of that class.
• In particular, this means that Java gives the constructor of a class the first shot at each new object.
• When one class extends another, there are two constructors—one for the parent type and one for the new (child) type.
• In this case, Java guarantees that one of the parent’s constructors is called first. In effect, there is a call to a parent constructor at the beginning of every one of the child’s constructors.
• You can call the parent’s constructor yourself explicitly.
class Figure {
public Figure(int sides) {
Last modified: Wed Feb 19 13:35:52 2020
CS61B: Lecture #12 2
class Rectangle extends Figure { public Rectangle() {
super(4); }…
Default Constructors
• By default, Java calls the “default” (parameterless) constructor if there is no explicit constructor called.
/* This… */
class Thingy extends Rectangle { public Thingy() {
setThingsUp();
• And it creates a default constructor for a class if no other con- structor is defined for the class.
/* This… */
class Crate { }
/* Is equivalent to… */
class Crate { public Crate() {
/* And thus to… */
class Crate { public Crate() {
Last modified: Wed Feb 19 13:35:52 2020
CS61B: Lecture #12 3
/* Is equivalent to… */
class Thingy extends Rectangle { public Thingy() {
setThingsUp();
class Figure {
public Figure(int sides) {
class Rectangle extends Figure { }
Last modified: Wed Feb 19 13:35:52 2020
CS61B: Lecture #12 4
What Happens Here?
What Happens Here?
class Figure { class Rectangle extends Figure { public Figure(int sides) { }
Answer: Compiler error. Rectangle has an implicit constructor that tries to call the default construvtor in Figure, but there isn’t one.
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 5
Using an Overridden Method
• Suppose that you wish to add to the action defined by a superclass’s method, rather than to completely override it.
• The overriding method can refer to overridden methods by using the special prefix super.
• For example, you have a class with expensive functions, and you’d like a memoizing version of the class.
class ComputeHard {
int cogitate(String x, int y) { … }
class ComputeLazily extends ComputeHard { int cogitate(String x, int y) {
if (don’t already have answer for this x and y) {
int result = super.cogitate(x, y); // <<< Calls overridden function memoize (save) result;
return result;
return memoized result; }
Last modified: Wed Feb 19 13:35:52 2020
CS61B: Lecture #12 6
interface Storage { void put(Object x); Object get();
class Monitor implements Storage {
int gets, puts;
private Storage store;
Monitor(Storage x) { store = x; gets = puts = 0; } public void put(Object x) { puts += 1; store.put(x); } public Object get() { gets += 1; return store.get(); }
// ORIGINAL
Storage S = something; f(S);
// INSTRUMENTED
Monitor S = new Monitor(something); f(S);
System.out.println(S.gets + " gets");
Trick: Delegation and Wrappers
• Not always appropriate to use inheritance to extend something.
• Homework gives example of a TrReader, which contains another Reader, to which it delegates the task of actually going out and reading characters.
• Another example: a class that instruments objects:
Monitor is called a wrapper class.
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 7
What to do About Errors?
• Large amount of any production program devoted to detecting and responding to errors.
• Some errors are external (bad input, network failures); others are internal errors in programs.
• When method has stated precondition, it’s the client’s job to comply.
• Still, it’s nice to detect and report client’s errors.
• In Java, we throw exception objects, typically:
throw new SomeException (optional description);
• Exceptions are objects. By convention, they are given two construc- tors: one with no arguments, and one with a descriptive string argu- ment (which the exception stores).
• Java system throws some exceptions implicitly, as when you deref- erence a null pointer, or exceed an array bound.
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 8
Catching Exceptions
• A throw causes each active method call to terminate abruptly, until
(and unless) we come to a try block.
• Catch exceptions and do something corrective with try:
Stuff that might throw exception;
} catch (SomeException e) { Do something reasonable;
} catch (SomeOtherException e) { Do something else reasonable;
Go on with life;
• When SomeException exception occurs during “Stuff. . . ” and is not handled there, we immediately “do something reasonable” and then “go on with life.”
• Descriptive string (if any) available as e.getMessage() for error messages and the like.
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 9
Catching Exceptions, II
• Using a supertype as the parameter type in a catch clause will catch
any subtype of that exception as well:
Code that might throw a FileNotFoundException or a
MalformedURLException ; catch (IOException ex) {
Handle any kind of IOException; }
• Since FileNotFoundException and MalformedURLException both in- herit from IOException, the catch handles both cases.
• Subtyping means that multiple catch clauses can apply; Java takes the first.
• Stylistically, it’s nice to be more (concrete) about exception types where possible.
• In particular, our style checker will therefore balk at the use of Exception, RuntimeException, Error, and Throwable as exception supertypes.
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 10
Catching Exceptions, III
• There’s a relatively new shorthand for handling multiple exceptions the same way:
Code that might throw IllegalArgumentException
or IllegalStateException;
catch (IllegalArgumentException|IllegalStateException ex) {
Handle exception; }
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 11
Exceptions: Checked vs. Unchecked
• The object thrown by throw command must be a subtype of Throwable
(in java.lang).
• Java pre-declares several such subtypes, among them
– Error, used for serious, unrecoverable errors;
– Exception, intended for all other exceptions;
– RuntimeException, a subtype of Exception intended mostly for programming errors too common to be worth declaring.
• Pre-declared exceptions are all subtypes of one of these.
• Any subtype of Error or RuntimeException is said to be unchecked.
• All other exception types are checked.
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 12
Unchecked Exceptions
• Intended for
– Programmer errors: many library functions throw IllegalArgumentException when one fails to meet a precondi- tion.
– Errors detected by the basic Java system: e.g.,
∗ Executing x.y when x is null,
∗ Executing A[i] when i is out of bounds,
∗ Executing (String) x when x turns out not to point to a String.
– Certain catastrophic failures, such as running out of memory. • May be thrown anywhere at any time with no special preparation.
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 13
Checked Exceptions
• Intended to indicate exceptional circumstances that are not neces- sarily programmer errors. Examples:
– Attempting to open a file that does not exist. – Input or output errors on a file.
– Receiving an interrupt.
• Every checked exception that can occur inside a method must ei- ther be handled by a try statement, or reported in the method’s declaration.
• For example,
void myRead() throws IOException, InterruptedException { ... }
means that myRead (or something it calls) might throw IOException or InterruptedException.
• Language Design: Why did Java make the following illegal?
class Parent { class Child extends Parent {
void f() { ... } void f () throws IOException { ... }
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 14
class MyBad extends Exception { public IntList errs; MyBad(IntList nums) { errs=nums; }
} catch (MyBad e) {
... e.errs ...
Good Practice
• Throw exceptions rather than using print statements and System.exit everywhere,
• . . . because response to a problem may depend on the caller, not just method where problem arises.
• Nice to throw an exception when programmer violates preconditions.
• Particularly good idea to throw an exception rather than let bad
input corrupt a data structure.
• Good idea to document when methods throw exceptions.
• To convey information about the cause of exceptional condition, put it into the exception rather than into some global variable:
Last modified: Wed Feb 19 13:35:52 2020 CS61B: Lecture #12 15
程序代写 CS代考 加微信: powcoder QQ: 1823890830 Email: powcoder@163.com