//****************************************************//
//***********Test 3 Review - November 14th, 2016*****//
//**************************************************//

-"The real reason you get a PhD is to get 5 professors gathered in the same place at the same time - which is an NP problem, by the way" -Prof. Simpkins
-Fact: In the military, sometimes the instructor would "stomp their feet" in order to note that something is particularly important...so, possibly pay attention the next time I randomly stomp.
-------------------------------------------

-So, we'll be going over Chapter 3 - the test will be here on Wednesday, usual place, usual time. You know the drill!

-Exceptions are classes, just like any other, that have super classes - they're a great example of OOP as well as the standard library, which makes them great for teaching
    -REMEMBER THE HIERARCHY: "Throwable" is a subclass of Object, "Exception" extends "Throwable," etc.
        -SO, the highest superclass of an exception is NOT "Throwable" - IT'S OBJECT! "Throwable" is the highest type of exception, however
            -Remember, THROWABLE IS INSTANTIABLE - it's NOT abstract!
    -Remember the difference between Checked vs Unchecked exceptions
        -Unchecked are exceptions that happen at runtime, and DON'T need to be thrown/ put in a try-catch statement
        -Checked exceptions NEED to be either thrown or caught - the "catch-or-declare" rule - or the compiler will throw a fit
    -ANY method, including mains, can throw an exception - but if an exception isn't caught by the time it reaches the JVM (outside of "main"), it prints out the exception's error message / "stack trace" and then terminates the program

-RANDOM REMEMBERANCE: "Liskov Substitution Principle" - you should be able to use a subclass wherever it's superclass is used
    -THIS IS BROKEN if you try to say that you're throwing a checked exception when you're actually throwing an unchecked exception
        -"Not 100% sure about this now - many people (not quite most) are moving away from exceptions where possible, and modern languages have been using them less and less", due to try-catch statements making code more complex, being harder to read, occasionally causing scope issues, etc. ~Simpkins
            -Example: At Google, Exceptions are NOT allowed to be used for certain languages (most notably C++, where exceptions are notoriously fiddly)
    -THROWS vs THROW - "throw" is used INSIDE of the method to throw an exception, "throws" is used in a method header
        -"throw" will immediately stop the method in its track if it executes - control will go to the "catch" block

-FOR FIRST EXCEPTION EXAMPLE QUESTION: 3 is wrong since A doesn't extend B, yet is thrown, BUT 2 WILL COMPILE, since C is a runtime exception, meaning the compiler won't check what we're throwing (VERIFY THIS)
    -If you declare that a method throws an exception, Java DOESN'T check to see if anything will actually ever be thrown
    -"if (true)" statements necessary to make it compilable, as otherwise, Java would freak out about never being able to reach the return statements

-COLLECTIONS - these are all INTERFACES, NOT CLASSES!

-"Iterable" is the interface with an "Iterator<>" interface inside; DOUBLE CHECK HOW THIS IS IMPLEMENTED
    -Know that "Iterable<E>" and "Iterator<E>" BOTH have to be implemented
-Iterators are most commonly used to traverse a collection
    -ESSENTIAL because they abstract getting information from a structure away from the structure itself - we don't need to know what the structure itself is in order to get / add something
-3 methods: "next", "hasNext," "remove"
    -"next" ALWAYS calls "hasNext" to check if it's at the end of the array
-FOR INNER CLASSES: use "(Inner Class Name).this.(field)" to get a field in the inner class when another method / variable with the same name exists in the outer class

-Sets have no duplicate elements and no particular order; could used a HashSet (under-the-cover uses the hashCode() method to remove duplicates), etc.

-LOOK OVER ALL REVIEW SLIDES!!!