一、JAVA的异常学习

专升本了,工作辞了,进了一所民办的院校,有JAVA的课程,但是因为时间没有合理的安排导致上课没听什么课,考试前又没复习,作业也没交两个,本来做好了补考的打算,但是神奇的是,我JAVA过了,考虑到下个学期有和JAVA相关的课程,在浪了半个月的情况下,这个寒假开始学JAVA,打卡第一天。时间:2022年1月16日

任务待办:

1、学习JAVA

2、通过3月份的计算机4级考

3、通过3月份的计算机2级考

4、预习下个学期的课程


 正文


 异常学习所需要的两个包:

import java.util.InputMismatchException;      //此包在这里的用处是创建一个用来保存错误消息的字符串的引用
import java.util.Scanner;          //这个包是Scanner类所用到的包


 什么是异常?

程序运行中发生的时间,该事件可以中断程序指令的正常执行流程


 遇到异常的处理机制:

1、JAVA程序运行时出现问题,系统会自动检测到该错误,并立即生成一个与该错误对应的异常对象
2、异常对象提交给JAVA虚拟机
3、JAVA虚拟机会自动寻找相应的处理代码来处理这个异常
    如果没有找到,则JAVA虚拟机做一些简单的处理后,程序被强行终止
4、程序员可以编写代码来捕捉可能出现的异常,并编写代码来处理相应的异常


 异常的分类

1、Error是系统异常,由JAVA虚拟机生成并抛出,程序员无法处理这些异常

2、Exception是程序员可以捕获并处理的异常,一般程序中可预知的问题,其产生的异常可能带来意想不到的结果,因此JAVA编译器要求JAVA程序必须捕获或声明所有的非运行时异常

3、RuntimeException是Exception的子类异常,代表可以处理也可以不处理的异常,是JAVA虚拟机在运行时生成的异常,如被0除产生的系统错误、数组下标越界等,产生的比较频繁,处理麻烦,对程序可持续性和运行效率影响太大,因此由系统检测,用户可不做处理

4、凡是继承自Exception但又不是RuntimeException子类的异常我们都必须捕获并处理

 

 


 普通代码:

public class Exception {
    public static void main(String[] args) {
        int i;
        Scanner sc = new Scanner(System.in);  //和C语言不同,scanf并没有被继承过来,取而代之的是一个Scanner


  // 在new对象的时候,其构造方法需要一个参数,这里是System.in的参数,这是系统输入的意思,可以理解为读取用户从键盘的输入


        i = sc.nextInt();               //调用方法 nextInt() 代表将输入的值标记为int类型
        System.out.print(i);           

问题:如果我们输入的值是非数字的值,报错怎么办?


try catch语句

 


 

语句的执行流程:

1、如果try内的的代码出现异常则中断执行(从出现异常的那行/段代码开始)

2、执行对应的catch块内的代码(如果异常的类型是catch括号中的类型)

3、继续执行try catch语句结构之后的代码


 

代码的写法:

try

{

可能出现异常的代码块

}catch(异常的类名1 引用名A)

{

(如果出现了异常类中的异常,则执行该段的代码)  //catch可以有多个

}catch(异常的类名2 变量名B)

{

(如果出现了异常类中的异常,则执行该段的代码)

}finally

{

(最终肯定必须要执行的代码,无论是否捕捉到异常)  

}


处理异常的代码

try                
{                 
  i = sc.nextInt();          
  System.out.print(i);        
}                 
catch(InputMismatchException e)      //如果出现了InputMismatchException类型的异常,则执行下面{}中的代码
{
  System.out.printf("输入数据不合法");
}

 

注意事项:

1、如果catch内的异常类存在子父类的关系,子类应该在前,父类在后

2、如果finally中有return语句,那么最后返回的结果肯定以finally中的返回值为准

3、如果finally语句中有return,那么没有被处理的异常会被吞掉(说实话这三点不是很理解,等有一天理解了再回来填坑吧)

*/


 问题:那我们为什么不能用 if else来处理异常呢?

原因:程序出现的问题是无法通过逻辑判断来解决的,JAVA提供的异常处理机制可以解决逻辑判断所无法处理的问题


 

printStackTrace()方法

用处:用来打印在堆中的路径信息

try                
{                 
  i = sc.nextInt();          
  System.out.print(i);        
}                 
catch(InputMismatchException e)
{
  System.out.printf("输入数据不合法");

  e.printStackTrace();  //在接收异常信息的类中的方法,用于输出出错的信息
}

 

 如图,输入ffff字符串,由于输入信息不属于int类型,进行了catch匹配,发现错误属于InputMismatchException类,将错误的信息存在引用类型的变量e中,接着执行catch中的语句,输出:输入数据不合法 (还有相应的错误路径信息)

 


 

 


throw 和 throws的用法

throw:抛出异常

throws:将异常抛(交)给上一级(调用的)程序进行处理(俗称甩锅)

 

 

如图这种方法将其产生的异常交由JAVA的虚拟机进行处理(main方法的上一级是虚拟机)

 

 还没看完,就到这里了,懵懵懂懂的

 我悟了,JAVA存在这么多年,应该多看看前辈们的笔记进行学习,而不是通过视频辅以百度的方式,低效切浪费时间,使自己不专注

 

 

 

人类前进的步伐怎能止步于此?

参考文献:

https://blog.csdn.net/qq_34427165/article/details/83929470

https://blog.csdn.net/wanghuiwei888/article/details/78818203

https://www.bilibili.com/video/BV1ps411F7Sn?p=49

posted @ 2022-01-16 14:52  魂梦纤  阅读(68)  评论(0)    收藏  举报