2:异常处理

news/2024/10/18 12:25:33/

文章目录

  • 一:try catch处理异常
    • 1:原理:
    • 2:catch中如何处理异常
    • **3:try-catch-finally**
    • 4:多重catch
    • 5:异常的分类
    • 6:throw和throws的区别
    • 7:练习题
    • 8:重载和重写的异常
    • 9:自定义异常

一:try catch处理异常

public class Test2 {public static void main(String[] args) {try{Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a / b);} catch (Exception ex) {System.out.println("对不起,程序出现异常!");}System.out.println("最后一句话");}
}

1:原理:

把可能出现异常的代码放入try代码块中,然后将异常封装为对象,被catch后面的()中的那个异常对象接收,接收以后:执行catch后面的{}里面的代码,然后try-catch后面的代码,该怎么执行就怎么执行。

详细说一下:

(1)try中没有异常,catch中代码不执行。

(2)try中有异常,catch进行捕获:如果catch中异常类型和你出的异常类型匹配的话:走catch中的代码–》进行捕获, 如果catch中异常类型和你出的异常类型不匹配的话:不走catch中的代码–》没有捕获成功,程序相当于遇到异常了,中断了,后续代码不执行

注意:

(1)try中如果出现异常,然后用catch捕获成功的话,那么try中后续的代码是不会执行的。

(2)如果catch捕获异常成功,那么try-catch后面的代码该执行还是执行没有影响。

2:catch中如何处理异常

package P1.package2;import java.util.Scanner;public class Test2 {public static void main(String[] args) {try{Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a / b);} catch (Exception ex) {// 处理方法1:什么都不写,什么都不做// 处理方法2:输出自定义异常信息System.out.println("对不起,程序出现异常!");// 处理方法3:打印异常信息//      3.1:调用tostring方法,打印异常的类名(全限定路径)System.out.println(ex.toString());//      3.2: 显示异常描述信息对应的字符串,如果没有就显示nullSystem.out.println(ex.getMessage());//      3.3::显示异常的堆栈信息:将异常信息捕获以后,在控制台将异常的效果给我们展示出来,方便我们查看异常ex.printStackTrace();// 处理方法4:抛出异常throw ex;}System.out.println("最后一句话");}
}

3:try-catch-finally

【1】在什么情况下,try-catch后面的代码不执行?

(1)throw抛出异常的情况

(2)catch中没有正常的进行异常捕获

(3)在try中遇到return

【2】怎么样才可以将 try-catch后面的代码 必须执行?

只要将必须执行的代码放入finally中,那么这个代码无论如何一定执行。

【3】return和finally执行顺序?

先执行finally最后执行return

【4】什么代码会放在finally中呢?

关闭数据库资源,关闭IO流资源,关闭socket资源。

【5】有一句话代码很厉害,它可以让finally中代码不执行!

[System.exit(0); //终止当前的虚拟机执行](file:///C:/Users/86159/Downloads/System.exit(0);/终止当前的虚拟机执行)

package P1.package2;import java.util.Scanner;public class Test2 {public static void main(String[] args) {try{Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a / b);// 终止当前虚拟机执行System.exit(0);return;} catch (Exception ex) {// 处理方法1:什么都不写,什么都不做// 处理方法2:输出自定义异常信息System.out.println("对不起,程序出现异常!");// 处理方法3:打印异常信息//      3.1:调用tostring方法,打印异常的类名(全限定路径)System.out.println(ex.toString());//      3.2: 显示异常描述信息对应的字符串,如果没有就显示nullSystem.out.println(ex.getMessage());//      3.3::显示异常的堆栈信息:将异常信息捕获以后,在控制台将异常的效果给我们展示出来,方便我们查看异常ex.printStackTrace();// 处理方法4:抛出异常throw ex;}finally {System.out.println("最后一句话");}}
}/*
12
4
3
Process finished with exit code 0
*//*
ww
对不起,程序出现异常!
java.util.InputMismatchException
null
最后一句话
java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at P1.package2.Test2.main(Test2.java:9)
Exception in thread "main" java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at P1.package2.Test2.main(Test2.java:9)Process finished with exit code 1*/

4:多重catch

【1】try中出现异常以后,将异常类型跟catch后面的类型依次比较,按照代码的顺序进行比对,执行第一个与异常类型匹配的catch语句

【2】一旦执行其中一条catch语句之后,后面的catch语句就会被忽略了!

【3】在安排catch语句的顺序的时候,一般会将特殊异常放在前面(并列),一般化的异常放在后面。

先写子类异常,再写父类异常。

【4】在JDK1.7以后,异常新处理方式:可以并列用|符号连接:

在这里插入图片描述

package P1.package2;import java.util.InputMismatchException;
import java.util.Scanner;public class Test2 {public static void main(String[] args) {try {Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a / b);// 终止当前虚拟机执行System.exit(0);return;} catch (ArithmeticException ex) {System.out.println("对不起,除数不可以为0");} catch (InputMismatchException ex) {System.out.println("对不起,你录入的数据不是int类型的数据");} catch (Exception ex) {System.out.println("对不起,你的程序出现异常");} finally {System.out.println("最后一句话");}}
}

5:异常的分类

【1】层次结构:

在这里插入图片描述

注意:程序中语法错误,逻辑错误 都不属于上面的Error,Exception

一般的Exception默认是检查时异常

【2】检查异常:

处理方式1:try-catch嵌套try-catch

package P1.package2;public class Test3 {public static void main(String[] args) {//检查异常:try {try {Class.forName("Test3").newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}} catch (ClassNotFoundException e) {e.printStackTrace();}}
}

处理方式2:多重catch

package P1.package2;public class Test3 {public static void main(String[] args) {//检查异常:try {Class.forName("Test").newInstance();} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}}
}

处理方式3:throws

package P1.package2;public class Test3 {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {//检查异常:Class.forName("Test").newInstance();}
}

6:throw和throws的区别

(1)位置不同:

throw:方法内部

throws: 方法的签名处,方法的声明处

(2)内容不同:

throw+异常对象(检查异常,运行时异常)

throws+异常的类型(可以多个类型,用,拼接)

(3)作用不同:

throw:异常出现的源头,制造异常。 (出现问题就地解决)

throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现我声明的这些异常。然后调用者对这个异常进行处理:要么自己处理要么再继续向外抛出异常。(出现问题先不解决而是甩锅,甩给方法的调用着)

7:练习题

package P1.package2;public class Test4 {// 属性private String name;private int age;private String sex;// 方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) throws Exception {if(sex == "男" || sex == "女") {this.sex = sex;}else {// 制造运行时异常//throw new RuntimeException("性别不对!");// 制造检查异常try {throw new Exception();} catch (Exception e) {e.printStackTrace();}// 甩锅法throw new Exception();}}@Overridepublic String toString() {return "Test4{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}public Test4() {}public Test4(String name, int age, String sex) throws Exception {this.name = name;this.age = age;/*try {this.setSex(sex);} catch (Exception e) {e.printStackTrace();}*/this.setSex(sex);}//内部类static class text5 {public static void main(String[] args) throws Exception {Test4 t1 = new Test4();try {t1.setSex("sdasd");} catch (Exception e) {e.printStackTrace();}Test4 t2 = new Test4("asd",10,"sdas");}}
}

8:重载和重写的异常

【1】重载:

没啥关系

在这里插入图片描述

【2】重写:

子类 <= 父类

在这里插入图片描述

9:自定义异常

在这里插入图片描述

如果继承的是运行时异常,那么在使用的时候无需额外处理

如果继承的是检查异常,那么使用的时候需要try-catch捕获或者throws向上抛


http://www.ppmy.cn/news/101836.html

相关文章

C语言中二维数组和二维数组分析

问题 最近有个同事发现一个问题&#xff1a;一个二维数组&#xff0c;想把它传给一个函数&#xff0c;具体代码如下&#xff1a; char array[3][128]; void fun(char** array) {strcpy(array[0],"confirm"); }当我试图直接把二维数组名传给函数的时候&#xff0c;f…

游戏配音怎么弄的?分享三个游戏配音制作方法

随着时代的发展&#xff0c;人们对于配音的要求也越来越高&#xff0c;除了传统的文字配音外&#xff0c;现在又出现了游戏配音。其实游戏配音也是有一定门槛的&#xff0c;并不是人人都可以做得好的。但是如果你想要拥有一位自己喜欢的游戏角色&#xff0c;那么你就要学会游戏…

接入淘宝API接口,获取店铺详情轻松迈入大数据时代

随着电商行业的飞速发展&#xff0c;API接口已经成为了一种不可或缺的技术。作为中国最大的电商平台&#xff0c;淘宝也拥有着自己的API接口。本文将重点讲解淘宝API接口技术&#xff0c;包括其基本原理、使用方法、优缺点等方面&#xff0c;帮助大家进一步了解淘宝API接口的奥…

[转]Github进行fork后如何与原仓库同步

问题场景&#xff1a; 新公司要求所有的代码提交都要先通过自己的库提交到主repo上去&#xff0c;所以先在gitlab网页上fork出一个自己的库&#xff0c;在本地修改完代码后提交到远程自己库上&#xff0c;然后在gitlab网页上发起一个merge request请求&#xff0c;然后等待主r…

接口的讲解

在这里之前我想童鞋们都学习过了springmvc。mybatis-plus。Springboot等一些框架 那么下面我们就整合这些框架 我们通过写crud这些接口 写接口的第一步就是引入pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://m…

六级备考19天|CET-6|翻译练习|真题·青藏铁路|9:30~11:20

目录 1 中文 2 练习 ​ 3 答案​ 4 解析 5 订正 复习 1 中文 2 练习 3 答案 4 解析 铁路 railway/railroad 全长 with a total length of 其中xxx在海拔4000多米以上&#xff0c;非限制性定语从句&#xff0c;960 kilometers of which are over 400 me…

FFMPEG常用命令 音视频合并

目录 一、音频合并 1.获取音频时长 2.合并两段音频 3.合并音频插入空白 二、视频加背景图 三、音视频合成 1.保留视频声音 2.不保留视频声音 四、合并视频 本文将用几个实例&#xff0c;介绍ffmpeg命令的综合使用&#xff0c;主要涉及音频处理、视频处理和音视频合成。…

4种不改变格式将PDF转Word文档的方法

Microsoft Word 使用户能够按照自己的喜好创建和编辑文档。当用户发现一些PDF资源有助于补充他们的文书工作时&#xff0c;他们可能希望将PDF插入到Word文档中&#xff0c;特别是插入多页PDF文件&#xff0c;以进行编辑或其他目的。将 PDF 插入 Word 文档非常容易&#xff0c;只…