A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

异常:(异常查找,从上到下,找自己创建包下的异常第一句,确定异常开始的位置)

概念
异常: 指的是程序在执行过程中, 出现的非正常的情况, 最终会导致JVM的非正常停止
注意:
在Java中, 每种异常都有对应的"类"来描述. 发生了一个异常, 就是出现了这个异常类的"对象"
异常不是语法错误
分类
// 异常的体系结构
java.lang.Throwable  // 体系最顶层
|_ Error     // 不应该试图捕获的严重问题, 不能处理的错误
|_ Exception   // 可以处理的异常
|_ RuntimeException  // 运行时异常
错误(Error): 不能捕获处理的严重问题. 绝症
必须将程序停下来, 修改代码才能解决
错误的类名都是 "XxxError" 方式
异常(Exception): 可以捕获处理的问题. 发烧感冒吃个药就好了
程序执行起来后, 如果有合适的处理方式, 即使发生异常, 程序也能处理该异常并继续运行
异常的类名都是 "XxxException" 方式
1. 编译时异常:
编译时期就会发生的异常, 必须在编译时期处理  Unhandled exception XxxException
2. 运行时异常:
编译时正常, 运行时才会发生的异常
异常关键字: throw制造异常(自己创建异常(throw new 异常名称或是异常对象名是为了更详细的介绍产生异常的原因)
throw关键字作用: 在方法中抛出指定的异常对象
应用场景:自建异常可以用于参数校验
格式:
throw new 异常类名("异常原因字符串");
// 示例:
  public static void method(int index) {
                    if (index < 0) {
                      // 用代码产生一个异常
                      throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");
                  }
}
注意:
1. throw 必须写在方法的内部
2. throw 后面new的异常对象, 必须是 "Exception" 或 "Excetion的子类" 的对象
3. 一个方法内部 throw 了一个异常对象, 则该方法可以分为2种情况来处理该异常:
如果 throw 的是"运行时异常"(RuntimeException及其子类)对象, 那么可以不处理该异常最终会交给JVM处理, 结果就是: 打印异常信息到控制台, 并立刻结束程序
如果 throw 的是"编译时异常"(Exception及其子类), 则必须处理:
处理方式1: throws 抛出
处理方式2: try...catch 捕获
异常的处理方式(把鼠标放在出现红线的位置有显示Unhandle exception,就是有异常需要处理)
异常处理方式1: throws声明抛出异常(throw是创建异常;throws声明异常,用于处理异常)
异常处理的第一种方式:
throws, 声明抛出 (方法自己不处理, 交给方法调用者处理, "甩锅给别人")
作用: 告诉方法的调用者, 调用此方法有可能发生异常, 需要在编写代码时处理
格式:
修饰符 返回值类型 方法名() throws 异常类名1, 异常类名2, ... {
}
// 示例
public static void readFile(String filename) throws FileNotFoundException {
if (!"a.txt".equals(filename)) {  a.java
throw new FileNotFoundException("路径不对");
}
                   if (filename.endsWith(".txt")) {  // name.startsWith("张")
                              // 判断当前字符串是否以参数的字符串结尾
}
}
         public static void main(String[] args) {
                    // 调用该方法的地方, 有2个选择: 继续throws声明抛出, 或try catch捕获处理
                            readFile();
}
注意:
1. throws 必须写在方法声明上
2. throws 后面的异常类名, 一般是 Exception 或 Exception的子类
(RuntimeException及其子类也行, 但是没有什么意义)
3. 方法内部如果抛出了多个异常对象, throws 后也必须声明多个异常
如果抛出的异常对象有子父类关系, 那么直接声明父类异常即可
4. 调用了一个带有 throws 声明抛出异常的方法, 就必须处理该异常:
要么继续声明 throws 抛出
要么 try...catch 捕获处理异常
异常处理方式2: 捕获异常
try...catch:
捕获并处理异常 (方法内部自己处理异常, 不交给别人, "自己背锅")
格式:
                         try {
                                    // 可能产生异常的代码
} catch (异常类名 变量名) {
                                    // 处理异常的代码
                                    // 一般会将异常信息存储到日志中
}
...
} catch (异常类名 变量名) {
                                    // 处理异常的代码
                                    // 一般会将异常信息存储到日志中
}
注意:
1. try 中可能会抛出多种异常, 就可以写多个 catch 分别处理每种异常
2. 如果 try 中产生了异常, 就会从产生异常的那一行代码直接跳转到对应的 catch 中执行处理代码, 然后继续执行 try...catch 之后的其他代码; 如果 try 中没有产生异常, 那就不会执行 catch , 执行完 try 中的代码后, 继续执行 try...catch 之后的其他代码
应用场景:代码块实现的功能是一致的出现异常,用多个异常一次处理;若代码块实现的是多个功能,分别捕获,分别处理;处理方式一致时使用多态异常处理
:
try {
// 可能发生异常的代码
} catch (异常类型1 | 异常类型2 | 异常类型3 | ... 异常对象名) {
// 处理任意一个异常的代码
}
try {
// 可能发生异常的代码
} catch (NullPointerException | ArrayIndexOutOfBoundsException e) {
// 处理异常的代码
}
throws与try..catch处理异常区别:
throws处理异常,后续的程序不会再继续,被中断
try...catch处理异常,后边的程序仍会继续进行
finally代码块
finally {
    // 无论是否发生异常, 是否捕获, 最后都会执行的代码.
    // 通常在这里执行释放资源的操作
}
注意:
1. finally 必须和 try...catch 一起使用
2. finally 一般用于释放资源 (IO流时用到)
3.避免在 finally 中写 return 语句
throwable中三个异常显示方法:
String getMessage(): 异常的信息. 没有原因返回null
String toString(): 异常的类型和原因信息
void printStackTrace(): 使用标准错误输出流打印异常信息
例:
java.io.IOException: 文件路径错误   下划线显示异常部分是getMessage()
//整体第一行显示是 toString()
          at com.itheima.test03.Test.readFile(Test.java:40)
          at com.itheima.test03.Test.main(Test.java:19)
//三行全部显示的最详细信息是调用了 printStackTrace()
异常注意事项1: 捕获多个异常的3种方式
捕获多个异常:
1. 多个异常分别try...catch处理, 多个异常分别 try...catch 处理
  try {
// 可能发生异常的代码
} catch (异常类型 变量名) {
// 处理异常
}

  try {
// 可能发生异常的代码
} catch (异常类型 变量名) {
// 处理异常
}
// 2. 一个try多个catch(如果异常存在继承关系, 子类异常在上, 父类异常在下)
try {
    // 可能发生异常的代码
    // 可能发生异常的代码
    // 可能发生异常的代码
}catch (异常类型1 变量名){  // 子类异常在上
    // 处理异常1
}catch (异常类型2 变量名){  // 父类异常在下
    // 处理异常2
}
// 3. 多个异常, 一次捕获一次处理
用Exception多态捕获
try {
// 可能发生异常的代码
    // 可能发生异常的代码
    // 可能发生异常的代码
    // 可能发生异常的代码
    // 可能发生异常的代码
}catch (Exception e){  // 父类异常多态接收
    // 处理异常
}
异常注意事项3: 子父类继承重写方法时的异常要求
父类方法声明的异常是什么样的, 子类重写的方法声明异常就什么样, 保持一致即可
子父类异常中,子类继承父类时,子类异常只能小于等于父类异常
自定义异常类
定义编译时异常: 继承 Exception
在自定义的类中,先继承Exception, 再定义两个构造(快捷键Alt + insert选择),一个无参, 一个有String参数


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马