Java10(异常处理)

news2024/10/5 14:36:14

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
	@Test
	public void test(){
		try{                                   
		int[] i = new int[10];
		System.out.println(i[10]);
		}catch(ArrayIndexOutOfBoundsException e){
			System.out.println("数组下标越界");
		}
	}
	//2.算术异常:ArithmeticException
	@Test
	public void test1(){
		int i = 10;
		try{
		System.out.println(i/0);
		}catch(ArithmeticException e){
			System.out.println("\u7B97\u672F\u5F02\u5E38啦!");
		}
	}
	//3.类型转换异常:ClassCastException
	@Test
	public void test2(){
		try{
		Object obj = new Date();
		String str = (String)obj;
		}catch(ClassCastException e){
			System.out.println(e.getMessage());

		}
	}
	//4.空指针异常:NullPointerException
	@Test
	public void test3(){
		try{
		Person p = null;
		System.out.println(p.toString());
		}catch(NullPointerException e){
			System.out.println(e.fillInStackTrace());
		}
	}
	//编译时异常
	@Test
	public 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.coloradmin.cn/o/932903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法通过村第三关-数组黄金笔记|数组难解

文章目录 前言数组中出现超过一半的数字数组中只出现一次的数字颜色的分类问题(荷兰国旗问题)基于冒泡排序的双指针&#xff08;快慢指针&#xff09;基于快排的双指针&#xff08;对撞指针&#xff09; 总结 前言 提示&#xff1a;苦不来自外在环境中的人、事、物&#xff0c;…

最新人工智能源码搭建部署教程/ChatGPT程序源码/AI系统/H5端+微信公众号版本源码

一、AI系统 如何搭建部署人工智能源码、AI创作系统、ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01; SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、…

Vue3.0极速入门- 目录和文件说明

目录结构 以下文件均为npm create helloworld自动生成的文件目录结构 目录截图 目录说明 目录/文件说明node_modulesnpm 加载的项目依赖模块src这里是我们要开发的目录&#xff0c;基本上要做的事情都在这个目录里assets放置一些图片&#xff0c;如logo等。componentsvue组件…

加快edge网页的下载速度

1、 edge://flags/#enable-parallel-downloading、 2、 点击enabled

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

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

谈谈子网划分的定义、作用、划分方式以及案例

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、子网划分的定义 二、子网掩码的作用 1、…

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

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

【mysql是怎样运行的】-EXPLAIN详解

文章目录 1.基本语法2. EXPLAIN各列作用1. table2. id3. select_type4. partitions5. type 1.基本语法 EXPLAIN SELECT select_options #或者 DESCRIBE SELECT select_optionsEXPLAIN 语句输出的各个列的作用如下&#xff1a; 列名描述id在一个大的查询语句中每个SELECT关键…

Unity——后期处理举例

Post Processing&#xff08;后期处理&#xff09;并不属于特效&#xff0c;但现代的特效表现离不开后期处理的支持。本文以眩光&#xff08;Bloom&#xff09;为例&#xff0c;展示一种明亮的激光的制作方法 1、安装后期处理扩展包 较新的Unity版本已经内置了新版的后期处理扩…

2022年03月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;拦截导弹 某国为了防御敌国的导弹袭击&#xff0c; 发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a; 虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c; 雷达捕捉到敌国的…

Linux内核学习(十)—— 块 I/O 层(基于Linux 2.6内核)

目录 一、剖析一个块设备 二、缓冲区和缓冲区头 三、bio 结构体 四、请求队列 五、I/O 调度程序 系统中能够随机&#xff08;不需要按顺序&#xff09;访问固定大小数据片&#xff08;chunks&#xff09;的硬件设备称作块设备&#xff0c;这些固定大小的数据片就称作块。最…

项目进度管理(4-1)关键链法

1 关键链法产生的背景 关键链法&#xff08;Critical Chain Method&#xff0c;CCM&#xff09;起源于20世纪80年代&#xff0c;是由Eliyahu M. Goldratt在他的著作《关键链》&#xff08;"Critical Chain"&#xff09;中首次提出和阐述的。Eliyahu M. Goldratt是以…

Java 时间String转Date类型

Testpublic void testTime() throws ParseException {SimpleDateFormat format new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//法一&#xff1a;String time111 "2023-08-14 18:13:10";Date date format.parse(time111);System.out.println("法一…

4.18 TCP 和 UDP 可以使用同一个端口吗?

目录 TCP 和 UDP 可以同时绑定相同的端口吗&#xff1f; 多个 TCP 服务进程可以绑定同一个端口吗&#xff1f; 重启 TCP 服务进程时&#xff0c;为什么会有“Address in use”的报错信息&#xff1f; 重启 TCP 服务进程时&#xff0c;如何避免“Address in use”的报错信息…

Java之API详解之System类的详解

2 System类 2.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于System类的定义如下&#xff1a; System类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且System类被final修饰了&#xff0c;因此该类是不能被继承的。…

【C++】C++ 引用详解 ⑤ ( 函数 “ 引用类型返回值 “ 当左值被赋值 )

文章目录 一、函数返回值不能是 " 局部变量 " 的引用或指针1、函数返回值常用用法2、分析函数 " 普通返回值 " 做左值的情况3、分析函数 " 引用返回值 " 做左值的情况 函数返回值 能作为 左值 , 是很重要的概念 , 这是实现 " 链式编程 &quo…

我的128天创作纪念日-东离与糖宝

文章目录 机缘收获日常成就憧憬 不知不觉我也迎来了自己的128天创作纪念日&#xff0c;一起来看看我有什么想对大家说的吧 机缘 我的写博客之旅始于参加了代码随想录算法训练营。在训练营期间&#xff0c;代码随想录作者卡尔建议我们坚持每天写博客记录刷题学习的进度和心得体…

Jira vs Trello:项目管理的深层巅峰对决

引言 项目管理在现代企业运作中起着至关重要的作用。从跨国公司的巨大项目&#xff0c;到创业公司的快速反应&#xff0c;再到个人的日常任务管理&#xff0c;一个好的项目管理工具可以有效地跟踪进度&#xff0c;优化资源分配&#xff0c;确保项目在预定时间内完成。今天&…

银河麒麟服务器、centos7服务器mysql离线安装:通过获取临时密码进行登录修改新密码

离线安装脚本 cd /home/zenglg/mysql5.7# 判断mysql是否安装# 下面这种方法必须是rpm安装的判断才有效&#xff0c;不通用# IS_INSTALLED$(rpm -qa |grep mysql)# if [ $? -eq 0 ]# 下面的判断方法是查询版本号&#xff0c;比较通用SQL_VERSIONmysql -V | grep -i -o -P 5.7.4…

Kotlin协程flow发送时间间隔debounce

Kotlin协程flow发送时间间隔debounce debounce的作用是让连续发射的数据之间间隔起来。典型的应用场景是搜索引擎里面的关键词输入&#xff0c;当用户输入字符时候&#xff0c;有时候&#xff0c;并不希望用户每输入任何一个单字就触发一次后台真正的查询&#xff0c;而是希望…