try-catch-finally throw- throws
- try 块负责监控可能出现异常的代码
- catch 块负责捕获可能出现的异常,并进行处理
- finally 块负责清理各种资源,不管是否出现异常都会执行
- 其中 try 块是必须的,catch 和 finally 至少存在一个标准异常处理流程
- throw- throws用于抛出异常,前者为手动抛出异常,后者用在方法上,提示调用者我可能抛出异常
抛出异常→捕获异常→捕获成功(当 catch 的异常类型与抛出的异常类型匹配时,捕获成功)→异常被处理,程序继续运行
抛出异常→捕获异常→捕获失败(当 catch 的异常类型与抛出异常类型不匹配时,捕获失败)→异常未被处理,程序中断运行
try {
int a=1/0; //会出先运行时异常
System.out.println(a);
} catch (Exception e) {
//捕获到的异常进行处理
//e.printStackTrace();
System.out.println("分母不可以为0哦"); //分母不可以为0哦
} finally {
//不管有没有异常都会执行
System.out.println("错错了"); //错错了
}
在开发过程中会使用到自定义异常,在通常情况下,程序很少会自己抛出异常,因为异常的类名通常也包含了该异常的有用信息,所以在选择抛出异常的时候,应该选择合适的异常类,从而可以明确地描述该异常情况,所以这时候往往都是自定义异常
自定义异常通常是通过继承 java.lang.Exception 类,如果想自定义 Runtime 异常的话,可以继承java.lang.RuntimeException 类,实现一个无参构造和一个带字符串参数的有参构造方法。
在业务代码里,可以针对性的使用自定义异常。比如说:该用户不具备某某权限、余额不足等。
如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。
按照国际惯例,自定义的异常应该总是包含如下的构造函数:
- 一个无参构造函数
- 一个带有String参数的构造函数,并传递给父类的构造函数。
- 一个带有String参数和Throwable参数,并都传递给父类构造函数。
- 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。
public class myException extends Exception{ //继承exception 异常类
public myException() {
}
public myException(String message) {
super(message);
}
public myException(String message, Throwable cause) {
super(message, cause);
}
public myException(Throwable cause) {
super(cause);
}
public myException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
自定义异常类的使用
public class exceptiionDemo {
public static void main(String[] args) {
A a1=new A();
try {
a1.show(-2);
} catch (myException e) {
String message = e.getMessage();
// e.printStackTrace(); 像正常报错一样的红字显示在控制台
System.out.println(message); //异常:-2 不是正数
} finally {
System.out.println("错错了");
}
}
}
class A {
public void show(int num) throws myException {
if (num < 0) {
myException me = new myException("异常:" + num + "不是正数");
throw me;//抛出异常,结束方法show()的执行
}
System.out.println(num);
}
}