I学霸官方免费教程三十八 :Java基础教程之异常

异常

程序中不正常的情况分为两大类:错误(Error)和异常(Exception)

错误(Error):程序本身无法对这种不正常的情况进行处理,将会导致程序崩溃;
例如:内存耗尽错误,JVM崩溃错误等
异常(Exception):程序可以特殊的代码,对不正常的情况进行捕获和处理,程序可以继续运行;
例如:除零异常,空指针异常,数组下标越界异常

捕获异常

语法格式1:
	try{ 
		//可能出现异常的代码  
	}catch(异常类 变量名){
		//出现异常后的处理代码
		//printStackTrace();方法会输出栈内存中的异常信息
		变量名. printStackTrace();
	}

语法格式2:
	try{
		//可能出现异常的代码
	}finally{
		//finally块:一般释放资源的语句,比如关闭流,关闭数据库的连接
	}
finally:不管try中的代码是否出现异常,都会执行finally块中的代码

语法格式3:
	try{
    
	}catch(异常类 变量名){

	}finally{
  		//即使try块或catch块中出现return语句,finally块中依然会执行
 		//如果在try块或catch块中出现System.exit(int);语句,finally块将无法执行
	}

多重catch块:多重catch块中的异常类,一定是从小到大排列,兄弟异常类不分顺序
	try{
	    
	}catch(子异常类 变量名){

	}catch(子异常类 变量名){

	}catch(父异常类 变量名){

	}...[finally{}]

	try、catch和finally都不能单独存在,但是try和catch 、 try和finally 可以在一起使用,catch和finally不能单独在一起使用

声明异常

语法格式:[访问修饰符] 返回值类型 方法名() throws 异常类{}

抛出异常

语法格式:throw 异常对象;

实例:
package exception;

/**
 * 演示异常的声明和抛出
 * 
 * @author 学霸联盟 - 赵灿
 */
public class ExceptionDemo {
	//声明方法m1,并声明该方法会出现一个RuntimeException类型的异常
	public void m1() throws RuntimeException {
		/*
		 * 抛出一个RuntimeException类型的异常,没有使用try-catch捕获
		 * 使用声明异常的方式,将此处抛出的异常交给调用者m2处理
		 * 声明异常的类型,必须是抛出异常类型或其父类型
		 */
		throw new RuntimeException();
	}

	//声明方法m2,并声明该方法会出现一个Exception类型的异常
	public void m2() throws Exception {
		try {
			// 调用声明了RuntimeException异常的方法m1
			// 并使用try-catch处理m1中抛出的异常
			m1();
			/*
因为catch块是按照异常类型匹配捕获的,而方法m1声明的是RuntimeException;所以catch的小括号中只能声明RuntimeException或RuntimeException父类型的变量不能声明RuntimeException的子类变量,因为这样不能保证异常被捕获
			 */
		} catch (Exception ex) {
			// 此处抛出了一个Exception类型的异常
			// 没有使用try-catch进行捕获处理,所以该方法也必须声明异常
			throw new Exception();
		} finally {
			/*
			 * 不管try和catch块中的代码是否抛出异常,finally块中的代码都会执行
			 * 即使try或catch块中执行了return语句,finally块中的代码也会执行
			 * 除非try或catch块中执行了System.exit(int);
			 * 或出现错误导致JVM崩溃,finally将不再执行
			 */
		}

	}

	// 方法m3
	public void m3() {
		try {
			/*
			 * 调用声明了Exception异常的方法m2,而m3没有声明异常,
			 * 所以必须使用try-catch块处理方法m2产生的异常
			 */
			m2();
		} catch (Exception ex) {
			/*
			 * 抛出Exception类型的异常,而且没有使用try-catch进行捕获,也没有声明异常;
			 * 但是在finally块中使用的return语句,所以代码可以正常编译和执行
			 */
			throw new Exception();
		} finally {
			/*
			 * finally块中使用了return语句;
			 * 会将catch块中抛出的Exception类型的异常覆盖;
			 * 所以该方法可以既不声明异常,也不使用try-catch处理catch块中抛出的异常;
			 * 一般不建议这样使用
			 */
			return;
		}
	}

	public static void main(String[] args) {
		ExceptionDemo t = new ExceptionDemo();
		t.m1();
	}
}

自定义异常

继承Exception或Exception的子类

实例:
/**
* 演示自定义异常类
* @author 学霸联盟 - 赵灿
*/
public class MyExceptionDemo extends Exception{
	public static void main(String[] args) {
		try {
			throw new MyException();
		} catch (MyException e) {
			//调用printStackTrace方法
			e.printStackTrace();
		}
	}
}

/**
* 创建自定义异常类MyException,继承Exception类或Exception的子类
* @author 学霸联盟 - 赵灿
*/
class MyException extends Exception{
	/**
	 * 重写父类中的printStackTrace
	 */
	@Override
	public void printStackTrace() {
		System.out.println("恭喜你,中了我的自定义异常!");
	}
}
时间: 2024-11-16 13:42:48

I学霸官方免费教程三十八 :Java基础教程之异常的相关文章

I学霸官方免费教程三十:Java基础教程之泛型

泛型 先给大家举个例子:如现在有一家工厂,可以生产手机,也可以生产电脑.以后还可能生产其他产品.如果给某个工厂加上了泛型,就规定了这个工厂只能生产手机或电脑,不能再生产其他产品了. 实例: package generic; /**  * 产品枚举Product  * @author 学霸联盟 - 赵灿  */ public enum Product { 手机,电脑 } package generic; /**  * 手机类Phone  * @author 学霸联盟 - 赵灿  */ public

I学霸官方免费教程四十 :Java基础教程之线程同步

线程的同步 指当多个线程使用同一对象中被同步的资源时,要根据"先来后到"的顺序使用.举个例子:现在只有一台电脑,现在有两个人A和B想玩游戏,一个人C想写代码,一个人D想听音乐.此时A.B.C三个人要抢这台电脑,谁先抢到谁用,用完了后面两个人在接着抢,谁抢到谁用.而D则不用,在另外三个人中任意一个人正在使用的时候,都可以播放音乐给他听:由此可以看出玩游戏和写代码的功能(方法)是要有"先来后到"的顺序的,而听音乐这个功能不需要.所以玩游戏和写代码的方法就是需要被同步的,

I学霸官方免费教程三十:Java集合框架之List集合

集合框架 在数组的使用过程中可以看到,想要向数组中插入元素和删除元素非常麻烦,而且数组的长度是无法改变的.java为我们提供了批量存储数据更加方便的容器,就是集合. 集合和数组的作用一样,都是为了使用一个变量来存储一批数据的:但集合使用起来更加方便,而且集合的长度是可以变化的. List接口 List集合可以存储有序的,可重复的数据: 常用的子类是ArrayList和LinkedList两个类 ArrayList类 这是一个底层由数组实现的集合类,是对数组进行了封装. 实例: package c

I学霸官方免费教程四十一 :Java基础教程之线程死锁

线程死锁 是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁线程. 例如:某一商店有两个人PS和PB在做交易,PS手里拿着货物对PB说,你先给我钱我在给你货,而PB拿着钱对PS说你先给我货我在给你钱.两个人就此僵持下去,永远也无法做成交易,这就构成了死锁. 实例: package thread.deadlock; /** * 创建DeadlockDe

Java从零开始学三十八(JAVA IO- 重定向IO)

一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重定向方法 方法 说明 static void setErr(PrintStream errr) 重定向标准错误输出流 static void setIn(InputStream in ) 重定向标准输入流 static void setOut(PrintStream out) 重定向歀输出流 三.例

I学霸官方免费教程三十二:Java集合框架之Set集合

Set接口 Set集合是无序的.元素不可重复的结合常用集合类有HashSet和TreeSet HashSet类常用的两种List集合各有各的优点,那么有没有同时具备这两种List集合的优点的集合呢?答案是肯定的,就是Set集合. 实例: package collection.set.hashSet; import java.util.HashSet; import java.util.Iterator; /**  * 演示HashSet  * @author 学霸联盟 - 赵灿  */ publ

I学霸官方免费教程三十一:Java集合框架之List集合

集合框架 在数组的使用过程中可以看到,想要向数组中插入元素和删除元素非常麻烦,而且数组的长度是无法改变的.java为我们提供了批量存储数据更加方便的容器,就是集合.集合和数组的作用一样,都是为了使用一个变量来存储一批数据的:但集合使用起来更加方便,而且集合的长度是可以变化的. List接口 List集合可以存储有序的,可重复的数据:常用的子类是ArrayList和LinkedList两个类 ArrayList类 这是一个底层由数组实现的集合类,是对数组进行了封装. 实例: package col

NeHe OpenGL教程 第三十八课:资源文件

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十八课:资源文件 从资源文件中载入图像: 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用. 欢迎来到NeHe教程第38课.离上节课的写作已经有些时日了,加上写了一整天的code,也许笔头已经

I学霸官方免费教程一:Java软件开发预备知识

一.     计算机系统简介 1.硬件系统:看得见,摸得着 主机:主机箱.主板.内存.硬盘.CPU(中央处理器).声卡.显卡.网卡 外设:显示器.音响 输入设备:键盘.鼠标.扫描仪 输出设备:显示器.投影仪.音响 2.软件系统 系统软件:windows.Linux.IOS.Unix.Android: 编译软件:编程语言,编译器,解释器 应用软件:除了以上的全是应用软件,比如聊天软件,网站,游戏软件等等 二.     软件简介 软件:按照特定顺序组织的计算机数据和指令的集合:其中指令是指挥计算机如