异常:
定义:
简而言之代码中的不正常就是异常。
继承关系:
jvm处理:
jvm会处理程序中未处理的异常:
a:暂停程序
b:报错(异常内容【什么异常 原因描述】 异常行数 )
最好不要让jvm去处理异常
异常处理:
(1)** 通过大量的if判定来确保程序没有异常; **但是用户是万恶之源,永远无法知晓他到底会做什么。编写的判定逻辑不可能将所有情况都囊括进去,缺点: 代码臃肿、不利于阅读以及维护
(2)try-cathch-finally
(3)throw
(4)throws
(5)自定义异常
try-catch:
1.语法结构:
try{
//有可能出现异常的代码块
}catch(声明异常){
异常解决办法
}
2.执行顺序:
1:执行try块中的内容
2:如果try块中内容出现异常,执行catch块
3:匹配catch中声明的异常信息 ,如果匹配上,则执行catch中的代码
4:继续执行后续代码
5:如果catch中的异常信息没有匹配到 那么此时交由jvm处理该异常
3.catch:
1:中的类型一定要注意 要能够捕获到try快中实际出现的异常信息 如果忘记了具体的异常信息可以通过使用
2:Exception去捕获异常信息
4.注意:
1:不要在catch块中做业务逻辑判定
代码1分析:
package com.mage.exception;
/**
*
* @author 大萌
*try-catch:
*/
public class test01 {
public static void main(String[] args) {
try{
System.out.println(1/0);
}catch(ArithmeticException e){
System.out.println("除数不为零");
}
System.out.println("我是try-catch外的代码");
}
}
运行结果:
try-catch-catch…:
1.语法结构:
try{
//可能出现异常的代码段
}catch(异常1){
//异常 的解决办法
}catch(异常2){
//异常 的解决办法
}…{
}
2.try多层catch执行顺序:
1:执行try块 如果出现异常 new出当前异常对象
2:逐一匹配catch中的异常内容
3:如果匹配上 执行对应的catch中的代码 整个try-catch执行结束
4:如果匹配上 jvm去解决当前异常信息
3.注意事项:
1:在多重catch中一般情况下会在最后一个catch语句中编写exception 用来捕获可能未被识别的异常信息
2:不要再第一个catch中编写父类异常 屏蔽所有子类异常
4.异常对象的常见方法:
1:toString: 当前异常类型以及原因描述
2:printStackTrace: 打印堆栈信息 异常类型以及原因描述 异常位置
3:getMessage:异常原因
代码2分析:
package com.mage.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class test02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input =new Scanner(System.in);
try{
System.out.println("请输入第一个数:");
int num1=input.nextInt();
System.out.println("请输入第二个数:");
int num2=input.nextInt();
int result=num1/num2;
System.out.println("result="+result);
}catch(InputMismatchException e){
System.out.println("输入数据不合理");
}catch(ArithmeticException e){
System.out.println("除数不为零");
}catch(Exception e){
System.out.println("网络错误");
}
System.out.println("后面的代码");
}
}
执行结果:
1.没有发生异常:
2.发生异常:
try-catch-finally:
1.语法结构:
try{
//可能出现异常的代码
}catch(异常1){
//处理办法
}…{
}finally{
//代码块
关闭资源的代码
}
代码3分析:
package com.mage.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* try-catch-finally:
* @author 大萌
*
*/
public class test03 {
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
try{
System.out.println("请输入第一个数:");
int num1=input.nextInt();
System.out.println("请输入第二个数:");
int num2=input.nextInt();
int result=num1/num2;
System.out.println("result="+result);
}catch(InputMismatchException e){
System.out.println("输入数据不合理");
}catch(ArithmeticException e){
System.out.println("除数不为零");
}catch(Exception e){
System.out.println("网络错误");
}finally{
System.out.println("finally的代码");
}
执行结果:
1.没有发生异常:
2.发生异常:
小结:
1.无论代码是否发生异常,finally{}中的语句都会执行;
finally:
1.测试如何让finally不执行:
(1)retrun 语句不会让finally不执行
(2)finally先于return语句执行
(3)代码中存在System.exit() 可以让finally不执行 但是一般不这么干
2.执行顺序:
(1)执行try块 如果出现异常 new出当前异常对象
(2)逐一匹配catch中的异常内容
(3)如果匹配上 执行对应的catch中的代码
(4)如果未匹配上 jvm去解决当前异常信息
(5)不论是否匹配成功 都会执行finally中内容
3.注意:
(1)finally中一般情况下编写关闭资源的操作
4.try-catch-finally的改变:
1.jdk1.7之后,可以通过对于流、网络连接对象的创建声明在try的()中,后续无序通过使用finally显式的关闭资源
try(资源1;资源2.。。。){
//可能出现的异常信息
}catch(异常1){
//解决办法
}。。。。。{
}
代码4分析:
package com.mage.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
*
* @author 大萌
*
*/
public class test04 {
public static int main(String[] args) {
// TODO Auto-generated method stub
Scanner input =new Scanner(System.in);
try{
System.out.println("请输入第一个数:");
int num1=input.nextInt();
System.out.println("请输入第二个数:");
int num2=input.nextInt();
int result=num1/num2;
System.out.println(num1+"/"+num2+"="+result);
//System.exit(0);关闭程序,finally不会执行
return 1;
}catch(InputMismatchException e){
System.out.println("输入数据不合理");
}catch(ArithmeticException e){
System.out.println("除数不为零");
}catch(Exception e){
System.out.println("网络错误");
}finally{
System.out.println("finally的代码");
input.close();
}
return 2;
}
}
运行结果:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/55a4d26c1e546f523045f64837e1c6df.png)
代码5分析:
- jdk1.7之后,可以通过对于流、网络连接对象的创建声明在try的()中,后续无序通过使用finally显式的关闭资源
package com.mage.exception;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.InputMismatchException;
import java.util.Scanner;
public class test05 {
public static void main(String[] args) {
try(Scanner input = new Scanner(System.in);
InputStream is = new FileInputStream(new File(""))){
System.out.println("请输入第一个数:");
int num1=input.nextInt();
System.out.println("请输入第二个数:");
int num2=input.nextInt();
int result=num1/num2;
System.out.println(num1+"/"+num2+"="+result);
}catch(InputMismatchException e){
System.out.println("输入数据不合理");
}catch(ArithmeticException e){
System.out.println("除数不为零");
}catch(Exception e){
System.out.println("网络错误");
}
}
}
运行结果:
throw和throws:
1.throw:
(1)throw 声明当前代码块中可能存在的异常信息 并且将当前异常信息抛出给调用者。
(2)对于调用者而言 通过try-catch捕获异常
(3)不管当前异常交由jvm解决
(4)throw 定义在方法内部,声明当前方法可能出现的异常信息 可以导致当前程序中断 后续代码不执行
2.throws:
(1)throws 在方法外对外抛出某个异常,调用者解决当前异常。main方法中对外抛出的异常全部都交由jvm做。
(2)throws抛出异常 是异常解决的一种办法定义在方法的外部 形式参数后 可以抛出多个异常通过","分割
3.注意:
(1)一般会将throws和throw在一起使用,throw 声明的异常是检查时异常需要和throws一起使用
(2)但是throws可以单独使用
代码6分析:
package com.mage.exception;
import java.io.FileNotFoundException;
public class test06 {
public static void main(String[] args) throws FileNotFoundException {
People p=new People();
// try{
// p.setAge(11);
// }catch(FileNotFoundException e){
// System.out.println(e.getMessage());
// }
// }
p.setAge(11);
}
}
class People{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) throws FileNotFoundException {
if(age<0||age>100) {
throw new FileNotFoundException();//异常中断
}
this.age = age;
}
@Override
public String toString() {
return "People [age=" + age + "]";
}
}
自定义异常:
1.如何自定义异常:
(1)声明一个自定义异常类
(2)继承Exception
(3)编写两个构造器 一个空 一个带字符串的构造器
代码7分析:
1.自定义异常类:
package com.mage.exception;
/**
*
* @author 大萌
*
*/
public class AgeException extends Exception {
public AgeException() {
}
// 当前异常的原因描述
public AgeException(String msg) {
super(msg);
}
}
2.test类:
package com.mage.exception;
import java.io.FileNotFoundException;
public class test07 {
public static void main(String[] args) throws AgeException {
People p=new People();
// try {
// p.setAge(-1);
//
// }catch(AgeException e) {
// //System.out.println("年龄有误。。。");
// System.out.println(e.getMessage());
// }
// System.out.println(p);
//
}
}
class People{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) throws AgeException {
if(age<0||age>100) {
throw new AgeException();//异常中断
}
this.age = age;
}
@Override
public String toString() {
return "People [age=" + age + "]";
}
}