起得最早的一天。。。。
异常:
error异常:系统崩溃,虚拟机异常,内存溢出等,线程死锁
exception异常:
1.runtimeexception(非检查异常):
NullPointerException - 空指针引用异常
ArithmeticException - 算术运算异常
ArrayIndexOutOfBoundsException,数组下标越界
ClassCastException,类型强制转换异常
2.Checked Exception(检查异常),
各种奇葩原因,文件不存在等,需要try...catch解决
try....catch....finally异常处理:
try{可能发生异常的语句}
catch{捕获到异常并且做出行动}
try后可以加多个catch,顺序有小到大,由子类到父类,会就近原则处理异常,
善后工作finally
try{}
catch{}
finally{//要执行的代码}
public class TryCatch {
public static void main(String[] args) {
// TODO 自动生成的方法存根
TryCatch op=new TryCatch();
int result=op.test();
System.out.println("result的值为"+result);
}
public int test(){
try{
int i=10;
int b=100;
int result=10;
while(i>-1){
result=result+b/i;
i--;
}
}
catch(Exception e){
System.out.println("异常发生了");
e.printStackTrace();
}
finally{
System.out.println("finally执行了");
}
return 15;
}
}
打印出异常方法:e.printStackTrace();
无论是否发生异常finally都会执行,
如果try。。。catch没有返回值会继续执行异常之后的语句;
抛出异常throw,throws:
throws写在参数列表之后,方法体之前}
throw是一个动词,会抛出具体的异常,会交给try....catch.....,如果没有,会交给更上级,
自定义异常,class 自定义异常类 extends 异常类型{},可以添加含参构造器,也可以添加更多复杂的功能
异常链:一个异常会包装成为新异常中的引用,一个异常发生另一个也会发生,这样的链式反应
public class ChainTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
ChainTest t=new ChainTest();
try {
t.test2();
} catch (Exception e) {
e.printStackTrace();
// TODO 自动生成的 catch 块
System.out.println("终于执行了");
}
}
public void test1() throws Drunk{
throw new Drunk("喝酒别开车");
}
public void test2()
{
try {
test1();
} catch (Drunk e) {
// TODO 自动生成的 catch 块
RuntimeException newExc=new RuntimeException("hahaha");
newExc.initCause(e);
throw newExc;
}
}
}
initCause,会包装异常,执行过后,用throw时不需要用throws