什么是异常:
指Java程序运行时可能出现的错误或非正常情况
Java.lang包下的Throwable类是所有异常的父类
运行时异常和编译时异常
运行时异常(unchecked异常):程序运行时产生的,这种异常不编写异常处理代码,依然可以通过编译。只是程序在运行过程中可能报错
ArithmeticException 算术异常
IndexOutOfBoundsException 索引越界异常
编译时异常(checked异常):程序编译时产生的异常,必须处理异常否者程序无法正常运行
处理异常的两种方式
(1)使用try....catch语句
(2)throws关键字抛出异常,由调用者对异常进行处理
异常处理语法
try 放置可能引发异常的代码块
catch 后面对应异常类型(对象)和一个代码块(处理结果)
在catch中没有匹配异常发生中断
finally (处理必须做的事)
作用:主要用于回收在try代码里打开的物理资源(数据库连接、网络连接、和磁盘文件。
不能单独出现 try....catch....finally或 try.....finally
不管程序是否发生异常,finally都会执行 如果异常没有被捕获执行完finally后程序中断
System.exit(0)表示退出当前虚拟机,Java虚拟机停止任何代码都不会再执行
throws
用来声明该方法可能发生的异常,调用该方法必须对该异常进行处理,否则编译无法通过
修饰符 返回值类型 方法名(参数1,参数2,....) throws 异常类1,异常类2.....{
方法体
}
throw
用于方法体,抛出一个异常实例,并且每次只能抛出一个异常实例
throw ExpectionInstance;
一般还需要使用throws关键字或try....catch语句,(编译时异常)
(错误类和运行时异常) 则不需要使用。。。处理
两种情况
1) throw抛出编译时异常:
a) try代码块中使用throw关键字抛出异常
b) throws声明该方法中使用throw关键字抛出异常,把异常交给该方法的调用者
2) throw抛出运行时异常:
可以使用try。。。catch。。显示处理
也可以不处理,把他交给调用者处理
package 异常处理;
public class Examplle07 {
//定义printAge()输出年龄
public static void printAge(int age) throws Exception{
if (age<=0){
throw new Exception("输入年龄不符"); //必须要抛出throws Exception
// System.out.println("ss");
}else{
System.out.println("此人年龄为"+age);
}
}
public static void main(String[] args){
int age=-1;
try{ //捕获throws Exception(交给调用者处理)
printAge(age);
}catch(Exception e){
System.out.println("异常捕获:"+e.getMessage());
}
}
}
自定义异常
用来处理特殊的异常
package 异常处理;
class ByException extends Exception{ //自定义异常必须继承Exception或其子类
//自动继承Exception 的无参构造
public ByException(){
// super(); //调用Exception无参构造的方法
}
public ByException(String message){
super(message); //调用Exception有参构造的方法
}
}
public class Exception08 {
public static void main(String[] args) {
try{int result=divide(4,-1);
System.out.println(result);
}catch (ByException be){
System.out.println(be.getMessage());
}
}
public static int divide(int x,int y)throws ByException{
if(y<0){
throw new ByException("除数是负数");
}
int result=x/y;
return result;
}
}