2017网站开发合同下载,学校网站素材,wordpress 相册 插件,百度 门户网站目录
一、什么是异常
二、异常的体系和分类
三、异常的处理
1.抛出异常
2.异常的捕获 异常声明throws#xff1a;
try-catch处理
四、finally
finally一定会被执行吗#xff1f;
五、throw和throws区别
六、异常处理的流程
七、自定义异常 一、什么是异常
顾名…目录
一、什么是异常
二、异常的体系和分类
三、异常的处理
1.抛出异常
2.异常的捕获 异常声明throws
try-catch处理
四、finally
finally一定会被执行吗
五、throw和throws区别
六、异常处理的流程
七、自定义异常 一、什么是异常
顾名思义就是不正常。比如 当一个正在运作的机器突然卡了或者不动了我们称为异常 当一个健康的人突然生病了身体开始不舒服我们称为异常。 所以在Java中将程序执行过程中发生的不正常行为称为异常。
二、异常的体系和分类
异常种类繁多为了对不同异常或者错误进行很好的分类管理Java内部维护了一个异常的体系结构Java中的异常是用类来描述的有各种各样的异常类 、 从上图可以看到的体系 1. Throwable是异常体系的顶层类其派生出两个重要的子类, Error 和 Exception 2. Error指的是Java虚拟机无法解决的严重问题比如JVM的内部错误、资源耗尽等典型代表 StackOverflowError和OutOfMemoryError一旦发生回力乏术。 3. Exception异常产生后程序员可以通过代码进行处理使程序继续执行。比如感冒、发烧。我们平时所说 的异常就是Exception。 从上图可以看到的分类 但我们平常说的异常是Exception它可以分为编译时异常 or 受查异常check Excepton和运行时异常 or 非受查异常uncheck Exception 。 1.运行时异常也叫非受查异常它是用RuntimeException这个类继承的就是在我点击run运行的时候它才会报错
public static void main(String[] args) {//算术异常System.out.println(10/0);//数组越界异常int[] array new int[10];System.out.println(array[10]);//空指针异常int[] array1 null;System.out.println(array1.length);}2.编译时异常也叫受查时异常我之前博客也有写过克隆接口就是在写代码的时候直接报红线你都编译都不通过
class Person implements Cloneable {Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Test {public static void main(String[] args) {//编译时异常 也叫 受查异常Person person new Person();Person person1 (Person) person.clone();}
} 当然大家要注意语法错误不算异常 比如下图少了个分号中文分号变量名重复关键字拼写错误....等等都只算语法错误并不是异常 三、异常的处理
既然我们知道异常影响代码的工作那我们怎么处理呢
在Java中异常处理主要的5个关键字throw、try、catch、final、throws。
1.抛出异常 在Java中可以借助throw关键字抛出一个指定的异常对象将错误信息告知给调用者。
public static void getElement(int[] arr, int index) {if (arr null) {throw new NullPointerException(数组为空);}if(index0||indexarr.length){throw new ArrayIndexOutOfBoundsException(数组越界);}
}
public class Test{public static void main(String[] args) {int[] array {1,2,3};getElement(array, 3);System.out.println(你好);}
}【注意事项】 1. throw必须写在方法体内部。 2. 抛出的对象必须是Exception 或者 Exception 的子类对象。 3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类代码不报错不划红线则可以不用处理直接交给JVM来处理。 4. 如果抛出的是编译时异常用户必须处理否则无法通过编译。 5. 异常一旦抛出其后的代码就不会执行 。 2.异常的捕获 异常的捕获也就是异常的具体处理方式主要有两种异常声明throws 以及 try-catch捕获处理。 异常声明throws
public class Config {File file;public void OpenFile(String name)throws FileNotFoundException{if(name.equals(abc)){throw new FileNotFoundException(文件名出错);}}
}也就是在方法的后面写上throwsxxxException 。 FileNotFoundException : 编译时异常 表明文件不存在 此处不处理也没有能力处理应该将错误信息报告给调用者让调用者检查文件名字是否给错误了。 如果在main方法也不想画红线在main方法后面也throws就好了但是都没有处理这个异常这时候就会交给JVM处理JVM的处理方法就是直接崩溃 方法内部如果抛出了多个异常throws之后必须跟多个异常类型之间用逗号隔开如果抛出多个异常类型 具有父子关系直接声明父类即可。 try-catch处理
我们可以发现throws根本没有实际上解决异常它只是让程序不报错或者交给别人或者JVM处理那我们怎么才能真正的处理这个异常呢这时候就用到我们的try-catch了 。
public static void main(String[] args) {try {int[] arr null;getElement(arr, 3);System.out.println(哈哈);} catch (NullPointerException e){System.out.println(处理这个异常);//打印一下在哪里出错了e.printStackTrace();System.out.println(处理完成);}catch (ArrayIndexOutOfBoundsException e){System.out.println(发现异常);e.printStackTrace();}System.out.println(你好);} 1.try捕捉到异常后不执行在try中这个异常后面的程序所以不打印”哈哈“。 2.明明我的e.printStackTrace()在sout(处理完成)的后面为什么顺序却反了呢 答为什么会出现程序输出偏差呢先打印sout再打印异常sout和异常打印不是同个打印他们存在打印的偏差 不用理会打印得出来就好了 3.main方法后面的程序继续执行所以会打印”你好“。什么时候不会打印呢交给JVM的时候如下 四、finally
所以引出我们的finaly不管捕没捕到都要执行 public static void main6(String[] args) {//若无法匹配到异常就交给JVM让JVM来判断try {int[] array {1,2,3};System.out.println(array[3]); // 此处会抛出数组越界异常}catch (NullPointerException e){ // 捕获时候捕获的是空指针异常--真正的异常无法被捕获到e.printStackTrace();}finally{System.out.println(哈哈);}//若交给JVM判断的话JVM收到后中断程序接下来的代码也不会执行除了finallySystem.out.println(后序代码);}
在写程序时有些特定的代码不论程序是否发生异常都需要执行比如程序中打开的资源网络连接、数据库 连接、IO流等在程序正常或者异常退出时必须要对资源进进行回收。另外因为异常会引发程序的跳转可能导致有些语句执行不到finally就是用来解决这个问题的。
finally一定会被执行吗 当在try块中遇到System.exit()方法时程序会立即退出finally块中的代码不会被执行。 当在try块中遇到无限循环或者死循环时finally块中的代码不会被执行。 当在try块中遇到未捕获的异常或Error时程序会直接跳转到异常处理代码finally块中的代码不会被执行。
五、throw和throws区别
throw用于主动抛出异常throws用于声明方法可能抛出的异常类型。
throw是在方法体内部使用的而throws是在方法的声明处使用的。
六、异常处理的流程 【异常处理流程总结】
1.程序先执行 try 中的代码
2.如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
3.如果找到匹配的异常类型, 就会执行 catch 中的代码
4.如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
5.无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
6.如果上层调用者也没有处理的了异常, 就继续向上传递.
7.一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止.
七、自定义异常
Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常此时就需要维护符合我 们实际情况的异常结构 。
具体方法如下
1. 自定义异常类然后继承自Exception 或者 RunTimeException
2. 实现一个带有String类型参数的构造方法参数含义出现异常的原因
package demo2;
//Login.java
//自定义
public class Login {public String usernameadmin;public String password123456;public void loginInfo(String username, String password) {if (!this.username.equals(username)) {throw new UserNameException(用户名不匹配);}if (!this.password.equals(password)) {throw new PassWordException(密码不匹配);}System.out.println(登录成功);}public static void main(String[] args) {try {Login loginnew Login();login.loginInfo(admin,12456);}catch (UserNameException e){e.printStackTrace();}catch (PassWordException e){e.printStackTrace();}}
}package demo2;
public class PassWordException extends RuntimeException{public PassWordException(){}public PassWordException(String s){super(s);}
}package demo2;
public class UserNameException extends RuntimeException{public UserNameException(){}public UserNameException(String s){super(s);}
} 注意事项
自定义异常通常会继承自 Exception 或者 RuntimeException
继承自 Exception 的异常默认是受查异常
继承自 RuntimeException 的异常默认是非受查异常