异常:异常是导致一个程序中断的指令流,一旦出现之后程序就将立即退出。
public class ExpTest{
public static void main(String args[]){
int x = 10;
int y = 0;
System.out.println("计算开始:") ;
System.out.println("计算结果是:"+(x/y));
System.out.println("计算结束!");
}
}
运行结果:
/*计算开始。
*Exception in thread "main" *java.lang.ArithmeticException:
/ by zero
*at ExpDemo01.main(ExpDemo01.java:6)
*/
如果会发生异常的语句发生异常,此时该语句之后的所有语句都不会被执行到,就直接退出程序,如果想要程序继续执行,就需要对异常的语句进行处理。
异常分为编译器异常和运行期异常:
编译期异常:此类异常知名会意,就是在java代码编写完成是预编译的时间,就检出的异常,即不能通过编译,必须对异常的情况进行处理,否则编译就有错误。处理的方式通常为try…catch或者throws进行异常的抛出。其中try…catch对异常情况可以进行实时的捕获并进行处理,将受检的代码放进try块里面,catch会捕获到对应的异常,即执行catch里面的代码。throws放在方法上进行异常的抛出,说明该方法可能进行异常的抛出,但本身并不进行处理或本身没有能力进行处理,把异常的处理的责任交给方法的调用者。
运行期异常:该种异常是编译器检查不出来的,不需要try…catch{} throws就可以顺利编译。常见的运行期异常:空指针异常NullPointerException,除数为零时产生的ArithmeticException异常,数组下标越界时产生的IndexOutOfBoundsExceptionyic异常,fail-fail机制产生的ConcurrentModificationException异常等,都属于运行时异常。该类异常时可以用改写代码逻辑进行避免的,这时候就是检验我们代码的严谨性。Exception处理:空指针异常:如果发生空指针异常,对所在点访问操作进判断。
异常的处理:常用的两种异常处理方式:捕获异常、声明抛出异常。
1、捕获异常:就地解决,并使程序继续执行。
使用try…catch(){}捕捉异常 //try块放异常的代码
catch捕捉异常
finally{}块:try…catch(){}finally() 不管try是否异常,finally块都会被执行,除非退出当前程序。
如果会发现异常的语句发生异常,此时该语句(在try块)之后的所有语句都不会被执行到。
try{ 可能出现异常的语句;
}catch(异常类型 异常对象){
处理异常;
}
catch(异常类型 异常对象){
处理异常;
}…
finally{ 异常处理的统一出口;
//不管是否有异常,都执行此finally语句!
}
2、声明抛出异常:也就是将异常向外转移,即将异常抛出方法之外,由调用该方法的环境去处理。一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明抛出异常(throws)
声明抛出异常是一种消极的异常处理机制。
throws:抛出异常类型(自己不处理,谁用谁处理)
throws关键字主要是用在方法的声明上,表示一个方法不处理异常,而交给被调用处进行处理。在主方法上使用的话就表示一旦出现了异常之后,继续向上抛,表示由JVM进行处理了。实际上默认情况下的所有异常都是依靠JVM进行处理的。
Throw:抛出异常对象throw关键字是在程序中"人为的抛出"一个异常对象
throw new Exception(“人为抛出的!”) ;
public class ExpTest01{
public static void main(String args[]) {
try{
throw new Exception("人为抛出的!") ;
}catch(Exception e){
e.printStackTrace() ;
}
}
}
Object:所有类默认继承于object