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
	@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基础中部

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

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

相关文章

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

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

【Linux】socket 编程基础

文章目录 &#x1f4d5; 网络间的通信&#x1f4d5; socket 是什么1. socket 套接字2. 套接字描述符3. 基本的 socket 接口函数3.1 头文件3.2 socket() 函数3.3 bind() 函数struct sockaddr主机序列与网络序列 3.4 listen() 函数3.5 connect() 函数3.6 accept() 函数IP 地址风格…

C# Winfrom通过COM接口访问和控制Excel应用程序,将Excel数据导入DataGridView

1.首先要创建xlsx文件 2.在Com中添加引用 3. 添加命名空间 using ApExcel Microsoft.Office.Interop.Excel; --这样起个名字方面后面写 4.样例 //点击操作excelDataTable dt new DataTable();string fileName "D:\desktop\tmp\test.xlsx";ApExcel.Application exA…

04.sqlite3学习——DDL(数据定义:创建和删除表)

目录 DDL&#xff08;数据定义&#xff1a;创建和删除表&#xff09; SQLite 创建表 语法 实例 字段修饰符 primary key 定义主键列 AUTOINCREMENT 自动增长 UNIQUE 字段的值唯一 NOT NULL 字段的值不为空 SQLite 修改表 增加字段add 修改表名rename to SQLite 删…

WPF基础入门-Class5-WPF命令

WPF基础入门 Class5-WPF命令 1、xaml编写一个button&#xff0c;Command绑定一个命令 <Grid><ButtonWidth"100"Height"40" Command"{Binding ShowCommand}"></Button> </Grid>2、编写一个model.cs namespace WPF_Le…

多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比

多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比 目录 多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预…

开源的经济影响:商业与社区的平衡

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

使用锐捷RG-EG210G-E路由器实现两个IP地址冲突的局域网互通

需求背景&#xff1a; 之前写过一篇博文使用路由器实现三个不同网段局域网内的计算机相互访问&#xff0c;链接如下 https://blog.csdn.net/agang1986/article/details/131862160 当前的需求又发生了变更&#xff0c;有两个独立的局域网&#xff0c;内部的计算机个数和配置的IP…

Spring boot 集成单元测试

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> 2. 3.编写测试类 package com.enterprise;import com.enterpr…

一文1500字从0到1搭建 Jenkins 自动化测试平台

Jenkins 自动化测试平台的作用 自动化构建平台的执行流程&#xff08;目标&#xff09;是&#xff1a; 我们将代码提交到代码托管工具上&#xff0c;如github、gitlab、gitee等。 1、Jenkins要能够检测到我们的提交。 2、Jenkins检测到提交后&#xff0c;要自动拉取代码&#x…

opencv 案例实战01-停车场车牌识别实战

需求分析&#xff1a; 车牌识别技术主要应用领域有停车场收费管理&#xff0c;交通流量控制指标测量&#xff0c;车辆定位&#xff0c;汽车防盗&#xff0c;高速公路超速自动化监管、闯红灯电子警察、公路收费站等等功能。对于维护交通安全和城市治安&#xff0c;防止交通堵塞…

探讨uniapp的路由与页面生命周期问题

1 首先我们引入页面路由 2 页面生命周期函数 onLoad() {console.log(页面加载)},onShow() {console.log(页面显示)},onReady(){console.log(页面初次显示)},onHide() {console.log(页面隐藏)},onUnload() {console.log(页面卸载)},onBackPress(){console.log(页面返回)}3 页面…

计算机丢失msvcp110.dll是什么意思?有哪些方法可以修复

今天&#xff0c;我将和大家一起探讨一个关于计算机的问题——“计算机丢失msvcp110.dll是什么意思&#xff1f;有哪些方法可以修复&#xff1f;”这个问题在我们的日常生活中非常常见&#xff0c;尤其是在使用Windows系统的过程中&#xff0c;可能会遇到这样的问题。那么&…

Linux系统编程:线程控制

目录 一. 线程的创建 1.1 pthread_create函数 1.2 线程id的本质 二. 多线程中的异常和程序替换 2.1 多线程程序异常 2.2 多线程中的程序替换 三. 线程等待 四. 线程的终止和分离 4.1 线程函数return 4.2 线程取消 pthread_cancel 4.3 线程退出 pthread_exit 4.4 线程…

Kali Linux中的ARP欺骗攻击如何进行

在Kali Linux中进行ARP欺骗攻击是一种常见的网络攻击方法&#xff0c;它允许攻击者篡改局域网中的ARP表&#xff0c;以便将网络流量重定向到攻击者控制的位置。 步骤&#xff1a; 安装必要工具&#xff1a; 首先&#xff0c;确保 已经安装了Kali Linux&#xff0c;并在终端中安…

【Acwing338】计数问题题解

题目描述 举个栗子分类讨论 求a~b中x的个数&#xff0c;可以转换为1~b中x的个数减去1~a-1中x的个数 所以核心是求1~n中x的个数&#xff0c;可以转换为求x在1~n中每一个数的每一位上出现的次数的和 假设要求1~abcdefg&#xff08;这是一个七位数&#xff09;中x1的个数&#…

分布式 - 服务器Nginx:一小时入门系列之TCP反向代理和负载均衡

文章目录 1. HTTP反向代理和TCP反向代理2. http 块和 stream 块3. TCP反向代理配置4. TCP 负载均衡 1. HTTP反向代理和TCP反向代理 Nginx可以作为HTTP反向代理和TCP反向代理。 HTTP反向代理是指Nginx作为Web服务器的代理服务器&#xff0c;接收客户端的HTTP请求&#xff0c;然…

容器镜像生成记

概述 容器docker/k8s发布已有一段时间&#xff0c;不少小伙伴开始上手实践。下面以一个简单的应用为例。来说明如何生成镜像并推送至镜像仓库。 准备工作 镜像仓库注册 以最常见的aliyun镜像仓库为例&#xff1a; 支付宝登录aliyun官网&#xff0c;搜索容器镜像服务&#x…

香港全新的虚拟资产服务商发牌制度

香港证监会2023年2月20日通告&#xff0c;原有虛擬資產交易平台如要符合資格參與當作為獲發牌的安排&#xff0c;必須在2023 年6 月1 日至2024 年2 月29 日期間(即由2023 年6 月1 日37起計九個月內)內&#xff0c;根據《打擊洗錢條例》下的虛擬資產服務提供者制度在網上提交完全…

python爬虫10:selenium库

python爬虫10&#xff1a;selenium库 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产…