1.异常参数
所有标准异常类都有两个构造器:一个是默认的,另一个是以字符串作为参数的。
throw new NullPointerException("this is null");
2.捕获异常
如果方法内部抛出异常,则结束,要是不希望结束,加上try
try{
//code that might generate exceptions
}catch(){
}
3.创建自定义异常,java提供的异常体系不可能预见所有的错误。
对于异常来说最重要的就是类名,大多数情况下已经够用。
class SimpleException extends Exception{}
捕到异常后
e.printStackTrace() 将信息输出到标准错误流。
e.printStackTrace(System.out) 输到标准输出
其实是System.err和System.out的区别
System.out.println 能重定向到别的输出流,这样的话你在屏幕上将看不到打印的东西了,如输出到
一个txt的log日志中.而System.err.println只能在屏幕上实现打印,即使你重定向了也一样。
4.异常和记录日志
5.异常说明
void f() throws TooBig,TooSmall{
}
经常和try -catch两者选一,可以声明方法将抛出异常,实际上却不抛出。
这种在编译期间被强制检查的异常称为被检查的异常。
6.捕获所有异常
public class ExceptionMethods {
public static void main(String[] args) {
try {
throw new Exception("My Exception");
} catch(Exception e) {
print("Caught Exception");
print("getMessage():" + e.getMessage());
print("getLocalizedMessage():" +
e.getLocalizedMessage());
print("toString():" + e);
print("printStackTrace():");
e.printStackTrace(System.out);
}
}
} /* Output:
Caught Exception
getMessage():My Exception
getLocalizedMessage():My Exception
toString():java.lang.Exception: My Exception
printStackTrace():
java.lang.Exception: My Exception
at ExceptionMethods.main(ExceptionMethods.java:8)
每个方法都比前一个提供更多信息,实际上他们每个都是前一个的超集。
7.栈轨迹
printStackTrace()所提供的信息可以通过getStackTrace()方法访问,返回一个由栈轨迹元素组成的数组。
8.重新抛出异常
一种是包括原来的异常信息,没有更新 throw e;
另一种是刷新异常信息,去掉旧的异常,throw (Exception)e.fillInStackTrace();
第二种同样可以throw new OneException()来代替。
异常链
9.java标准异常
Throwable对象分为两种类型:Error用来表示编译时和系统错误。(一般不用我们关心)
检查性异常 Exception 是可以被抛出的基本类型。
而java.lang.RuntimeException继承自java.lang.Exception. 程序存在bug如数组越界,空指针等。
10.finally
无论try块中异常是否抛出,他们都能执行。
11.异常丢失
throws new OneException();
throws new TwoException();
第一个将被覆盖。
12.异常限制
当子类继承父类并覆盖方法时候,只能抛出基类方法的异常说明里列出的那些异常。
13.构造器
其实这里讲了一个编程时要注意的问题
try {
in = new BufferedReader(new FileReader(fname));
} catch(FileNotFoundException e) {
throw e;
}
finally{
in.close();
}
如果in打开失败 finally中却要关闭,就出问题了。
try {
InputFile in = new InputFile("Cleanup.java");
try {
String s;
int i = 1;
while((s = in.getLine()) != null);
} catch(Exception e) {
} finally {
in.dispose();
}
} catch(Exception e) {
System.out.println("InputFile construction failed");
}
这样写问题就解决了。程序结构问题。
14.异常按照代码书写顺序找出最近匹配的处理程序,找到后即认为处理过了,不再继续查找。
15.异常处理原则
只有知道如何处理的情况下才捕获异常。
但有时被检查的异常,强制你在可能的还没做好准备如何处理错误的时候加上catch子句,这就导致了吞食则有害(harmful if swallowed)
try{
// ..to do something useful
}catch(Exception){//donothing}
这样做可以通过编译了,但是如果真发生了异常,但是吞食的异常完全消失了。