8.5在方法中抛出异常

若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。

8.5.1使用throws关键字抛出异常

throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔。

【例1】指明异常起源于何处

在项目中创建Shoot类,在该类中创建方法pop(),在该方法中抛出NegativeArraySizeException异常,在主方法中调用该方法,并实现异常处理。实例代码如下:

public class Shoot { //创建类

static void pop() throws NegativeArraySizeException{

//定义方法并抛出NegativeArraySizeException异常

int\[\] arr = new int-3; //创建数组

}

public static void main(String\[\] args){ //主方法

try{ //try语句处理异常信息

pop(); //调用pop()方法

}catch (NegativeArraySizeException e){

System.out.println("pop()方法抛出的异常"); //输出异常信息

}

}

}
运行结果如下:

<terminated>Shoot Jlava ApplicationC:\Program Files\Java\jdk\bin\javaw.exe pop()方法抛出的异常

使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。

说明:

如果是Error类、RuntimeException类或它们的子类,可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

8.5.2使用throw关键字抛出异常

throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句块。

throw通常用来抛出用户自定义异常。下面通过实例介绍throw的用法。

【例1】创建自定义异常

在项目中创建自定义异常类(MyException类),继承Exception类。实例代码如下:

public class MyException extends Exception { //创建自定义异常类

String message; //定义String类型变量

public MyException(String ErrorMessagr){ //父类方法

message = ErrorMessagr;

}

public String getMessage(){ //覆盖getMessage()方法

return message;

}

}

【例2】使用throw关键字捕捉自定义异常

使用throw关键字捕捉异常。在项目中创建Captor类,该类中的quotient()方法传递两个int型参数,如果其中的一个参数为负数,则会抛出MyException异常,最后在main()方法中捕捉异常。实例代码如下:

public class Captor{ //创建类

static int quotient(int x,int y) throws MyException{ //定义方法抛出异常

if (y<0){ //判断参数是否小于0

throw new MyException("除数不能是负数"); //异常信息

}

return x/y; //返回值

}

public static void main(String args\[\]){ //主方法

try{ //try语句块包含可能发生异常的语句

int result = quotient(3,-1); //调用方法quotient()

}catch (MyException e){ //处理自定义异常

System.out.println(e.getMessage()); //输出异常信息

}catch (ArithmeticException e){ //处理ArithmeticException异常

System.out.println("除数不能为0"); //输出提示信息

}catch (Exception e){ //处理其他异常

System.out.println("程序发生了其他的异常"); //输出提示信息

}

}

}

上面的实例使用了多个catch语句来捕捉异常。如果调用quotient(3,-1)方法,将发生MyException异常,程序跳转到catch(MyException e)语句块中执行;如果调用quotient(5,0)方法,会发生Arithmeti-cException异常,程序跳转到catch(ArithmeticException e)语句块中执行;如还有其他异常发生,将使用catch (Exception e)捕捉异常。由于Exception是所有异常类的父类,如果将catch(Exception e)语句块放在其他两个语句块的前面,后面的语句块将永远得不到执行,也就没有什么意义了,所以catch语句的顺序不可调换。

相关推荐
sjsjs119 小时前
力扣3558. 给边赋权值的方案数 I
算法·leetcode·职场和发展
布朗克1689 小时前
34 JVM深入理解
java·jvm
hujinyuan201609 小时前
2025年12月中国电子学会青少年机器人技术等级考试试卷(四级) 真题+答案
算法·机器人
啦啦啦啦啦zzzz9 小时前
算法总结(双指针)
c++·算法·双指针
Flittly9 小时前
【AgentScope Java新手村系列】(4)结构化输出
java·spring boot·spring·ai
wzg19690226wzg9 小时前
rust 学习 泛型
开发语言·学习·rust
techdashen9 小时前
Rust 基础设施团队 2025 Q4 回顾与 2026 Q1 计划
开发语言·后端·rust
红宝村村长9 小时前
torch.autograd.Function.apply()
开发语言·python
AI科技星9 小时前
《数术工坊:非欧射影录》类型:硬核光影·几何本源
c语言·开发语言·网络·量子计算·agi
国科安芯9 小时前
商业航天通信载荷数字处理单元供电架构研究——基于ASP7A84AS的高精度低压差线性稳压器技术分析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试