文章目录
- [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提供的异常类一般是够用的,只有特殊的情况可能需要自己编写异常类,这种情况很少见。