Java中异常的学习

目录

Java 异常概述

异常的抛出机制

异常的解决方法(处理机制)

Java异常体系结构

常见的异常

异常处理

try

catch

finally

throws

throw

运行期异常和编译期异常

自定义异常


Java 异常概述

        在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行

过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式

,读取文件是否存在,网络是否始终保持通畅等等。

异常:程序在运行过程中出现的不正常情况
     例如用户输入的信息不正确,或者在网络传输中忽然断网了等等
     出现异常后,Jvm(虚拟机)停止运行,后续程序无法执行
   注意:异常指得不是语法错误。语法错误,编译失败,不会产生字节码文件,根本不能运行

异常的抛出机制

     Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类型的对象,并且抛
出。然后程序员可以捕获到这个异常对象,并处理。
     如果没有捕获这个异常对象,那么这个异常将会导致程序终止。
   以下是出现一个异常后控制台所显示的信息:

异常的解决方法(处理机制)

第一种(默认):是遇到错误就终止程序的运行。将Java中出现的异常,按不同的类型进行分类,为

每种异常分装了一个类来进行表示当出现某种异常情况时,会抛出此类的对象,然后终止虚拟机的

运行。

第二种是程序员在编写程序时,就充分考虑到各种可能发生的异常和错误,极力预防和避免。实在

无法避免的,要编写相应的代码进行异常的检测、以及异常的处理,保证代码的健壮性。使用异常

处理机制,对程序运行过程中的异常进行捕获和处理

Java异常体系结构

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

Throwable中的常用方法:

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

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

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

Throwable可分为两类:Error和Exception。分别对应java.lang.Errorjava.lang.Exception两个类。

Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不

            编写针对性的代码进行处理。

例如:StackOverflowError(栈内存溢出)和OutOfMemoryError(堆内存溢出,简称OOM)。

Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处

                   理,使程序继续运行。否则一旦发生异常,程序也会终止。

常见的异常

Error:

      堆溢出: OutOfMemoryError

      栈溢出: StackOverflowError

Exception——RuntimeException(异常——运行时异常
      数组越界异常
      类型转换异常
      数字格式化异常
      空指针异常
      算术异常
public class Demo {
    /*
    异常:程序在运行过程中出现的不正常情况
         例如用户输入的信息不正确,或者在网络传输中忽然断网了等等
         出现异常后,Jvm(虚拟机)停止运行,后续程序无法执行
       注意:异常指得不是语法错误。语法错误,编译失败,不会产生字节码文件,根本不能运行

       Java中默认的异常处理机制:将Java中出现的异常,按不同的类型进行分类,为每种异常分装了一个类来进行表示
                             当出现某种异常情况时,会抛出此类的对象,然后终止虚拟机的运行
           使用异常处理机制,对程序运行过程中的异常进行捕获和处理

     */
    public static void main(String[] args) {
        int []a=new int[2];
        System.out.println(a[3]);
        /*
        六种常见的异常

        int a = 10;
        int b = 0;
        if(b!=0)
          System.out.println(a/b);  ArithmeticException 算术异常


        int[] c = new int[2];
        c[3] = 0;  ArrayIndexOutOfBoundsException 数组索引越界

        String s  = "abc";
        s.charAt(4);  StringIndexOutOfBoundsException 字符串索引越界

        Object s = new Integer(10);
        String  s1 = (String)s;   ClassCastException 类型转换异常

        int a =   Integer.parseInt("10a");//  NumberFormatException 数字格式化异常

        String s = null;
        s.length();  NullPointerExceptio  使用null中的方法/属性  一般在java中也称为 空指针异常

         */
    }
}

异常处理

    Java编程语言使用异常处理机制为程序提供了错误处理的能力

    Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws

try

       检测不安全的代码块(发现异常)

try块中任何一条语句发生了异常,下面的代码将不会被执行,程序将 跳转到异常处理代码块中,

    即catch块。因此,不要随意将不相关的代码放到try块中,因为随时可能会中断执行。

catch

把抓到的类型匹配的异常捕获,保证程序能继续运行下去

catch语句必须紧跟着try语句之后,称为捕获异常,也就是异常处理函数。

一个try后面可以写多个catch,分别捕获不同类型的异常,要从子类往父类的顺序写,否则有编译错误

捕获异常的有关信息:

    与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。

    getMessage() 获取异常信息,返回字符串

     printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

public class Demo1 {
     /*
         异常处理:
            在编码时,就针对可能出现问题的代码(可能是经验问题)预习编写一些处理机制来对代码进行处理,步骤一般为以下四步
            程序运行
            出现异常
            执行处理机制
            继续运行后续的程序

            try{
              编写可能出现异常的代码
              如果类型为算术异常,但catch捕捉的类型为数组越界异常,则不会进入到catch中
            }catch(异常类型 比如数组越界异常 ){
                 处理机制
            }
      */

    public static void main(String[] args) {
        int a = 10;
        int b = 0;
/*
        int []aa=new int[2];
        int bb=aa[3];
        在此之前出现错误时,则不执行后续代码
*/
        try{
            int c = a/b;//算术运算
        }catch (ArithmeticException ai){
            ai.printStackTrace();//打印异常信息到控制台,一般在开发调试阶段使用,供开发人员定位异常问题
            System.out.println("算术异常");
        }
        System.out.println("Aaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
    }
}
public class Demo2 {


    public static void main(String[] args) {

        try{
            String s = null;
            s.length();

            int num = Integer.parseInt("10a");

            int [] a = new int[5];
            for (int i = 0; i <=a.length ; i++) {
                System.out.println(a[i]);
            }

        }catch (ArrayIndexOutOfBoundsException ai){
            ai.printStackTrace();
            System.out.println("数组索引越界,越界索引:"+ai.getMessage());//拿到异常原因
        }catch (NumberFormatException nex){
            nex.printStackTrace();
            System.out.println("数字格式化异常:"+nex.getMessage());
        }catch (Exception e){ //在后面catch Exception类型, 可以捕获任意的异常类型,但是必须要放到最后面,因为下面可能有更加详细类型的捕捉,如果使用Exception类型,那么就一定会进入这个catch,运用了多态
            e.printStackTrace();
            System.out.println("系统忙 请稍后再试");
        }
        System.out.println("aaaaaaaaaaaaaaaaaa");
    }
}

finally

       finally该内容总是会执行的,只能有一个finally语句

finally{

     必须执行的内容    }

public class Demo3 {
          /*
         异常处理:
            在编码时,就针对可能出现问题的代码(可能是经验问题)预习编写一些处理机制来对代码进行处理,步骤一般为以下四步
            程序运行
            出现异常
            执行处理机制
            继续运行后续的程序
            try{
              编写可能出现异常的代码
              如果类型为算术异常,但catch捕捉的类型为数组越界异常,则不会进入到catch中
            }catch(异常类型 数组越界异常 ){
                 处理机制
            }finally{
                  finally代码块中的内容总能执行, 一定会执行
            }
      */
          public static void main(String[] args) throws IOException {
              //应用场景1
              try{
                     int num = Integer.parseInt("10a");
                 }catch (ArrayIndexOutOfBoundsException nex){
                       nex.printStackTrace();
                }finally {  //异常没有被捕获到,后面的代码无法执行,但是finally中的代码是可以执行的
                    System.out.println("qqqqqqqqqqqqqqqqqqqqqqqq");
                }
              System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaa");

              //应用场景2
              FileInputStream in = null;
              try {
                  in = new FileInputStream("D:/demo10086.txt");//文件一旦找不到,就会出现异常
                  while (in.read()!=-1){

                  }
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
                  System.out.println("文件找不到异常");
              }finally { //确保在出现异常的情况下 依然最终把流对象关闭掉
                  if(in!=null){
                      in.close();
                  }
              }
              System.out.println("aaaaaaaaaaaaaaaaaa");

              //应用场景3
              test(10,5);
              System.out.println("aaaaaaaaaaaaaaaaaa");
          }
    public  static int  test(int a,int b){

        try {
            return a/b;
        }catch (ArithmeticException ae){
            ae.printStackTrace();
            System.out.println("算术异常");
            return  -1;
        }finally { // 无论是try中还是catch进行return,也必须在return之前 先执行finally代码块
            //关闭流操作
            System.out.println("关闭流");
        }

    }

}

throws

     定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进

行处理。

例如:

public void test throws 异常1,异常2,异常3{ 代码 }

    任何方法都可以使用throws关键字声明异常类型,包括抽象方法。

    调用使用了throws的方法时必须处理声明的异常,要么使用try-catch,要么继续使用throws声

明。

     如果抛出的是运行期异常,则不会有任何提示,需要查看所调用的方法结构.

public class Demo4 {
    public static void main(String[] args) {
        try {
            //最顶层的main方法中就不能再抛出了,必须对异常进行处理
            methodA();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            System.out.println("编码异常");
        }
        System.out.println("main");
    }

    public static  void  methodA() throws UnsupportedEncodingException {
        methodB();
        System.out.println("methodA");
    }

    /*
       用methodB方法模拟一个底层方法
       throws 异常类型  声明表示此方法中可能会出现给定的异常, 并且该方法不处理异常
       谁调用谁处理
       异常(Exception)分为俩类:
        检查期异常:在编译期间就会主动提示程序员要进行处理的异常
        运行期异常:在编译期间不会主动提示程序员要进行处理的异常
        区别在于该异常类有没有继承RuntimeException
     */
    public static  void  methodB() throws UnsupportedEncodingException {
        String s = "abc";
        s.getBytes("gbk-1"); //根据一个编码表进行转换;(正确为gbk) throws UnsupportedEncodingException 表示此方法可能会出现 UnsupportedEncodingException异常
        System.out.println("methodB");
    }
}

throw

throw关键字用于显式抛出异常,抛出的时候是抛出的是一个异常类的实例化对象.

语法:throw new 异常类构造方法

如: throw new RunTimeException();

public class Demo5 {
    public static void main(String[] args) {
        /*
        throws:用在方法声明部分,表示次方法中有可能会出现某种类型的异常,该方法不处理异常,谁调用谁处理

        throw:在方法体中,抛出一个具体的异常对象,该方法终止运行,在异常对象的构造方法中传入异常原因
         */
           try {
               char c= level(101);
           }catch (ArithmeticException ai){
               ai.printStackTrace();
               System.out.println(ai.getMessage());
           }finally {
               System.out.println("分数错误,请重新输入");
           }
        System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAA");
    }
    public static char level(int socre)throws ArithmeticException{
        if (socre<0|| socre>100){
            throw new ArithmeticException("分数异常");//当不满足某种条件时,程序主动抛出异常对象,终止此方法继续向下执行,通过异常构造方法来传入异常原因
        }
        if (socre>=90){
            return 'A';
        }else return 'B';
    }

}

运行期异常和编译期异常

编译时期异常(即checked异常、受检异常):

  在代码编译阶段,编译器就能明确警示当前代码可能发生(不是一定发生)XX异常,并明确告知

程序员提前编写处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判

定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的。

运行时期异常(即runtime异常、unchecked异常、非受检异常):

    在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提

示。只有等代码运行起来并确实发生了XX异常,它才能被发现。通常,这类异常是由程序员的

代码编写不当引起的。

自定义异常

自定义异常就是自己定义的异常类,也就是API中的标准异常类的直接或间接的子类。
作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 连接高斯数据库报错

问题1&#xff1a;报错信息&#xff1a; import psycopg2时报错 /lib64/libgssapi_krib5.so.2 symbol krb5_ser_contect_init version krb5_3_MIT not defined in file libkrb5.so.3 错误原因&#xff1a; 解决&#xff1a; 若通过更换krb相关安装包&#xff0c;psycopg2 …

excel 整理表格,分割一列变成多列数据

数据准备 对于很多系统页面的数据是没有办法下载的。 这里用表格数据来举例。随便做数据的准备。想要看excel部分的可以把这里跳过&#xff0c;从数据准备完成开始看。 需要一点前端基础知识&#xff0c;但不多&#xff08;不会也行&#xff09;。 把鼠标放在你想要拿到本地的…

刀客doc:快手的商业化架构为什么又调了?

一、 1月10日&#xff0c;快手商业化及电商事业部进行新一轮的架构调整。作为2025年快手的第一次大调整&#xff0c;变动最大的是负责广告业务的商业化事业部。快手商业化将原来的8个业务中心&#xff0c;现在统合成了5个&#xff0c;行业归拢看上去更加明晰了。 根据自媒体《…

thinkphp 5.0 结合redis 做延迟队列,队列无法被消费

目录 一、Linux 环境下 二、如何验证消息队列被正确监听 一、Linux 环境下 项目部署在Linux 环境下&#xff0c;首先找到项目的部署路径&#xff0c;接着输入命令,这个命令是以守护进程方式进行监听你的队列&#xff0c;只要redis 不关闭 就可以一直监听这个队列 nohup php …

计算机网络 (40)域名系统DNS

前言 计算机网络域名系统DNS&#xff08;Domain Name System&#xff09;是互联网的基础技术之一&#xff0c;它负责将人类可读的域名转换为计算机用来通信的数字IP地址。 一、基本概念 DNS的主要目的是将域名解析或翻译为IP地址&#xff0c;使得用户可以通过简单易记的域名来访…

做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)

图&#xff1a; 股票自选助手 这是一个基于 Django 开发的 A 股自选股票信息查看系统。系统使用 akshare 库获取实时股票数据&#xff0c;支持添加、删除和更新股票信息。 功能特点 支持添加自选股票实时显示股票价格和涨跌幅一键更新所有股票数据支持删除不需要的股票使用中…

C#使用OpenTK绘制3D可拖动旋转图形三棱锥

接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…

《C++11》nullptr介绍:从NULL说起

在C11之前&#xff0c;我们通常使用NULL来表示空指针。然而&#xff0c;NULL在C中有一些问题和限制&#xff0c;这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中&#xff0c;NULL实际上是一个整数0&#xff0c;而不是一个真正的…

Postman 接口测试平替工具,可视化开发省事!

在软件开发的漫长旅程中&#xff0c;接口测试工具一直是开发者的得力助手。Postman 作为全球知名的接口测试工具&#xff0c;长期占据市场主导地位。然而&#xff0c;随着国产工具的崛起&#xff0c;越来越多的开发者开始寻找更适合中国开发者的替代方案。一款 Apifox&#xff…

代码随想录算法训练营day20(0113)

1.二叉搜索树的最近公共祖先 在上次做完二叉树的最近公共祖先后&#xff0c;此题就显得比较简单了。不过要拓展一下&#xff0c;因为二叉搜索树有一些特性的&#xff0c;可以更加方便的解题。 题目 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节…

使用C# CEFSharp在WPF中开发桌面程序实现同一网站多开功能

在网络商业运营领域&#xff0c;同时运营多个淘宝店铺的现象屡见不鲜。为了满足这一需求&#xff0c;实现同一网址的多开功能变得尤为关键。这一需求虽然实用&#xff0c;但实现起来却面临诸多挑战。在这个过程中&#xff0c;技术人员们也经历了不少喜怒哀乐。 开发经历回顾 …

Shell 经典面试例题

1.shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 编写脚本&#xff1a; #!/bin/bash FILE"/tmp/size.log" if [ -f "$FILE" ]; then echo "文件存在&#xff0c;显示文件内容&…

移动云自研云原生数据库入围国采!

近日&#xff0c;中央国家机关2024年度事务型数据库软件框架协议联合征集采购项目产品名单正式公布&#xff0c;移动云自主研发的云原生数据库产品顺利入围。这一成就不仅彰显了移动云在数据库领域深耕多年造就的领先技术优势&#xff0c;更标志着国家权威评审机构对移动云在数…

Centos 宝塔安装

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 安装成功界面 宝塔说明文档 https://www.bt.cn/admin/servers#wcu 或者可以注册宝塔账号 1 快速部署 安装docker 之后 2 需要在usr/bin下下载do…

ros2笔记-6.2 使用urdf创建机器人模型

本节主要跟着小鱼老师的视频操作&#xff0c;不同的仿真平台有不同的建模语言&#xff0c;但是几乎都支持URDF。 本节使用URDF创建一个机器人模型。 6.2.1 帮机器人创建一个身体 URDF使用XML来描述机器人的结构和传感器、执行器等信息。 在chapt6/chap6_ws/src创建功能包:r…

文章复现—面向配电网韧性提升的移动储能预布局与动态调度策略

目录 一、主要内容&#xff1a; 二、实际运行效果&#xff1a; 三、文章介绍&#xff1a; 四、完整代码数据下载&#xff1a; 一、主要内容&#xff1a; &#xff08;matlab代码&#xff09;该程序复现《面向配电网韧性提升的移动储能预布局与动态调度策略》&#xff0c;具…

【ASP.NET学习】Web Forms创建Web应用

文章目录 什么是 Web Forms&#xff1f;ASP.NET Web Forms - HTML 页面用 ASP.NET 编写的 Hello RUNOOB.COM它是如何工作的&#xff1f;经典 ASP ASP.NET Web Forms - 服务器控件经典 ASP 的局限性ASP.NET - 服务器控件ASP.NET - HTML 服务器控件ASP.NET - Web 服务器控件ASP.N…

python-leetcode-旋转图像

48. 旋转图像 - 力扣&#xff08;LeetCode&#xff09; class Solution:def rotate(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""n len(matrix)# 矩阵转置for i in range(n):for…

GPT 系列论文精读:从 GPT-1 到 GPT-4

学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】…

《计算机网络》课后探研题书面报告_了解PPPoE协议

PPPoE协议的工作原理与应用分析 摘 要 PPPoE&#xff08;Point-to-Point Protocol over Ethernet&#xff09;是一种广泛应用于宽带接入的网络协议&#xff0c;特别是在DSL&#xff08;数字用户线路&#xff09;和光纤网络中具有重要的应用价值。PPPoE结合了PPP协议的认证、加…