Java10(异常处理)

0.复习面向对象

在这里插入图片描述

1.异常的体系结构

异常:在Java语言中,将程序执行中发生的不正常情况.(开发中的语法错误和逻辑错误不是异常)
异常事件分两类(它们上一级为java.lang.Throwable):
在这里插入图片描述

Error

Java虚拟机无法解决的严重问题。可以不使用针对性的代码进行处理。(如:JVM系统内部错误,资源耗尽等)

Exception

其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。(如:空指针访问,网络中断等)
可分为:
编译时异常:在编译期间出现的异常(执行javac.exe命令时,出现异常)
运行时异常:在运行时出现的异常(执行java,exe命令时,出现的异常)
例:

当执行一个程序时,如果出现异常,那么异常之后的代码就不再执行。

2.处理Exception的异常

Java提供的是异常处理的抓抛模型
在这里插入图片描述

“抛”

当我们执行代码时,一旦出现异常,就会在异常的代码处生成一个对应的异常类型的对象,并将此对象抛出。(一旦对象抛出,程序停止执行;异常类的对象抛给方法的调用者)
可分为:
自动抛出

手动抛出(throw + 异常类的对象)

即可以是现成的异常类,也可以自定义的异常类
例:

public class Test4{public static void main(String[] args) {                                     Circle c = new Circle(2.2);Circle c1 = new Circle(2.2);System.out.println(c.compareTo(c1));System.out.println(c.compareTo(new String("AA")));}
}
class Circle {private double radius;//构造器public Circle(double radius){super();this.radius = radius;}//方法public void setRadius(double radius){this.radius = radius;}public double getRadius(){return this.radius;}public int compareTo(Object obj){if(obj == this)return 0;else if(obj instanceof Circle){Circle c1 = (Circle)obj;if(this.radius > c1.radius){return 1;}else if(this.radius == c1.radius){return 0;}else{return -1;}}else{//手动抛出异常throw new RuntimeException("传入的类型有误");//抛出自定义的异常(具体编写见下代码块)//throw new TestException("传入的类型有误");}}
}

自定义异常类

  1. 自定义的异常类继承现有的异常类
  2. 提供序列号,提供几个重载的构造器

例:

//自定义的异常类public class TestException extends RuntimeException{                  static final long serialVersionUID = -7123453234353423L;public TestException(){}public TestException(String msg){super(msg);}	
}

“抓”

抓住上一步抛出的异常类的对象。(抓的方式即为异常处理的方式)
Java提供两种方式来处理一个异常类的对象

方式一(try-catch-finally
try{               //可能出现异常的代码
}catch(Exception e1){//处理方式1
}catch(Exception e2){//处理方式2
}....{//处理方式
}finally{//一定要执行的代码
}

注:

  • try内声明的变量,类似于局部变量,出了try{}语句,就不能被调用

  • finally是可选的

  • catch语句内部是对异常对象的处理

    • getMessage():显示执行过程中出现的异常
    • printStackTrace():显示堆出现的异常(打印异常信息在程序中出错的位置及原因)
  • 可以有多个catch语句的代码,try中抛出的异常类对象从上往下匹配catch中的异常类1的类型,一旦满足就执行catch中的代码,执行完,就跳过之后的catch语句(多条catch语句满足其一就行

  • 如果异常处理了,那么其后的代码继续执行

  • 若多个catch语句中的异常类型为"包含"关系,需要子类放在父类之前进行处理,否则报错

  • 若多个catch语句中的异常类型为"并列"关系,则无先后放置的要求

  • 不管try,catch中是否处理完异常,及是否有return语句,finally中存放的语句一定执行。

  • try-catch语句可以嵌套

  • 运行时异常,可以不显式处理;编译时异常,必须显式处理

例:常见的异常

import org.junit.Test;
import java.io.*;
import java.util.Date;
public class Test2{//1.数组下标越界的异常:ArrayIndexOutOfBoundsException@Testpublic void test(){try{                                   int[] i = new int[10];System.out.println(i[10]);}catch(ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界");}}//2.算术异常:ArithmeticException@Testpublic void test1(){int i = 10;try{System.out.println(i/0);}catch(ArithmeticException e){System.out.println("\u7B97\u672F\u5F02\u5E38啦!");}}//3.类型转换异常:ClassCastException@Testpublic void test2(){try{Object obj = new Date();String str = (String)obj;}catch(ClassCastException e){System.out.println(e.getMessage());}}//4.空指针异常:NullPointerException@Testpublic void test3(){try{Person p = null;System.out.println(p.toString());}catch(NullPointerException e){System.out.println(e.fillInStackTrace());}}//编译时异常@Testpublic void test4(){FileInputStream f = null;try{f = new FileInputStream(new File("hello.txt"));int b;while((b = f.read()) != -1){System.out.println((char)b);}}catch(FileNotFoundException e){System.out.println("文件不存在");}catch(IOException e){System.out.println("输入输出有误");}finally{try{f.close();}catch(Exception e){System.out.println("文件关闭异常");}finally{System.out.println("程序执行完毕");}}}
}
方式二(throws + 异常的类型)
  • 在方法的声明处,显式的抛出该异常对象的类型
  • 格式:如:
 public static void test6() throwsFileNotFoundException,IOException{ }             
  • 当在此方法内部出现异常时,会抛出异常对象给调用者。
  • 异常的对象可以逐层向上抛,直至main中,在此过程中可以用try-catch-finally进行处理

例:

import java.io.*;public class Test3{public static void main(String[] args) throws FileNotFoundException,IOException{    try{test6();}catch(FileNotFoundException e){System.out.println(e.getMessage());}catch(IOException e){e.printStackTrace();}}public static void test6() throws FileNotFoundException,IOException{test5();}
public static void test5() throws FileNotFoundException,IOException{FileInputStream f = new FileInputStream(new File("hello1.txt"));int b;while((b = f.read()) != -1){System.out.println((char)b);}f.close();}
}
  • 子类重写的父类异常方法,其抛出异常类只能是被重写的方法的异常类的子类或异常类型

例:

import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;public class Test6{public static void main(String[] args) throws IOException {   A a = new B();a.test1();}}
class A{public void test1() throws IOException{}
}
class B extends A{public void test1() throws FileAlreadyExistsException{}
}

练习
题一
在这里插入图片描述
结果:
进入A
A-finally
制造异常
进入B
B-finally

题二
在这里插入图片描述

public class EcmDef{public static void main(String[] args) {  try{int i = Integer.parseInt(args[0]);//被除数int j = Integer.parseInt(args[1]);//除数ecm(i, j);}catch(NumberFormatException e){System.out.println("输入数据类型不一致");}catch(ArrayIndexOutOfBoundsException e){System.out.println("缺少命令行参数");}catch(ArithmeticException e){System.out.println("错误:分母为零");}catch(EcDef e){System.out.println(e.getMessage());}}public static void ecm(int i,int j) throws EcDef{if(i < 0 || j < 0){throw new EcDef("输入的数值存在负数");}System.out.println(i/j);}
}
//自定义异常类
class EcDef extends Exception{static final long serialVersionUID = -7223453234353423L;public EcDef(){}public EcDef(String msg){super(msg);}}

感谢大家的支持,关注,评论,点赞!
参考资料:
尚硅谷宋红康20天搞定Java基础中部

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis与Spring整合以及AOP和PageHelper分页插件整合

目录 前言 一、MyBatis与Spring整合的好处以及两者之间的关系 1.好处 2.关系 二、MyBatis和Spring集成 1.导入pom.xml 2.编写配置文件 3.利用mybatis逆向工程生成模型层代码 三、常用注解 四、AOP整合pageHelper分页插件 创建一个切面 测试 前言 MyBatis是一个开源的…

使用kubeadm方式快速部署一个K8S集群

目录 一、环境准备 二、环境初始化 三、在所有主机上安装相关软件 1、安装docker 2、配置k8s的yum源 3、安装kubelet、kubeadm、kubectl 四、部署Kubernetes Master 五、加入Kubernets Node 六、部署CNI网络插件 七、测试k8s集群 一、环境准备 我的是CentOS7系统&am…

[管理与领导-51]:IT基层管理者 - 8项核心技能 - 6 - 流程

前言&#xff1a; 管理者存在的价值就是制定目标&#xff0c;即目标管理、通过团队&#xff08;他人&#xff09;拿到结果。 要想通过他人拿到结果&#xff1a; &#xff08;1&#xff09;目标&#xff1a;制定符合SMART原则的符合业务需求的目标&#xff0c;团队跳一跳就可以…

微人事 部门管理 模块 (十五)

部门管理的树展示和搜索 数据展示页是个树&#xff0c;我们一次性把数据加载出来也可以通过点一次id加载查询出来出来子部门&#xff0c;我们用一次拿到说有json数据加载出来 数据不多可以用递归&#xff0c;数据很多就用懒加载的方式 由于子部门比较深就不适合&#xff0c;权…

Leetcode每日一题:1448. 统计二叉树中好节点的数目(2023.8.25 C++)

目录 1448. 统计二叉树中好节点的数目 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 原理思路&#xff1a; 1448. 统计二叉树中好节点的数目 题目描述&#xff1a; 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&…

Redis 为什么这么快?

前言 作为一名后端软件工程师&#xff0c;工作中你肯定和 Redis 打过交道。但是Redis 为什么快呢&#xff1f;很多人只能答出Redis 因为它是基于内存实现的&#xff0c;但是对于其它原因都是模棱两可。 那么今天就一起来看看是Redis 为什么快吧&#xff1a; Redis 为什么这么快…

k8s-dashboard使用指导手册

一、访问 dashboard http://172.66.209.101:32001 二、选择 Namespace 如下图&#xff1a; 1 在①搜索框中输入 spms 2 在②选择 spms-cloud 三、查找 pod 1 打开 pod 列表 2 打开过滤窗口 3 搜索 pod 在打开的搜索框中输入 pod的关键字&#xff0c;支持模糊搜索 如搜索…

Git,分布式版本控制工具

1.为常用指令配置别名&#xff08;可选&#xff09; 打开用户目录&#xff0c;创建.bashrc文件 &#xff08;touch ~/.bashrc&#xff09; 2.往其输入内容 #用于输出git提交日志 alias git-loggit log --prettyoneline --all --graph --abbrev-commit #用于输出当前目录所有文…

Git企业开发控制理论和实操-从入门到深入(一)|为什么需要Git|Git的安装

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…

excel 动态表头与合并列

零、希望Springboot-java导出excel文件&#xff0c;包括动态表头与下边合并的列 使用 org.apache.poi 与自己封装工具类实现相关功能。代码如下 一、代码 1、依赖 implementation(group: org.apache.poi,name: poi-ooxml,version: 4.1.0)implementation(group: org.apache.po…

【Cortex-M3权威指南】学习笔记2 - 指令集

目录 指令集汇编语言基础UAL 近距离检视指令数据传输数据处理子程呼叫与无条件跳转指令标志位与条件转移指令隔离指令饱和运算 CM3 中新引入指令MRS\MSRIF-THENCBZ/CBNZSDIV/UDIVREV RBITSXTBTBB,TBH 指令集 汇编语言基础 一条简单的汇编指令格式&#xff08;注释使用一个分号…

4.12 TCP 连接,一端断电和进程崩溃有什么区别?

目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机&#xff0c;又迅速重启 客户端主机宕机&#xff0c;一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…