首页 > 其他分享 >异常处理

异常处理

时间:2023-10-20 12:33:05浏览次数:26  
标签:处理 try int finally catch 异常 public

异常处理

1. 什么是异常:

指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。

异常指的并不是语法错误和逻辑错误。语法错了,编译不通过,不会产生字节码文件,根本不能运行。

代码逻辑错误,只是没有得到想要的结果,例如:求a与b的和,你写成了a-b

2. 异常的抛出机制

Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类型的对象,并且抛出(throw)。然后程序员可以捕获(catch)到这个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常对象将会导致程序终止。

抛出异常的对象

3. 异常体系

java.lang.Throwable 类是Java程序执行过程中发生的异常事件对应的类的根父类。

Throwable中的常用方法:

  • public void printStackTrace():打印异常的详细信息。

    包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用printStackTrace。

  • public String getMessage():获取发生异常的原因。

3.1 Error和Exception

是Throwable两个子类:一个代表错误,一个代表异常

  1. error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。

    • StackOverflowError(栈内存溢出递归)和OutOfMemoryError(堆内存溢出,简称OOM)。
  2. Exception(可以编写针对性代码解决)

    • 编译时异常:在代码编译阶段,编译器就能明确警示当前代码可能发生(不是一定发生)xx异常
    • 运行时异常:编译通过,运行不通过只有等代码运行起来并确实发生了xx异常,它才能被发现,可以不处理
  • 举例:
public class ExceptionTest {
    public static void main(String[] args) {
        int[] a = new int[10];
        System.out.println(a[10]);
    }
}
public class ExceptionTest {
    public static void main(String[] args) {
        int[] a = new int[10];
        a = null;
        System.out.println(a[0]);
    }
}//NullPointerException
 @Test
    public void test() {
		//ClassCastException
        Object object = new String();
        String str = (String) object;

        Date date = (Date) object;
    }
   @Test
    public void test1() {
        //NumberFormatException
        String string = "123";
        string = "abc";
        int i = Integer.parseInt(string);
    }
  @Test
    public void test2() {
        //InputMismatchException
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        System.out.println(a);
    }
  @Test
    public void test3() {
        //ArithmeticException
        int num = 9;
        System.out.println(num / 0);
    }
 @Test
    public void test5() throws IOException {
        //ClassNotFoundException
        File file = new File("E:\\java笔记\\hello.txt");
        //FileNotFoundException
        FileInputStream fis = new FileInputStream(file);
        //java.io.IOException
        int data = fis.read();
        while (data != -1) {
            //hello world
            System.out.print((char) data);
            data = fis.read();
        }
        fis.close();
    }
}

3.2 异常处理

方式一:try - catch -finally(程序自己处理)

  • 抓抛出模型:

    • 过程一(抛):程序在执行的过程当中,一旦出现异常,就会在出现异常的代码处,生成对应异常类的对象,并将此对象抛出。一旦抛出,此程序就不执行其后的代码了。
    • 过程二(抓):
    • 针对于过程①中抛出的异常对象,进行捕获处理。此捕获处理的过程,就称为抓。 一旦将异常进行了处理,代码就可以继续执行。

    过程:

    try{
    	......	//可能产生异常的代码
    }
    catch( 异常类型1 e ){
    	......	//当产生异常类型1型异常时的处置措施
    }
    catch( 异常类型2 e ){
    	...... 	//当产生异常类型2型异常时的处置措施
    }
    finally{
    	...... //无论是否发生异常,都无条件执行的语句
    }
    
    1. 将可能出现异常的 代码放入try中,一旦出现异常,自动生成一个异常类的对象将此异常抛出,给catch匹配,匹配成功,集中处理

      • 如果声明了多个catch结构,不同的异常类型在不存在子父类关系的情况下,谁声明在上面,谁声明在下面都可以。

      • 如果多个异常类型满足子父类的关系,则必须将子类声明在如果多个异常类型满足子父类的关系,则必须将子类声明在。否则,报错。否则,报错。

      • try中声明的变量,出了try结构之后,就不可以进行调用了。

    2. catch中异常处理的方式:
      ① 自己编写输出的语句。
      ② printStackTrace():打印异常的详细信息。 (推荐)
      ③ getMessage():获取发生异常的原因。

       try {
                //ClassNotFoundException
                File file = new File("E:\\java笔记\\hello1.txt");
                //FileNotFoundException
                FileInputStream fis = new FileInputStream(file);
                //java.io.IOException
                int data = fis.read();
                while (data != -1) {
                    //hello world
                    System.out.print((char) data);
                    data = fis.read();
                }
            } catch (FileNotFoundException e) {//IOException的子类,必须在父类之上
                e.printStackTrace();//打印异常信息
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
  • finally的使用:

finally,无论是否发生异常都会执行的部分

  1. 理解:将一定要执行的代码放在finall中
  2. 无论是否try、catch中是否发生异常,或则在try、catch中是否存在return,finally中的语句都会执行
package com.ygc.Exceptions.Concept;
public class TryCatch_Interview {
    public static void main(String[] args) {
        int result = test("12");
        System.out.println(result);
    }

    public static int test(String string) {
        try {
            Integer.parseInt(string);
            return 1;
        } catch (NumberFormatException e) {
            return -1;
        } finally {
            System.out.println("test结束!!!");
        }

    }
}
package com.ygc.Exceptions.Concept;

public class TryCatch_Interview {
    public static void main(String[] args) {
        int result = test("a");
        System.out.println(result);//0
    }

    public static int test(String string) {
        try {
            Integer.parseInt(string);
            return 1;
        } catch (NumberFormatException e) {
            return -1;
        } finally {
            System.out.println("test结束!!!");
            return 0;
        }

    }
}

finally是可选的

catch也是可选的,但是在catch、finally、必须有一个与try对应

finally使用的场景:

  1. 资源:输入流、输出流、数据库连接、Socket链接等资源,在使用完成后必须显示的关闭,否则会导致内存泄漏

方式二:throws+异常类型(程序调用者处理)

  1. 将异常抛给程序的调用者(甩锅)
  2. 到main()必须停止抛出
  3. 父类方法没有抛出异常,子类方法也不能抛出异常
  4. 如果父类抛出异常,继承之后,子类可以抛出的异常,只能是父类抛出异常的子类。例如:(父类:Exception、子类:FileNotFoundException)可以写运行时异常:RuntimeException
public class ThrowsTest {

    @Test
    public void test() throws Exception {
        //ClassNotFoundException
        File file = new File("E:\\java笔记\\hello1.txt");
        //FileNotFoundException
        FileInputStream fis = new FileInputStream(file);
        //java.io.IOException
        int data = fis.read();
        while (data != -1) {
            //hello world
            System.out.print((char) data);
            data = fis.read();
        }
        fis.close();
    }

    public void method02() {
        try {
            test();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

何时使用try-catch-finally、throws

  1. 出现资源:try-catch-finally
  2. 方法重写,父类没有throws:try-catch-finally
  3. 方法依次调用:方法a中调用了b、c、d方法,b、c、d是递进关系:throws(数据库链接操作)、在main方法中统一使用try-catch-finally处理异常

手动抛出异常:throw 对象(),抛出对象的类型

package com.ygc.Exceptions.Concept;
public class ThrowTest {
    public static void main(String[] args) {
        Student student = new Student();
        try {
            student.registe(10);
            student.registe(-10);
            System.out.println(student);
        } catch (Exception e) {
            System.out.println(e.getMessage());//输入非法
        }
    }
}

class Student {
    int id;

    public void registe(int id) {
        if (id > 0) {
            this.id = id;
        } else {
            throw new RuntimeException("输入非法");
        }

    }
}

自定义异常:

  1. 自定义一个异常类:必须继承于异常的父类

3.3面试题

final、finally、finalize三者的区别:

三者没有任何关系

  1. final是变量修饰符、可以修饰成员变量、局部变量、类
  2. finally是捕获异常使用的一个关键字
  3. finalize是一个方法、在被垃圾回收之前执行操作,jdk8后已经不推荐使用

标签:处理,try,int,finally,catch,异常,public
From: https://www.cnblogs.com/ygcDiary/p/17776811.html

相关文章

  • RIS/PACS系统源码 智能化的影像报告系统,三维影像处理功能
    影像科室信息管理系统源码 RIS/PACS系统源码 PACS三维影像处理系统源码影像科室信息管理系统,它包括RIS系统、PACS工作站和PACS服务器系统。提供强大的结构和智能化的影像报告系统、支持各种图象操作,以及实现图像的路由、预取、多级多层次存储。系统特点适用于各类体检中心,门诊部......
  • 第六章 管理错误和异常
    trycatch异常处理throw:扔出异常catch:抓住异常代码放到try中,代码运行时会执行try语句。如果没有异常,这些语句将执行下去,直到运行结束;如果一旦出现异常则跳出try,去执行catch中的内容(可以多个catch同时存在)。示例:try{//有可能出现错误的代码}catch{......
  • React学习笔记09- 事件处理
    React采用on+事件名的方式来绑定一个事件,注意,这里和原生的事件是有区别的,原生的事件全是小写onclick,React里的事件是驼峰onClick,React的事件并不是原生事件,而是合成事件。 事件回调的几种写法1.直接在组件内定义一个非箭头函数的方法,然后在render里直接使用onClick={......
  • 三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍
    三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍   三维模型3DTile格式的轻量化处理旨在减少模型的存储空间和提高渲染性能。以下是一些推荐的工具软件,可以用于实现这个目的:MeshLab:MeshLab是一个开源的三维模型处理软件,它支持多种格式的导入和导出,包括3DTiles。通......
  • jfinal框架下,连接国产达梦数据库,抛出SocketTimeoutException异常
    公司为政府开发项目,主框架选择springboot,orm框架使用jfinal。数据库为国产达梦数据库写统计类服务时,通常sql运行时间会比较久,超过10s的sql一定会报SocketTimeoutException异常 尝试使用原生jdbc创建连接,运行sql毫无问题。遂检查连接池设置。jfinal使用druid连接池网上搜索......
  • JAVA项目中的常用的异常处理情况
    https://www.cnblogs.com/gothic-death/p/9946415.html在说java异常处理情况之前简单说下:java中异常的定义。java程序在运行时出现的不正常情况称之为异常。为了防止此类情况发生后及时处理该异常,java将所有可能发生异常的情况用类的形式进行描述和封装。描述不正常情况的类称为......
  • Python用KNN(K-近邻)回归、分类、异常值检测预测房价、最优K值选取、误差评估可视化
    全文链接:https://tecdat.cn/?p=33917原文出处:拓端数据部落公众号KNN是一种非参数学习算法,这意味着它不会对底层数据做出任何假设。这是一个非常有用的特性,因为大多数客户的数据并不真正遵循任何理论假设,例如线性可分性,均匀分布等等。何时应使用KNN?假设您想要租一间公寓并最近......
  • vivado关联vscod不卡顿处理
    安装版本 推荐:cmd /S /k "code -g [file name]:[line number]"免安装版本只能用这个方法  D:/*****/*****/MicrosoftVSCode/Code.exe-g[filename]:[linenumber] ......
  • Python批量处理aida64extreme收集到的硬件信息
      因需收集部分驻外同事电脑的硬件信息(未连公司内网,无法使用桌管软件统一采集),采用aida64extreme收集后再通过python处理写入数据库。    一.创建表createtable.py#!/usr/bin/python3#coding:utf-8importpymysqldb=pymysql.connect("192.168.xxxx.xxx","r......
  • 极空间Z4 Pro四盘位NAS大升级:酷睿N305处理器加持 性能提升至2.5倍
    今天极空间召开新品发布会,Z4Pro迎来升级,处理器换新,CPU性能提升至此前标准版的2.5倍。极空间Z4Pro新款提供标准版8GB、标准版16GB、性能版16GB三款产品。其中,标准版8GB、标准版16GB采用全新一代英特尔处理器N97,4核3.6G,24核1.2GGPU。而性能版16GB则采用全新一代英特尔酷睿i3N......