day17 异常机制

1.异常机制

1.1概述

异常是Java中提供的一种识别及响应错误情况的一致性机制。有效地异常处理能使程序更加健壮、易于调试。

异常发生的原因有很多,比如

  1. 用户输入了非法数据
  2. 要打开的文件不存在
  3. 网络通信时连接中断
  4. JVM内存溢出
  5. 这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。

异常发生的原因有很多,尤其是用户输入和要打开的资源不存在。 这些异常出错后,后导致程序生命周期终止执行,从错误代码开始,之后的代码都不会执行。java中 有一个专门模拟异常的类,就是 Throwable , 所有异常都继承这个类。

1.2常见的异常

空指针

下标越界

栈内存溢出

类型转换异常

1.3继承机制

 1.4Error

1概念

系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理。 

比如:OOM(内存溢出错误)、VirtualMachineError(虚拟机错误)、StackOverflowError(堆栈溢出错误)等,一般发生这种情况,JVM会选择终止程序。

2实例

//堆栈溢出错误

public class TestError {

    public static void recursionMethod() {

        recursionMethod();// 无限递归下去

    }

    public static void main(String[] args) {

        recursionMethod();

    }

}

报错信息:

Exception in thread "main" java.lang.StackOverflowError

    at com.TestError.recursionMethod(TestError.java:5)

    at com.TestError.recursionMethod(TestError.java:5)

    at com.TestError.recursionMethod(TestError.java:5)

    at com.TestError.recursionMethod(TestError.java:5)

    at com.TestError.recursionMethod(TestError.java:5)

   at com.TestError.recursionMethod(TestError.java:5)

    ... ...

1.5Exception

1.5.1是什么

Exception是所有异常类的父类。分为非RuntimeException和RuntimeException 。

  1. 非RuntimeException 
    指程序编译时需要捕获或处理的异常,如IOException、自定义异常等。属于checked异常。
  2. RuntimeException 
    指程序编译时不需要捕获或处理的异常,如:NullPointerException等。属于unchecked异常。一般是由程序员粗心导致的。如空指针异常、数组越界、类型转换异常等

1.5.2常见方法

 异常处理的两种方式 
1 throws  : 抛出异常,告诉调用处,这里可能有什么问题
                如果你把异常抛给了调用处.那么调用处要么也抛出去,要么解决
 2 try...catch... : 解决异常
 

1.5.3Try...catch....

 try{
          高风险代码;
}catch(异常类型 变量){
      解决方案;
}

 

 2

try{
          高风险代码;
  } catch(异常类型 变量){
          处理方案;
 } catch(异常类型 变量){
          处理方案;
  }...
 catch中异常类型 不能有继承关系,如果有继承关系,需要从子类到父类

实例:

 

3

Java1.7新特性 自动关闭资源
 try{
        开启资源;
  }catch(异常类型 变量){
          处理措施;
 }finally{
          关闭资源
 }
   -----
  try(开启资源){
          高风险代码;
  }catch(异常类型 变量){
          处理措施;
  }

实例  :

 

1.5.4覆写

方法覆写,不能比原方法拥有更宽泛的异常
抛出的异常类,可以是父类方法中抛出的类,也可以是对应的子类 , 但是不能是它的父类
父类抛出一个异常A , 那么子类 要么还抛出A , 要么抛出A的子类, 要么不抛异常 , 但是不能是A的父类

1.5.5Throws

throws 抛出异常,并不会处理异常,是一种提醒机制

如果你调用 的方法,抛出一个编译时异常,要么你就try..catch处理掉,要么你也抛出

throws 是抛出异常,并不会解决异常,一般用于类库端(被调用的这个类)

而 try...catch... 是解决异常的,一般用于客户端(调用其他类的这个类,一般客户端都有main方法)

 抛异常 可以同时抛出多个,逗号隔开,没有先后顺序

 1.5.6Finally

finally : 必须执行的语句块 比如 打开的资源,需要关闭

1 finally 不能单独出现,必须和try一起使用 或者和 try...catch...一起使用

2 finally语句块 只有一种不执行的情况,那就是关闭虚拟机 System.exit(0);

1.5.6.2注意 

在class文件中

 

1.5.6.3应用场景 

 

 1.5.7Throw

异常源点

Throw new 异常类(错误信息);

参考自定义异常

1.5.8自定义异常类

1.5.8.1自定义

1 继承一个已有的异常类
 判断你应该是运行是异常还是编译时异常,如果是运行时异常需要继承 RuntimeException 否则就继承Exception即可
一般情况下 我们写的 一定是 编译时异常
 2 公共的无参构造
3 公共的有参构造,传入字符串,并在构造方法中把该字符串传递给父类 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值