Java学习day11:异常

编程入门 行业动态 更新时间:2024-10-22 14:38:08

Java学习day11:<a href=https://www.elefans.com/category/jswz/34/1771210.html style=异常"/>

Java学习day11:异常

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)


Java学习day11:异常

一、异常

1.1生活中的异常

人遇到问题而停止脚步,解决问题后,继续前行。

1.2Java中的异常

1.2.1什么是异常

程序在自上而下执行的时候,发生了不可预期的事件,这个事件阻止程序的运行。这就是异常。

 比如:数组下标越界、类转换异常。

1.2.2如何处理异常

Java给咱们封装很多的异常类,并且提供很优秀的异常处理机制。

其中Java提供了一个类Throwable

小tips:

学习一个新的类的时候,自己看官方文档,主要看构造方法和成员方法

学着多使用API帮助文档:Java 8 中文版 - 在线API手册 - 码工具(在线文档)

ctrl+F打开搜索栏

1.3Throwable类 

1.3.1构造方法
Throwable()构造一个新的可抛出的null作为其详细信息。
Throwable(String message)构造一个具有指定的详细消息的新的throwable。
1.3.2方法
返回值类型方法名+作用
StringgetMessage() 返回此throwable的详细消息字符串。
voidprintStackTrace() 将此throwable和其追溯打印到标准错误流。打印出标准输出流信息
StringtoString()返回此可抛出的简短描述。toString里的是标准输出流的一部分
1.3.3示例 
public class Demo1 {public static void main(String[] args) {System.out.println("嘻嘻");System.err.println("哈哈");Throwable throwable = new Throwable();System.out.println(throwable.getMessage());Throwable throwable2 = new Throwable("哈哈,我傻逼了");System.out.println(throwable2.getMessage());/*** java.lang.Throwable: 哈哈,我傻逼了at com.qfedu.b_trhowable.Demo1.main(Demo1.java:7)*/throwable2.printStackTrace();//java.lang.Throwable: 哈哈,我傻逼了//告知了这个错误信息System.out.println(throwable2.toString());}}
 1.4错误和异常

Throwable 下面有两个子类 一个叫Error(错误) 一个叫Exception(异常)

1.4.1Error

是代表JVM本身的错误,咱们程序员是通过代码解决不了的。

1.4.2Exception

异常,代表程序在运行过程中,发生了不可预期的事件。可以使用Java来出来,让他继续执行下去。

1.4.2.1编译时异常
FileNotFoundException文件找不到异常
SQLExceptionSQL语句异常
ClassNotFoundException类找不到异常
InterruptException中断异常
1.4.2.2运行时异常
ArrayIndexOutOfBoundException数组下标越界
ClassCastException类转换异常
NullPointerException空指针异常

区分好编译时异常和运行时异常,一般来说,程序运行后才报错的都是运行时异常

另外异常作为Throwable的子类,也是可以使用父类的相应方法的

 1.4.3示例
public class Main {public static void main(String[] args) {Exception exception=new Exception();Exception exception1=new Exception("嘻嘻嘻");exception1.printStackTrace();System.out.println(exception1.toString());System.out.println(exception1.getMessage());}

输出:
java.lang.Exception: 嘻嘻嘻
 at org.example.Main.main(Main.java:991)
java.lang.Exception: 嘻嘻嘻
嘻嘻嘻 

1.5异常的处理 

当代码出现异常时,java提供了两种解决方法
1.异常的捕捉
2.异常的抛出

1.5.1异常的捕捉

在程序运行过程中,代码难免有可能会遇到异常。如果没有异常,代码正常执行。如果有异常,就捕捉异常

1.5.1.1语法格式

try {
 有可能出现异常的代码
} catch (异常对象) {
 //针对于上面异常的处理方案
 

1.5.1.2示例 
public class Demo2 {public static void main(String[] args) {test(3, 0);}public static void test (int a, int b) {int ret = 0;try {//有可能个出现异常的代码ret = a / b;} catch (ArithmeticException e) {System.out.println("123");//打印错误信息System.out.println(e.getMessage());}//即使代码有异常,通过捕捉以后。是不会影响程序的接着执行的代码的System.out.println(ret);System.out.println( 4 + 4);}
}

//即使代码有异常,通过捕捉以后。是不会影响程序的接着执行的代码的 

其实try-catch语句,就相当于是一个if-else语句,如果try里面的代码出问题了,就执行catch里的处理方法,此时try里的代码就相当于没用了,如果try里的代码没问题,就不会执行catch里的代码,大家可以通过上述示例代码进行验证

1.5.1.3拓展一下

如果说出现多个异常呢?

jvm虚拟机不会每个异常都执行,先检测到哪个异常,就直接执行哪个异常的catch代码了 

我们用一段代码来感受这个过程

1.最开始这段代码里,如果test(1,0,arr),就会执行打印123的异常,如果是现在的test(1,1,arr),就会执行打印456的异常 

public class Demo3 {public static void main(String[] args) {int[] arr = new int[2];//数组的容量是2test(1, 1, arr);}public static void test (int a, int b, int[] arr) {int ret = 0;try {ret = a / b;//有可能出现的异常的代码arr[2] = 89;//这个会有异常//jvm造出来哪个异常对象,就去catch 到哪个异常然后去执行具体的catch} catch (ArithmeticException e) {System.out.println("123");System.out.println(e.getMessage());} catch (ArrayIndexOutOfBoundsException e) {System.out.println("456");System.out.println(e.getMessage());}System.out.println(4 + 8);}}

2.然后改进一下,把异常写在一起,先检测到哪个就先执行哪个

public class Demo4 {public static void main(String[] args) {int[] arr = new int[2];//数组的容量是2test(1, 1, arr);}public static void test (int a, int b, int[] arr) {int ret = 0;try {ret = a / b;//有可能出现的异常的代码arr[2] = 89;//这个会有异常//jvm造出来哪个异常对象,就去catch 到哪个异常然后去执行具体的catch} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {System.out.println("123");System.out.println(e.getMessage());} System.out.println(4 + 8);}}

3.再改进一下,之前说了,这些异常的父类都是Exception,所以直接用Exception,相当于是子类的异常类型赋值给了父类对象,多态的实际使用 

public class Demo5 {public static void main(String[] args) {int[] arr = new int[2];//数组的容量是2test(1, 0, arr);}public static void test (int a, int b, int[] arr) {int ret = 0;try {ret = a / b;//有可能出现的异常的代码arr[2] = 89;//这个会有异常//jvm造出来哪个异常对象,就去catch 到哪个异常然后去执行具体的catch} catch (Exception e) {System.out.println("123");System.out.println(e.getMessage());} System.out.println(4 + 8);}}

4.最后介绍一下finally语法,就是可以放在catch后面,不管有没有异常都会执行,但是呢,实际上即使没有finally,后面的代码也会执行,所以实际用处不大,知道有这个就行 

public class Demo5 {public static void main(String[] args) {int[] arr = new int[2];//数组的容量是2test(1, 0, arr);}public static void test (int a, int b, int[] arr) {int ret = 0;try {ret = a / b;//有可能出现的异常的代码arr[2] = 89;//这个会有异常//jvm造出来哪个异常对象,就去catch 到哪个异常然后去执行具体的catch} catch (Exception e) {System.out.println("123");System.out.println(e.getMessage());} finally {//无论有没有异常,最终都要执行的System.out.println(4 + 8);}}
}

不知道通过上面这个代码逐渐改进的过程,大家有没有理解到jvm虚拟机的异常处理机制,如果没有,就再多看几次代码,跟着代码跑一跑。这个不难,应该要能理解。

1.5.2异常的抛出

在代码出现异常的地方进行异常的抛出,如果异常的抛出的话,一旦发生异常,从出现异常的地方会终止代码。

1.5.2.1两个关键字
throw在方法中抛出一个异常。自己造一个错
throws在方法的声明处书写,告知当前调用者,此处有异常。要小心
区别throw的是异常的对象,是主动抛出异常给jvm虚拟机让其报错,同时throw往往是运行时异常抛出,可以直接在函数体内声明,而throws则往往是编译时异常抛出,需要先在函数体外声明

以后实际开发中是发生错误后主动抛出一个异常,会设置一个全局异常处理器,去主动抓取这个异常,再进行处理,比如,登录事件,如果密码错误,抛出异常,全局异常处理器抓取这个异常,然后返回给前端一个错误json格式数据,前端再弹出密码错误窗口

 1.5.2.2示例
import java.io.FileNotFoundException;public class Demo8 {public static void main(String[] args) throws Exception{test(0);Thread.sleep(1000);}public static void test (int a) throws FileNotFoundException{if (a == 0) {//编译时异常throw new FileNotFoundException();}System.out.println("jvm xixi");}}

关于异常:一阶段和二阶段  只需要会咋抛的或者咋捕捉的即可.要么用try-catch,要么用throw

1.6自定义异常

1.6.1自定义异常原因

Java给咱们提供了很多的异常对象,但是有的时候还是满足不了现实生活的需求,所以出现自己造异常对象。但是记住:一定要继承Exception!

1.6.2示例
public class Demo11 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个整数:");int score = scanner.nextInt();try {test(score);} catch (Exception e) {System.out.println(e.getMessage());}}public static void test (int score) throws Exception {if (score > 100 || score < 0) {throw  new Exception("输入的整数有误的。。。");}if (score >= 90 && score <= 100) {System.out.println("优秀");} else if (score >= 80) {System.out.println("良好");} else if (score >= 70) {System.out.println("及格");} else {System.out.println("叫家长。。。");}}}

不过实际上,我们都不需要自己定义异常,与其继承Exception,干嘛不直接用Exception呢? 


以上就是今天所有的知识点,其实不止,但是异常的知识点有点多,想了想今天就先写异常,大家先把这个知识点吃下再说,异常最开始看着代码多,其实不难,用多了就习惯了。

今天的没有习题,大家多看多写多理解,把示例吃透就好。

更多推荐

Java学习day11:异常

本文发布于:2023-11-15 04:27:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1593631.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:异常   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!