1: Whatever is inside the finally block will always be executed, regardless of whether the code throws an exception or not. It's often used to clean up resources such as closing files or connections. Without a catch clause, any thrown exception in your try block will abort execution, jump to your finally block and run that code, then let the thrown exception propagate upwards to the calling method. That is, a finally clause is not a replacement for a catch clause.
2: static initializers contain code that will run when that class is loaded by the JVM. I believe a class is loaded the first time one of its methods/fields/constructors are referenced (not necesssarily invoked) by another class. Static initializers look like this:
static {
System.out.println("Class loaded");
}
After coding Java for 10 years I've never had any need for them so I wouldn't worry about them.