I学霸官方免费教程三十八 :Java基础教程之异常

来源:互联网 发布:淘宝店铺优惠券显示 编辑:程序博客网 时间:2024/05/18 05:23

异常

程序中不正常的情况分为两大类:错误(Error)和异常(Exception)

错误(Error):程序本身无法对这种不正常的情况进行处理,将会导致程序崩溃;
例如:内存耗尽错误,JVM崩溃错误等
异常(Exception):程序可以特殊的代码,对不正常的情况进行捕获和处理,程序可以继续运行;
例如:除零异常,空指针异常,数组下标越界异常

捕获异常

语法格式1:try{ //可能出现异常的代码  }catch(异常类 变量名){//出现异常后的处理代码//printStackTrace();方法会输出栈内存中的异常信息变量名. printStackTrace();}语法格式2:try{//可能出现异常的代码}finally{//finally块:一般释放资源的语句,比如关闭流,关闭数据库的连接}finally:不管try中的代码是否出现异常,都会执行finally块中的代码语法格式3:try{    }catch(异常类 变量名){}finally{  //即使try块或catch块中出现return语句,finally块中依然会执行 //如果在try块或catch块中出现System.exit(int);语句,finally块将无法执行}多重catch块:多重catch块中的异常类,一定是从小到大排列,兄弟异常类不分顺序try{    }catch(子异常类 变量名){}catch(子异常类 变量名){}catch(父异常类 变量名){}...[finally{}]try、catch和finally都不能单独存在,但是try和catch 、 try和finally 可以在一起使用,catch和finally不能单独在一起使用

声明异常

语法格式:[访问修饰符] 返回值类型 方法名() throws 异常类{}

抛出异常

语法格式:throw 异常对象;

实例:package exception;/** * 演示异常的声明和抛出 *  * @author 学霸联盟 - 赵灿 */public class ExceptionDemo {//声明方法m1,并声明该方法会出现一个RuntimeException类型的异常public void m1() throws RuntimeException {/* * 抛出一个RuntimeException类型的异常,没有使用try-catch捕获 * 使用声明异常的方式,将此处抛出的异常交给调用者m2处理 * 声明异常的类型,必须是抛出异常类型或其父类型 */throw new RuntimeException();}//声明方法m2,并声明该方法会出现一个Exception类型的异常public void m2() throws Exception {try {// 调用声明了RuntimeException异常的方法m1// 并使用try-catch处理m1中抛出的异常m1();/*因为catch块是按照异常类型匹配捕获的,而方法m1声明的是RuntimeException;所以catch的小括号中只能声明RuntimeException或RuntimeException父类型的变量不能声明RuntimeException的子类变量,因为这样不能保证异常被捕获 */} catch (Exception ex) {// 此处抛出了一个Exception类型的异常// 没有使用try-catch进行捕获处理,所以该方法也必须声明异常throw new Exception();} finally {/* * 不管try和catch块中的代码是否抛出异常,finally块中的代码都会执行 * 即使try或catch块中执行了return语句,finally块中的代码也会执行 * 除非try或catch块中执行了System.exit(int); * 或出现错误导致JVM崩溃,finally将不再执行 */}}// 方法m3public void m3() {try {/* * 调用声明了Exception异常的方法m2,而m3没有声明异常, * 所以必须使用try-catch块处理方法m2产生的异常 */m2();} catch (Exception ex) {/* * 抛出Exception类型的异常,而且没有使用try-catch进行捕获,也没有声明异常; * 但是在finally块中使用的return语句,所以代码可以正常编译和执行 */throw new Exception();} finally {/* * finally块中使用了return语句; * 会将catch块中抛出的Exception类型的异常覆盖; * 所以该方法可以既不声明异常,也不使用try-catch处理catch块中抛出的异常; * 一般不建议这样使用 */return;}}public static void main(String[] args) {ExceptionDemo t = new ExceptionDemo();t.m1();}}

自定义异常

继承Exception或Exception的子类
实例:/*** 演示自定义异常类* @author 学霸联盟 - 赵灿*/public class MyExceptionDemo extends Exception{public static void main(String[] args) {try {throw new MyException();} catch (MyException e) {//调用printStackTrace方法e.printStackTrace();}}}/*** 创建自定义异常类MyException,继承Exception类或Exception的子类* @author 学霸联盟 - 赵灿*/class MyException extends Exception{/** * 重写父类中的printStackTrace */@Overridepublic void printStackTrace() {System.out.println("恭喜你,中了我的自定义异常!");}}




0 0
原创粉丝点击