异常处理语句块
try{
/**
* 异常处理的程序语句块
* 将可能发生异常的语句放在这里
* 执行顺序第一(将异常视作一个因为程序出错而实例化的一个对象)
* 如果发生异常,将所捕获的异常传递给catch语句块
* 并且在异常传递之后,try语句块会跳过这里继续执行以后的语句
/
}
catch(Exception e){
e.printStackTrace();
/
*捕获try语句块传递来的异常,指向e
*在e上对异常进行操作
*最好在catch块中写入处理异常的代码。
/
}
finally{
/
*finally语句是异常处理的最后执行部分
*无论try语句块中的代码如何退出,都会执行finally语句块
*--------------------------------------------------------------------------
*完整的异常处理语句块一定包含finally
*无论程序之前两语句块是否顺利执行完毕,都会执行finally
*不执行finally情况:
*1.在finally语句块中发生了异常
*2.在前面的代码中使用了System.exit()退出程序
*3.程序所在线程死亡
*4.关闭了CPU
}
通常异常处理的常用以下三个函数来获取异常有关信息:
- getMessage() :输出错误性质
- toString() :给出一场函数的类型与性质
- printStackTrace() :之处异常的类型、性质、栈层次以及出现在程序中的位置。
在方法中抛出异常——throws
- 使用throws关键字抛出异常
package com.test;
public class Test{
static void pop() throws NegativeArraySizeException{
//
int arr[] = new int[-3];
}
public static void main(String args[]) {
try {
pop();
} catch (Exception e) {
// TODO: handle exception
System.out.println("pop()方法抛出的异常");
}
}
}
使用throws能将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但是最终要由能够处理该异常的代码。
- 如果是Error、RuntimeException或者他们的子类,可以不使用throws关键字来声明要抛出的异常,编译仍然能够顺利通过,但是在运行时会被系统抛出。
在方法中抛出异常——throw
public class Test
{
public static void main(String[] args)
{
try
{
//调用带throws声明的方法,必须显式捕获该异常
//否则,必须在main方法中再次声明抛出
throwChecked(-3);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
//调用抛出Runtime异常的方法既可以显式捕获该异常,
//也可不理会该异常
throwRuntime(3);
}
public static void throwChecked(int a)throws Exception
{
if (a > 0)
{
//自行抛出Exception异常
//该代码必须处于try块里,或处于带throws声明的方法中
throw new Exception("a的值大于0,不符合要求");
}
}
public static void throwRuntime(int a)
{
if (a > 0)
{
//自行抛出RuntimeException异常,既可以显式捕获该异常
//也可完全不理会该异常,把该异常交给该方法调用者处理
throw new RuntimeException("a的值大于0,不符合要求");
}
}
}
throws和throw区别
throws:
- 用来声明一个方法可能产生的所有异常,将异常向上传,不管谁接受,谁能接受就是谁用。
- 可以跟多个异常类名,用逗号隔开
- 表示抛出异常,由该方法的调用者来处理
- throws表示出现异常的一种可能性,并不一定会发生这些异常
throw: - 则是用来抛出一个具体的异常类型。
- 用在方法体内,跟的是异常对象名
- 只能抛出一个异常对象名
- 表示抛出异常,由方法体内的语句处理
- throw则是抛出了异常,执行throw则一定抛出了某种异常
throw和对这两段区别的总结来源:https://blog.csdn.net/weixin_38011265/article/details/79149313?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159512886019724846453843%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159512886019724846453843&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-79149313.pc_ecpm_v3_pc_rank_v3&utm_term=throws%E4%B8%8Ethrow%E7%9A%84%E5%8C%BA%E5%88%AB.
处理异常代码编写使用原则:
- 在当前方法声明中使用try-catch语句来捕获异常
- 一个方法被覆盖是,覆盖他的方法必须抛出相同的异常或者异常的子类
- 如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出心得异常。