当前位置: 首页 > news >正文

检查异常处理方式:1,抛出;2,捕获

异常:Exception

一、什么是异常

我们的程序在运行过程中产生的一些问题,这些问题有的是编码错误,有的是用户不正当操作引起的,有的是外部物理设备引起的。

二、异常的继承结构

Throwable:可抛出的

-->EXception:异常

一般都是程序编写问题或用户不正当操作引起的,

通过程序代码来进行解决

------>编译期异常(检查异常)

程序在编译期间,由编译器检查出来的异常,必须要处理,否则编译不能通过

如:ParseException

------>运行时异常(非检查异常)

所有的运行时异常会继承自RuntimeException;

运行时异常在编译期间检测不到,但是在运行期间有可能会报异常,可以不处理也可以处理

如:ArratyIndexOutOfBoundException

classcastException

NUllPointException

-->Error:错误

一般是由物理设备引起的,无法通过代码来解决,一般我们不要处理

StackoverFlowError:栈溢出错误

OutOfMemoryError:堆内存溢出

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/*
 * 检查异常处理方式:抛出
 */
public class TestException01 {
    /**
     * 调用m1()方法,因为m1()方法也没有处理异常,
     * 所以main()方法看到的就是有异常的m1()方法
     * main()方法继续向上抛出异常,最终抛给了jvm虚拟机
     * jvm打印出异常的堆栈信息
     * 
     * 客人:服务员将炒糊的菜端给了客人,客人看到的菜就是炒糊的菜
     * @param args
     * @throws Exception 
     */
	
	public static void main(String[] args) throws Exception {
		//看到两个异常的m01()方法
		//客人看到的菜是既炒糊了,又没盐的
		
		//看到的就是只有一个父异常的m1()方法
		//客人也只知道才没炒好,不指定具体哪里没炒好
		//m01();
		m02();
	}
	/**
	 * 调用m0方法,因为m0中抛出异常,所以调用就是有异常的m0()方法
	 * 
	 * m1()可以选择继续向上抛出,谁来调用m1()这个方法就抛给谁
	 * 服务员:去取厨师炒的菜,看到就是炒糊的菜
	 * @throws Exception 
	 */
	public static void m1() throws Exception {
		//看到两个异常的m01()方法
		//服务员看到的菜是既炒糊了,又没盐的
		//m01();
		
		//服务员只知道菜没炒好,但不知道具体哪没炒好
		/*
		 * m1()只会看到父异常的Exception,不知道哪个没炒好
		 */
		m02();
	}
	
	/*
	 * 让用户控制台输入一个指定格式字符串
	 * 然后将这个字符串解析为日期对象
	 * 
	 * 异常:菜炒糊了
	 * 		:没放盐
	 * 		:油多了
	 * 抛出:不处理,向上抛出不管,
	 * 				谁来调用这个方法,谁处理
	 * @throws:ParseException
	 * @throws:FileNotFoundException
	 */
	
	
	public static void m01() throws ParseException, FileNotFoundException {
		System.out.println("请输入日期(yyyy-MM-dd)");
		
		String dateStr=new Scanner(System.in).nextLine();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		Date date =sdf.parse(dateStr);
		System.out.println("date="+date);
		
		//尝试去连接一个磁盘文件
		FileInputStream in=new FileInputStream ("D:/a.text");
	}

	/*
	 * 让用户控制台输入一个指定格式字符串
	 * 然后将这个字符串解析为日期对象
	 * 
	 * 异常:菜炒糊了
	 * 		:没放盐
	 * 		:油多了
	 * 
	 *总问题:没炒好
	 * 抛出:不处理,向上抛出不管,
	 * 				谁来调用这个方法,谁处理
	 * 				抛出的是一个父类型的异常
	 * @throws:ParseException
	 * @throws:FileNotFoundException
	 */
	
	
	public static void m02() throws Exception {
		System.out.println("请输入日期(yyyy-MM-dd)");
		
		String dateStr=new Scanner(System.in).nextLine();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		Date date =sdf.parse(dateStr);
		System.out.println("date="+date);
		
		//尝试去连接一个磁盘文件
		FileInputStream in=new FileInputStream ("D:/a.text");
	}
}

2、捕获

如果异常需要自己处理,也可以在方法内部通过try~catch 来对异常进行捕获并处理,那么方法调用者就不需要再去

处理异常了

语法:

try{

//有检查异常的代码块

}catch(XXException e){

//捕获异常并处理

}catch(XXException e){

//捕获异常并处理

}。。。

finally{

//最终执行代码块。可以没有

}

注意:

1》try中代码块出现了异常,那么跟在这一行的后面的try中代码都不执行

2》finally为最终执行代码块,是必须要执行的,即使try或者catch中有return,也会先去执行finally中代码,再回去执行return

3》如果有多个检查异常,catch可以有多个这些异常之间如果有父子关系,那么子类型必须写在父类型的上面,否则捕获不到或者通过一个catch类型捕获这多个异常的父类型异常

4》如果有必须要执行的代码块,可以单独使用try和finally

5》运行时异常通常不需要处理,

如果要处理,也可以按照检查异常一样去处理

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/**
 * 异常处理方式:捕获
 *
 */
public class TestException02 {
	public static void main(String[] args) {
		//客人看到的就是没有问题的菜
			m03();
	}
	
	/*
	 * 因为厨师自己处理了炒糊的菜
	 * 服务员考到的就是没有问题的菜
	 * 
	 * 
	 * 
	 * 因为m0()方法自己捕获了异常
	 * 所以m1()在调用m0()时不需要在处理异常了
	 */
	public static void m1() {
		m03();
	}

/**
* 让用户控制台输入一个指定格式字符串
* 然后将这个字符串解析为日期对象
* 
* 异常:菜炒糊了
* 		:没放盐
* 		:油多了
* 捕获:厨师自己处理炒糊的菜(摘出来,重新炒)
* @throws:ParseException
* @throws:FileNotFoundException
*/


public static void m0() {
	System.out.println("请输入日期(yyyy-MM-dd)");

	String dateStr = new Scanner(System.in).nextLine();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	Date date;
	try {
		// 尝试去运行这块代码
		date = sdf.parse(dateStr);
		//try中代码出现异常,那么跟在后面的代码都不执行
		System.out.println("date=" + date);
		return;
	} catch (ParseException e) {
		// 只有Try中代码出现了异常
		// 才会catch中的代码
		System.out.println("==处理炒糊的菜==");
		//参数e代表捕获到的异常
		System.out.println("e:"+e);
		//获取异常信息
		String  message =e.getMessage();
		System.out.println("message:"+message);
		
		//与jvm一样,打印输出异常的堆栈信息
		//e.printStackTrace();
		return;
	}finally {
		//最终执行代码块,无论try中代码有无异常
		//或try和catch中有无return,都会来执行的代码
		System.err.println("====最终执行代码块====");
	}
}
	/**
	 * 让用户控制台输入一个指定格式字符串
	 * 然后将这个字符串解析为日期对象
	 * 
	 * 异常:菜炒糊了
	 * 		:没放盐
	 * 		:油多了
	 * 捕获:厨师自己处理炒糊的菜(摘出来,重新炒)
	 * @throws:ParseException
	 * @throws:FileNotFoundException
	 */
	
	
	public static void m01() {
		System.out.println("请输入日期(yyyy-MM-dd)");
		
		String dateStr = new Scanner(System.in).nextLine();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date;
		try {
			// 尝试去运行这块代码
			date = sdf.parse(dateStr);
			//从磁盘上读取数据,可能会发生读取异常
			FileInputStream in=new FileInputStream ("D:/a.text");
			in.read();
			//try中代码出现异常,那么跟在后面的代码都不执行
			System.out.println("date=" + date);
			
			return;
		} catch (ParseException e) {
			// 只有Try中代码出现了异常
			// 才会catch中的代码
			System.out.println("==日期解析异常==");
			//参数e代表捕获到的异常
			System.out.println("e:"+e);
			//获取异常信息
			String  message =e.getMessage();
			System.out.println("message:"+message);
			
			//与jvm一样,打印输出异常的堆栈信息
			//e.printStackTrace();
			return;
		} catch (FileNotFoundException e) {
			//只有try中代码发生了文件未找到异常才能进入到这里执行
			//因为FileNotFoundException是IOException的子类型
			//要放在父类型的上面
			System.out.println("==文件未找到异常==");
		} catch (IOException e) {
			System.out.println("===文件读取异常====");
						e.printStackTrace();
		}finally {
//			e.printStackTrace();
			//最终执行代码块,无论try中代码有无异常
			//或try和catch中有无return,都会来执行的代码
			System.err.println("====最终执行代码块====");
		}
	}
		
			
		/**
		 * 让用户控制台输入一个指定格式字符串
		 * 然后将这个字符串解析为日期对象
		 * 
		 * 异常:菜炒糊了
		 * 		:没放盐
		 * 		:油多了
		 * 捕获:厨师自己处理炒糊的菜(摘出来,重新炒)
		 * @throws:ParseException
		 * @throws:FileNotFoundException
		 */
		
		
		public static void m02() {
			System.out.println("请输入日期(yyyy-MM-dd)");
			
			String dateStr = new Scanner(System.in).nextLine();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Date date;
			try {
				// 尝试去运行这块代码
				date = sdf.parse(dateStr);
				//从磁盘上读取数据,可能会发生读取异常
				FileInputStream in=new FileInputStream ("D:/a.text");
				in.read();
				//try中代码出现异常,那么跟在后面的代码都不执行
				System.out.println("date=" + date);
				
				return;
			} catch (Exception e) {				
				System.out.println("==发生了异常,菜没炒好==");
				if(e instanceof ParseException) {
					System.out.println("日期");
				}else if(e instanceof FileNotFoundException) {
					System.out.println("文件没找到");
				}else if(e instanceof IOException) {
					System.out.println("读取异常");
				}else {
					System.out.println("其他异常");
				}
				return;
			} finally {
//			e.printStackTrace();
				//最终执行代码块,无论try中代码有无异常
				//或try和catch中有无return,都会来执行的代码
				System.err.println("====最终执行代码块====");
			}
			
			
		
 }
		
		/**
		 * 运行时候异常:通常不需要处理
		 * 如果想处理,也可以按照检查异常去处理
		 * 
		 * 如果有必要执行的代码
		 * try和finally可以单独使用
		 */
		public static void m03() {
			String arr[]= {"aa","bb","cc"};
//			try {
//				System.out.println(arr[5]);
//		}catch(ArrayIndexOutOfBoundsException e) {
//			System.out.println("数组下标越界异常");
//		}
			
			try {
				System.out.println(arr[1]);
			}finally {
				System.out.println("123456789");
			}
		}
}



 

相关文章:

  • 数组清空(bzero与memset)
  • LocalDateTime获取时间类(当前时间)
  • java计算机毕业设计校园二手交易网站源码+系统+数据库+lw文档+mybatis+运行部署
  • 第1章Linux基础篇-Linux入门
  • java计算机毕业设计校园共享单车管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 网课答案API 题库搜题查题系统
  • 手写Promise
  • Automatic differentiation package - torch.autograd
  • 第8章Linux实操篇-实用指令
  • net基于asp.net的社区团购网站-计算机毕业设计
  • 山石网科等级保护培训笔记
  • JavaScript获取文件的file对象数据(不通过input)
  • 数据结构与算法 -- 动态规划常见问题
  • 3.ICMP
  • 尚好房 09_权限管理
  • CSS 三角实现
  • Git初体验
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 阿里云Kubernetes容器服务上体验Knative
  • 安卓应用性能调试和优化经验分享
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 问题之ssh中Host key verification failed的解决
  • 智能合约Solidity教程-事件和日志(一)
  • 主流的CSS水平和垂直居中技术大全
  • 从如何停掉 Promise 链说起
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • # 飞书APP集成平台-数字化落地
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • ###C语言程序设计-----C语言学习(6)#
  • #{}和${}的区别是什么 -- java面试
  • #stm32整理(一)flash读写
  • #Ubuntu(修改root信息)
  • #微信小程序:微信小程序常见的配置传值
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (第一天)包装对象、作用域、创建对象
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (学习日记)2024.01.09
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .Net8 Blazor 尝鲜
  • .Net中间语言BeforeFieldInit
  • .net专家(张羿专栏)
  • .php文件都打不开,打不开php文件怎么办
  • @Bean有哪些属性
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @Query中countQuery的介绍
  • @RequestBody与@ResponseBody的使用
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [Angularjs]ng-select和ng-options