Java从零开始 基础(三)异常处理
异常体系结构
- 异常:程序在运行中出现的故障
- java把异常当成对象来处理,并定义一个基类java.lang.throwable作为所有异常的超类
- java api中已经定义了许多异常类,分为两大类:Error(错误),Exception(异常)
Error
由java虚拟机(JVM)生成并抛出,如:
- OutOfMemoryError(内存溢出)
- NoClassDefFoundError(类定义错误)
- LinkAgeError(链接错误)等
Exception
一般由程序逻辑错有引起,可以尽量避免
有一个重要的子类:RuntimeException(运行时异常):
- ArithmeticException(算术异常)
- ArrayIndexOutOfBoundsException(数组下标越界异常)
- NullPointerException (空指针异常)
- StringIndexOutOfBoundsException (字符串越界异常)
- NegativeArraySizeException (建立元素个数为负数的数组异常)
- 。。。。。。
区别:
- Error通常是致命级错误,是程序无法处理的,出现这些异常时,JVM一般会终止线程
- Exception通常是可以由程序捕捉并处理的
java异常处理机制
捕获异常,抛出异常
关键字:try catch finally throw throws
package com.exception;
public class TextException {
static int a = 1;
static int b = 0;
public static void main(String[] args) {
test_1();
test_2();
test_3();
test_4();
}
// 捕获单个异常
public static void test_1() {
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("出现捕获ArithmeticException异常");
} finally { // 不管有没有异常,这里都执行
System.out.println("我也不知道有没有异常");
}
}
// 捕获多个异常 Throwable > Error、Exception > other
public static void test_2() {
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("出现捕获ArithmeticException异常");
} catch (Exception e) {
System.out.println("出现捕获Exception异常");
} catch (Throwable e) {
e.printStackTrace(); // 打印错误的栈信息
} finally {
System.out.println("我也不知道有没有异常");
}
}
public static void test_3() {
if (b==0){
throw new ArithmeticException(); // 主动抛出异常
}
}
public static void test_4() throws ArithmeticException{
}
}
自定义异常
- 创建自定义异常类(继承Exception类)
- 在方法中通过throw关键字抛出异常
- 如果在当前抛出异常的方法中处理异常,可以使用try-catch捕获并处理;否则在方法的声明处同过throws关键字指明要抛给调用者的异常,继续进行下一步操作
- 在出现异常方法的调用者中捕获并处理异常
package com.exception;
public class MyException extends Exception {
private int detail;
public MyException(int a) {
this.detail = a;
}
@Override
public String toString() { // 异常的打印信息
return "MyException{" + "detail=" + detail + '}';
}
}
class Text {
public static void getException(int a) throws MyException {
if(a>10){
throw new MyException(a);
}
System.out.println("正常");
}
}
class run{
public static void main(String[] args) throws MyException {
new Text().getException(11);
}
}
注意
- 处理运行时异常时,采用逻辑去合理规避同时铺助 try-catch 处理
- 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上 try-catch,处理潜在的异常
- 尽量去处理异常,切忌只是简单地调用 PrintStackTrace( 去打印输出)
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加finally语句块去释放占用的资源

浙公网安备 33010602011771号