如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常
— throws语句用在方法定义时声明该方法要抛出的异常类型
public void method() throws Exception1,Exception2,...ExceptionN{
//可能产生异常的代码
}
当方法抛出异常列表中的异常时,方法将不对这些类型及其子类类型的异常作处理,而抛向调用该方法的方法,由他去处理
例如;
public static int test() throws ArithmeticException{//这段代码告诉编译器这个方法当中可能会抛出一个算数异常,谁调用谁处理
Scanner input =new Scanner(System.in);
System.out.println("=====运算开始=====");
System.out.print("请输入第一个整数:");
int one=input.nextInt();
System.out.println("请输入第二个整数");
int two=input.nextInt();
System.out.println("=====运算结束=====");
return one/two;
}
这段代码中throws ArithmeticException告诉编译器这段代码可能会抛出算数异常
那么我们需要在调用的位置输入try - catch处理(谁调用谁处理)
public static void main(String[] args) {
try {
int result =test(); //调用test方法
System.out.println("one和two的商是:"+result);
} catch (ArithmeticException e) { //捕获异常
// TODO 自动生成的 catch 块
System.out.println("除数不允许为0");
e.printStackTrace();
}
运行结果
可以看出,利用throws在方法体中抛出可能出现的异常,然后调用时用try—catch就可以捕获出用户可能输入错误的数值。
如果我们预测这段方法体代码可能出现多种不同类型的异常,我们可以通过多异常抛出的方法,通过逗号,间隔多种异常的类型
public static int test() throws ArithmeticException,InputMismatchException{
}
此时调用时也需要将这两个可能出现的异常分别用try --catch捕获
public class TryDemoThree {
public static void main(String[] args) {
try {
int result =test();
System.out.println("one和two的商是:"+result);
} catch (ArithmeticException e) {
System.out.println("除数不允许为0");
e.printStackTrace();
} catch (InputMismatchException e) {
System.out.println("请输入整数");
e.printStackTrace();
}
}
}
此时,我们如果输入不符合要求的数值,编译器便会产生提示
我们在什么情况下,需要使用到这种捕获和处理异常的代码块呢?
在程序编写的过程中,我们编写捕获和处理异常的代码块去规避可能出现的风险,同时也可以利用它去完成一些程序的逻辑和项目当中需要某些特殊需求和特定任务处理
比如,我们假设这样的一个场景,当我们去某些酒店入住,入住要求为 18岁以下或者80岁以上,必须由亲属陪同入住,不能单独入住。这种限制条件就需要我们通过抛出异常和处理异常的方式进行解决
//描述酒店入住规则:未满18或80岁以上需亲友陪同
public static void testAge() {
System.out.println("请输入你的年龄:");//提示用户输入年龄
Scanner input=new Scanner(System.in);//接受用户输入信息
int age=input.nextInt();
if(age<18 || age>80) {
//针对入住条件作出异常处理
throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同");
}else {
System.out.println("欢迎入住本酒店");
}
}
}
在 throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同"); 中提示我们需要添加抛出声明
第1种异常处理方法 添加try—catch,自己抛出的异常自己处理
第2种异常处理方法 用throws把异常抛出去,谁调谁处理
throw抛出异常对象的处理方案
1.通过try......catch包含throw语句----自己抛自己处理
public class TryDemoFour {
public static void main(String[] args) {
testAge(); //调用
}
public static void testAge() {
try {
System.out.println("请输入你的年龄:");//提示用户输入年龄
Scanner input=new Scanner(System.in);//接受用户输入信息
int age=input.nextInt();
if(age<18 || age>80) {
//针对入住条件抛出异常
throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同");
}else {
System.out.println("欢迎入住本酒店");
}
}catch(Exception e) {
e.printStackTrace();
}
}
运行结果 (用户输入的信息不符合要求,提示了异常信息 )
2.通过throws在方法声明出抛出异常类型--谁调用谁处理--调用者可以自己处理,也可以继续上抛
public class TryDemoFour {
public static void main(String[] args) {
try {
testAge(); //调用者使用try--catch处理
}catch(Exception e) {
e.printStackTrace();
}
}
public static void testAge() throws Exception { //声明异常类型
System.out.println("请输入你的年龄:");//提示用户输入年龄
Scanner input=new Scanner(System.in);//接受用户输入信息
int age=input.nextInt();
if(age<18 || age>80) {
//针对入住条件抛出异常
throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同");
}else {
System.out.println("欢迎入住本酒店");
}
}
}
同样,也正常输出了提示信息
在了解了throws声明异常后,我们可以再学习另一种声明异常的方法:
自定义异常类
- 在程序当中,我们可以使用Java内置的异常类可以描述在编程时出现的大部分异常情况
- 也可以通过自定义异常描述特定业务产生的异常类型
- 所谓自定义异常,就是定义一个类,去继承Throwable类或者它的子类
创建自定义的异常类需要继承自Exception类,并提供含有一个无参的构造方法,该信息可以通过异常类的getMessage( )方法获得
自定义异常类代码如下:
public class HotelAgeException extends Exception { //创建一个自定义异常类
public HotelAgeException() {
super("18岁以下,80岁以上的住客必须由亲友陪同");
}
}
在该类中对用户输入的值进行判断,如年龄不符合要求,则调用自定义异常HotelAgeException,处理程序所发生的异常
package com.test;
import java.util.Scanner;
public class TryDemoFour {
public static void main(String[] args) {
try { //对抛出的异常进行处理
testAge();
}catch(HotelAgeException e) {
System.out.println(e.getMessage()); //输出异常信息
}catch(Exception e) {
e.printStackTrace();
}
}
public static void testAge() throws HotelAgeException{
System.out.println("请输入你的年龄:");//提示用户输入年龄
Scanner input=new Scanner(System.in);//接受用户输入信息
int age=input.nextInt();
if(age<18 || age>80) { //判断用户输入的值是否符合要求
//针对入住条件作出抛出异常
throw new HotelAgeException();//抛出异常
}else {
System.out.println("欢迎入住本酒店");
}
}
}
运行结果