1.异常
1.1异常定义
异常:就是程序运行中出现的不正常的
java中将这些已经遇见到的不正确的情况,封装成了类,这种类叫做异常类
1.2生成异常和处理
生成异常:
当满足了异常条件的时候会执行以下操作:
1.创建异常对象
2.抛出异常对象
执行这两个功能后,叫做产生了异常,这个过程是java自动做得(java异常处理机制),我们见不到
处理:
- 1.捕获异常
-
1.3处理机制
java中设计的异常以及错误的类有一个完整地庞大的处理机制
异常和错误的类有以下结构:
- Throwable—异常和错误的顶级父类
- 有两个子类:Error,代码无法处理的错误,比如停电,服务器宕机等
Exception,通过代码的调试可以处理的异常
这个EXception有很多的子类--IOException,FileNotFoundException··········
1.4案例
```java package com.igeek_01;
/**
- @author Lynn
- @create 2020-12-03-9:21 */
import java.io.FileWriter; import java.io.IOException; import java.util.Scanner;
public class Exception { public static void main(String[] args) throws IOException { Scanner sc=new Scanner(System.in); System.out.println(“文件路径:”); String path=sc.next();
//创建文件流FileWriter fw=new FileWriter(path);//写出内容fw.write("王嘉尔");//关闭资源fw.close();}
}
**注意!!!**<br />****<a name="06eyQ"></a>### 1.5演示运行时异常的情况**注意**<br />** 将异常抛出去的时候,不能抛给main方法,因为处理异常的时候谁调用这个有异常的方法,谁就来处理这个异常,main方法是由jvm,所以不能让jvm来处理异常,所以我们通常在开发中,main方法中直接处理掉**<a name="QOyp5"></a>### 1.6try/catch(捕获异常处理)- 将异常捕获,使用try/catch做一个分支处理--如果存在异常就抓取并且处理,- 如果没有异常就直接往下执行- <br />- 格式:- try{
//需要检测异常的代码
}catch(异常类名 异常变量){
//异常处理的代码
```可以调用异常的方法
通常我们只使用一个方法--printStackTrace(打印异常信息)
}
public class TruCatchDemo {public static void main(String[] args) throws IOException {//使用try/catch处理异常Scanner sc=new Scanner(System.in);System.out.println("请输入文件路径:");String path=sc.next();//抓取异常处理try {//可能出现异常的代码FileWriter fw=new FileWriter(path);System.out.println("输出成功");}catch (IOException ie){//打印异常信息ie.printStackTrace();}System.out.println("没有抓取到异常,继续后面的程序");}}
1.7 Throws(声明抛出异常)
在某个方法声明上,让它(方法)抛出产生的异常,自己不需要处理的,谁调用这个方法,谁就处理这个异常
- 语法:方法的声明上加上throws 异常类名
- 比如:
- 方法a中产生了异常,声明抛出
- 方法b调用了了方法a,则该异常从a转到了b,并且由b处理异常
- 注意:
- 一般情况下main方法中不能抛出异常,因为main方法的上一级是jvm,jvm的处理方式就是终止程序,
- 这样的处理没有意义,所以main要自己处理
1.8 运行时异常
就是在运行期间出现的异常,通常在编译期是不会报错的
- 处理方式:
- 可以处理,也可以不出来——按照需求而定
- 一般情况下,遇到java自身提供的运行时异常,都可以通过逻辑处理来解决,避免异常产生
- 常见的运行时异常:空指针异常,数组下标越界异常,类造型异常等·········
- 处理方式:
- 声明抛出异常
-
1.9多异常处理
多异常处理方式:
1.声明抛出异常,直接抛出多个异常
- 2.一个try多个catch的方式
- 异常处理中,java实际上是中断异常的处理方式
这个案例也是一个反面教材:
- 在处理多个异常的时候,可以直接利用异常的父类Exception直接处理子类异常,这个做法在语法上没有问题,但是逻辑中不能这么用,一旦直接使用父类处理异常,就没有办法再去处理子类异常。
1.10异常在继承中的使用和注意事项:
子类在重写父类的方法的时候,子类的方法必须抛出相同的异常或者是父类异常的子类
记住:子类重写父类中的方法的时候,异常的抛出必须小于等于父类的方法抛出的异常
1.11catch多个异常时注意的事项:
在捕获的时候可以使用父类的异常引用指向子类的异常对象,是多态体现(向上造型)
当多异常处理的时候,捕获异常,前面的异常类不能是后面的异常类的父类—也就是在多异常catch的时候
- 遵循从小到大的原则—先捕获子类异常再捕获父类异常
- 在处理异常的时候,catch会根据运行的过程先从子类异常开始处理,如果子类异常无法处理,
- 则最后给父类异常处理
-
1.12继承关系下异常的处理以及注意事项
1.如果父类的方法抛出了多个异常,子类重写的时候,只能抛出相同的异常或者是他的子类异常,
子类不能抛出父类中没有的异常(可以理解为自定义)!!!—-异常类中
2.如果父类中被被重写的方法没有抛出异常,子类中的方法绝对不可以抛出异常
- 如果子类中的方法发生了异常,只能通过try/catch自行处理!不能throws
在实际开发中,一般父类的方法和子类的重写的方法异常是一样的,不存在不一样的情况!!
1.13finally代码块的案例
在try/catch后面追加的finally代码块,其中的代码一定会被执行,通常用于资源的关闭等等操作—
有需要子处理完异常后必定执行的代码放在finally代码块中
- 使用非常的单一:就是放在异常处理结构的最后
案例
package com.igeek_05;/*** @author Lynn* @create 2020-12-03-15:11*/import java.io.FileWriter;import java.io.IOException;import java.util.Scanner;/*** finally代码块的案例** 在try/catch后面追加的finally代码块,其中的代码一定会被执行,通常用于资源的关闭等等操作--* 有需要子处理完异常后必定执行的代码放在finally代码块中** 使用非常的单一:就是放在异常处理结构的最后*/public class FinallyDemo {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入路径:");String path=sc.next();//开发过程中的常规写法--规范性FileWriter fw=null;try {fw=new FileWriter(path);fw.write("周杰伦");return;//结束方法,最后会执行finally} catch (IOException e) {e.printStackTrace();System.out.println("产生了IO问题");}finally {//追加finally//最终进行关闭System.out.println("关闭资源");//非空判断--目的是保证当前的fw文件流中是空的(即没有fw这个对象)--是空的就是关闭状态if(fw != null){try {fw.close();}catch (IOException io){io.printStackTrace();}}}System.out.println("执行");}}
1.14演示finally的注意点
package com.igeek_05;/*** @author Lynn* @create 2020-12-03-15:24*/import java.io.FileWriter;import java.io.IOException;/*** 演示finally的注意点*/public class FinallyTest {public static void main(String[] args) {try {System.out.println(10/0);FileWriter fw=new FileWriter("");}catch (ArithmeticException ae){System.out.println("算法异常");}catch (IOException ie){System.out.println("文件异常");}finally {//注意:在finally中通常不写return,因为finally是必须会执行的,会将上面的代码的返回值覆盖return;}// System.out.println("执行后面代码");}}
1.5演示finally的案例
package com.igeek_05;/*** @author Lynn* @create 2020-12-03-15:32*/import javafx.concurrent.Worker;/*** 演示finally的案例** 注意:* 在finally中的return是在方法执行结束之后会再次执行finally中的return代码,* 所以会将上面的所有的return的结果全部覆盖*/public class FinallyTest2 {public static void main(String[] args) {System.out.println(work());}public static int work(){int x=3;try {return x;}catch (Exception e){e.printStackTrace();}finally {x=5;return x;}}}

