Java异常处理


程序运行时发生了不被期望的事件,阻止了程序按照预期正常执行。

Java.lang软件包中有一个java.long.Throwable类,这个类是java中所有错误和异常的超类,Throwable类有两个子类,ErrorException

Error,是Throwable的子类,包含大量子类,出错后程序无法处理,如OutOfMemeryError

Exception,是Throwable的子类,包含大量子类,程序本身可以处理的异常,如ArraryIndexOutOfBoundException。Exception又分成两类:运行时异常,也叫不可查异常(RuntimeException)和非运行时异常也叫可查异常(IOException)。

java内置异常

可查异常(必须在方法里面捕获或者抛出)

  • ClassNoFoundException 应用程序试图加载类,却找不到对应的类;
  • IllegalAccessExcetion 拒绝访问一个类的时候;
  • NoSuchFieldExcetion 请求变量不存在;
  • NoSuchMethodException 方法不存在;

不可查异常

  • ArrayIndexOutOfBoundsException 数据索引越界;
  • ClassCastException 强制失败抛出异常;
  • NullPointerException 需要对象的地方使用null时,抛出该异常;
  • NumberFormatException 将字符串换成一种数值类型,但该字符串不能转换为适当的格式时,抛出该异常;

Throwable类核心方法

  • public String getMessage() 获取异常的详细信息;
  • public Throwable getCause() 获取异常原因;
  • public void printStackTrace() 打印错误的堆栈信息,即错误输出流,可以看到错误原因和所在位置;
  • public StackTraceElement [] getStackTrace() 对账层次的数据,下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底;

try…catch…finally

try {
  // 可能产生异常的语句
  语句;
} catch (异常类1 异常对象1) {
  // 处理异常
} catch (异常类2 异常对象2) {
  // 处理异常
} finally {
  // 无论是否发生异常都会执行的语句
}

示例

import java.util.InputMismatchException;
import java.util.Scanner;

public class ExceptionTest {
    public static void main(String[] args) {

        System.out.println("1 注册");
        System.out.println("2 登录");

        int[] choice = {1, 2};

        System.out.println("请输入序号");
        Scanner scanner = new Scanner(System.in);
        try {
            int num = scanner.nextInt();
            if (num == choice[2])
                System.out.println("欢迎光临");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界了");
        } catch (InputMismatchException e) {
            System.out.println("输入的不是数字");
        } catch (Exception e){
            System.out.println("程序发生异常");
            e.printStackTrace();
        } finally {
            System.out.println("程序运行结束,释放资源!");
        }
    }
}

throws-thorw

throws声明方法可能抛出的异常

修饰符 返回值类型 方法名(参数) throws 异常类1, 异常类2,...{
  方法体
}

进行了throws声明表示该方法不进行异常处理,由该方法的调用者负责处理异常。

public class ThrowsDemo {
    public static void main(String[] args) {
        try {
            test(10, 0);
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
        }
    }

    public static void test(int a, int b) throws ArithmeticException {
        double result = a/b;
        System.out.println("result" + result);
    }
}

thorw在方法中直接抛出异常

{
  throw new 异常类名();
}
public class ThrowsDemo {
    public static void main(String[] args) {
        test2(10, 0);
    }

    public static void test2(int a, int b){
        if(b == 0) {
            throw new ArithmeticException("除法运算中,除数不能为0");
        }
        double result = a/b;
        System.out.println("result:" + result);
    }
}

文章作者: 老百
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 老百 !
  目录