【java学习—十】抛出异常(3)

文章目录

  • [1. 声明抛出异常](#1. 声明抛出异常)
  • [2. 重写方法声明抛出异常的原则](#2. 重写方法声明抛出异常的原则)
  • [3. 人工抛出异常](#3. 人工抛出异常)
  • [4. 创建用户自定义异常类](#4. 创建用户自定义异常类)

1. 声明抛出异常

声明抛出异常 是 Java 中处理异常的第二种方式

• 如果一个方法 ( 中的语句执行时 ) 可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

• 在方法声明中用 throws 子句可以声明抛出异常的列表, throws 后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

声明抛出异常举例:

java 复制代码
public void readFile(String file) throws FileNotFoundException {
	......
	// 读文件的操作可能产生 FileNotFoundException 类型的异常
	FileInputStream fis = new FileInputStream(file);
	........
}

举例说明:

java 复制代码
package day10;

public class Test1 {
	public static void main(String[] args) {
		B b = new B();
		try {//throws在代码这抛出异常,在调用方去捕获处理
		 b.test();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

class B{
	int i;
	public void test() throws Exception{//可以使用throws在这抛出异常,在调用方去捕获处理
		B b = null;
		System.out.println(b.i);
	}
}

运行结果:

(2)

java 复制代码
package day10;

public class Test1 {
	public static void main(String[] args) throws Exception{//可以在main方法继续抛出异常
		//main方法抛出异常直接抛到虚拟机上去了,就在程序中不能处理
		B b = new B();
//		try {
//		 b.test();
//		}catch(Exception e){
//			e.printStackTrace();
//		}
		b.test();
	}
}

class B{
	int i;
	public void test() throws Exception{
		B b = null;
		System.out.println(b.i);
	}
}

运行结果:

2. 重写方法声明抛出异常的原则

重写方法不能抛出比被重写方法范围更大的异常类型。

子类重写父类的方法时,子类不能抛出比父类方法更大范围的异常。

举例:

java 复制代码
package day10;

public class Test1 {
	public static void main(String[] args) throws Exception{

		B b = new B();
//		try {
//		 b.test();
//		}catch(Exception e){
//			e.printStackTrace();
//		}
		b.test();
	}
}

class B{
	int i;
	public void test() throws NullPointerException{
		B b = null;
		System.out.println(b.i);
	}
}

//子类C重写父类B的test()方法
class C extends B{
	@Override
	//public void test() throws Exception {//错误,因为Exception的范围比NullPointerException大
	public void test() throws NullPointerException {//正确,都为ullPointerException,可以
		// TODO Auto-generated method stub
		super.test();
	}
}

3. 人工抛出异常

Java 异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要人工创建并抛出

• 首先要生成异常类对象,然后通过 throw 语句实现抛出操作 ( 提交给 Java 运行环境 ) 。

java 复制代码
	IOException e =new IOException();
	throw e;

• 可以抛出的异常必须是 Throwable 或其子类的实例。下面的语句在编译

时将会产生语法错误:

java 复制代码
	throw new String("want to throw");

举例:

java 复制代码
package day10;

public class Test1 {
	public static void main(String[] args){

		B b = new B();
		try {
			b.test1(-100);
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

class B{
	int i;
	public void test() throws NullPointerException{
		B b = null;
		System.out.println(b.i);
	}
	int age;
	
	public void test1(int age) throws Exception{
		if(age >= 0 && age<= 150) {
			this.age = age;
			System.out.println("年龄是:" + this.age);
		}else {
			throw new Exception("年龄不在0 ~ 150之间");
		}
	}
}


class C extends B{
	@Override
	public void test() throws NullPointerException {
		// TODO Auto-generated method stub
		super.test();
	}
}

运行结果:

4. 创建用户自定义异常类

用户自定义异常类 MyException ,用于描述数据取值范围错误信息。用户自己的异常类必须继承现有的异常类。

java 复制代码
package day10;

public class Test1 {
	public static void main(String[] args){
		B b = new B();
		try {
//			b.test1(-100);
			b.test2(-100);//MyException
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

class B {
	int i;
	public void test() throws NullPointerException{
		B b = null;
		System.out.println(b.i);
	}
	int age;
	
	public void test1(int age) throws Exception{
		if(age >= 0 && age<= 150) {
			this.age = age;
			System.out.println("年龄是:" + this.age);
		}else {
			throw new Exception("年龄不在0 ~ 150之间");
		}
	}
	
	public void test2(int age) throws MyException{
		if(age >= 0 && age<= 150) {
			this.age = age;
			System.out.println("年龄是:" + this.age);
		}else {
			throw new MyException("年龄不在0 ~ 150之间");
		}
	}
}

//创建用户自定义异常类
class MyException extends Exception {
	
	public MyException(String message) {
		super(message);
	}
}

运行结果:

注:java提供的异常类一般是够用的,只有特殊的情况可能需要自己编写异常类,这种情况很少见。

相关推荐
程序喵大人1 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng1 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena157795857922 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
wdfk_prog2 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕3 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫3 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通4 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
GeekArch4 小时前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
AC赳赳老秦4 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
AI多Agent协作实战派5 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug