目录
(3)错误(error):脱离程序员控制的问题,编译期间检查不到。
异常
1.什么是异常
异常是指程序运行过程中发生的一些不正常事件
如写的计算程序要求用户输入数字,但用户输入的字符串导致程序出错
2.简单分类
(1)检查性异常:用户错误输入,不可预见但能避免
(2)运行时异常:能被程序员避免,也可以在编译时忽略
(3)错误(error):脱离程序员控制的问题,编译期间检查不到。
3.异常体系结构
Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类
Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,绝大多数是程序运行不允许出现的状况。
Error发生时,Java虚拟机一般会选择线程终止。
Exception一般是由程序逻辑错误引起的,程序可以捕获这些异常并选择处理或不处理,程序应从逻辑角度避免这类异常的发生。
4.异常的处理
关键字:try,catch,finally,throw,throws
(1)抛出异常:
主动抛出异常:
throw new 要抛出的异常类型;
如果在该方法中不处理异常,可将其抛出,但要注意抛出的异常必须要处理(交给其他方法或直接用trycatch包裹该方法)!
public void test1(int a) throws 要抛出的异常类型 {
if (a > 0){
//一般在方法中使用
throw new Exception();
}
}
(2)捕获异常:
public class ExceptionDemo {
public static void main(String[] args) {
int a = 1;
int b = 0;
//try{
// 需要监视的代码
// }catch(要捕获什么类型的异常)
// {异常处理代码}
//finally{
//最后必定执行的代码
// }
try {
System.out.println(a/b);
}catch (Exception e){
System.out.println("出错了");
}catch (Throwable e){
System.out.println("出错了");
}finally{
//必定执行的代码,一般是善后工作
}
}
}
其中finally可以不要,catch可以多个(范围从小到大)
快捷键:IDEA ctrl + alt + t
5.自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常,用户自定义异常类,只需继承Exception类即可。
在大多数自定义异常,仅需继承RuntimeException即可。
在程序中使用自定义异常类,可分为以下几个步骤
(1)创建自定义异常类
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常
public class CustomException extends Exception{
//数字<10抛出异常
private int num;
public CustomException(int num) {
this.num = num;
}
/**
*
* @return 异常信息
*/
@Override
public String toString() {
return "CustomException{" +
"num=" + num +
"<10"+'}';
}
}
public class Test {
public static void main(String[] args) {
try {
new Test().test(5);
} catch (CustomException e) {
System.out.println(e.toString());
}
}
public void test(int a) throws CustomException {
if (a < 10){
throw new CustomException(a);
}
System.out.println("OK");
}
}
6.实际应用技巧
(1)处理运行时异常时,采用逻辑去合理规避同时辅助 try-catch 处理
(2)在多重catch块后面,可以加一个catch (Exception)来处理可能会被遗漏的异常
(3)对于不确定的代码,也可以加上 try-catch ,处理潜在的异常
(4)尽量去处理异常,切忌只是简单地调用 printStackTrace0)去打印输出
(5)具体如何处理异常,要根据不同的业务需求和异常类型去决定
(6)尽量添加finally语句块去释放占用的资源