欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

⚔疯狂输出⚔ 异常处理 异常的分类

程序员文章站 2022-04-21 17:56:54
...

异常处理
Throwable (异常处理的父类)
Throwable中的方法

public class Demo0{
public static void main(String[] args) {
      Exception exception = new Exception("我是异常信息");

       //相当于调用 异常类中的toString方法
      //打印的 异常的类名  和 异常信息
     // System.out.println(exception);

      //只打印异常信息
     // System.out.println(exception.getMessage());

      //打印的是异常类名 信息 加 出现的位置 
      //java中 jvm默认打印这个方法
      exception.printStackTrace();
}
}

Error 系统奔溃 数据库奔溃 (跟咱们代码没关系)
Exception 异常 是跟代码有关系的

RutimeException 运行时异常

出现异常 系统如何解决 ????
main函数的解决方式
1.main 函数自己解决
2.mian函数把问题抛给上级去解决(谁调用的main函数 谁去解决)
那当main函数解决不了的时候main函数会怎么办?
1.main数会 ———–交给jvm虚拟机去解决2.
2.如果jvm虚拟机解决不了的话就会 打印错误信息 和错误发生在什么位置
3.jvm虚拟机也解决不了会打印错误信息和发生的位置让我们自己进行解决

解决异常的方式
try(尝试) 指测试这个异常
catch(捕获)指捕获这个异常
finally(最后)指异常结束后做的事情

捕获的流程
1.发生异常
2.根据发生异常的异常对象 产生对应的异常对象
3. 这个异常对象 会返回给调用者
4. 如果调用者处理了这个异常 (添加try…catch)
异常对象会根据catch进行匹配 匹配上执行catch中的语句
程序会继续执行下去
5. 如果调用者没有处理这个异常 默认会交给jvm去处理异常
根据产生的异常对象 打印对应的错误信息和错误发生的位置
程序停止
下面我们写一段代码来验证一下上述的流程(单catch的捕获异常)

public class unusual{   //创建一个名字叫(unusual)异常的类
public static  void  main(String[]args){
TestException  test  = new   TestException(); //创建一个test对象
try{ 
 //发生异常的代码
 int num  =  test.fun(50);
//相当于返回了个异常对象
System.out.println(num);
}catch(ArithmeticException e){
//捕获异常
//ArithmeticException
//catch会匹配这个异常对象
//如果匹配成功就能捕获异常? 
//如果匹配上就执行catch中的语句
//捕获后 程序会继续执行
System.out.println("除数为零了")
}
}
}

多catch 的捕获异常
异常处理的作用 : 帮们来完善代码 让我们自己出现的错误更容易被发现

public  class  usnsual{
public static void main(String[] args) {
    int[] array = {1,2,356};
    try {
        //测试代码异常
        System.out.println(8/0);
        //产生  new  ArithmeticException()
        //之后  就去匹配 catch
        //匹配成功后  程序 继续向下执行
        System.out.println(array[8]);
    } catch (ArithmeticException e) {
        //注意如果使用Exception 直接使用匹配异常  
        //多个catch同时捕获时  Exception需要写在最后  
        //因为Exception中是所有异常的集合父类所以如果Exception写在前面
        //后面的 catch 相当于白写了

        System.out.println("除数为0了");
    }catch (ArrayIndexOutOfBoundsException e) {

        //如果发生多个异常需要匹配多个catch
        System.out.println("数组越界了");
    }
    System.out.println("猜猜我执行了么?");
}
}

finally
它的作用就是 :不管你异常有没有发生 有没有匹配到都会执行。
写一个例子

public class Demo
public  static  void main(String[]agrs){
  try {
        System.out.println(10/1);
        return;
    } catch (ArithmeticException e) {
        System.out.println("除 0 了");
    } finally {
        System.out.println("你看我执行了么?");
    }
    System.out.println("我是下面的语句");
}
}
}

异常还分为两种 运行时异常 编译时异常
运行时异常 : 一定是自己代码哪里出了问题才会发生运行时异常
运行时语法上没有错误 可以运行但是运行时会报错。
编译时异常 : 就是问题的提前预警 强制你去处理这个异常如果你不出来这个异常
编译也不会通过
也就是说在编写代码的时候在语法结构上有问题系统会提示你修改

编译异常解决流程

编译异常
系统这时候不知道你到底有没有这个文件然后会问你
没有这个文件该怎么处理
如果你不解决他会强制的要求你去解决我就是停止运行这个程序
这就是编译时异常 我们所说的编译时会报错
//解决异常的两种方式
1.自己去处理 利用 try catch
2.把问题抛出去 那抛给谁呢? 谁要调用就抛给谁 就让调用的那个函数或者方法区处理

下面我们来练习一个题
无限输入整数 存放 到集合中打印 输入quit停止
希望在输入 字符串的时候让程序 也能继续运行

//创建一个类
public class  Demo{
System.out.println("请输入");
Scanner scanner  =  new Scanner(System.out);//输入一个值
ArrayList<Integer> arrayList  = new ArrayList<>(); //创建一个对象
while(true)  //让他输入整数可以一直输入不停止   写一个死循环
//接收输入的字符串
String  string  = scanner.nextLine();
if(string.equals("quit")){
//跳出本层循环
braek;
}//自己处理这个异常
try{
    //字符串转数字
    int  num  = Integer.parseInt(string);
    //添加进数组、
    arrayList.add(num);
}catch(NuberFormatException e){
System.out.println("请输入一个整数" + "或者输出 quit");
}
}
for(Integer integer : arrayList);
System.out.println(integer);
    }
 }
 }