异常..

1.开发过程中的错误

在开发Java程序的过程中 会遇到各种各样的错误 一下是对错误的分类:
1.语法错误
如果产生了语法错误的话 那么就会导致编译失败 程序无法正常运行
2.逻辑错误
比如原本我想要进行加法运算 但是我将加法运算符写成了减法运算符 但是这个错误并不致命 也就是说 不会导致编译失败进而程序无法运行
3.运行时错误
就是程序运行过程中产生的以外 会导致程序终止运行 这个错误在Java中也叫做异常

程序如果产生了异常 一般我们称之为:抛出了异常 如果我们没有主动去处理他的话 那么他就会终止程序的运行

2.异常

上面说了 异常就是运行时抛出的错误 如果没有主动去处理他的话 那么就会导致程序的终止运行
在Java中 异常有很多种
所有的异常都是继承自java.lang.Throwable(虽然Throwable的后缀able写的有点像接口 但是实际上他是一个类)
异常.._第1张图片

如何防止程序抛出异常而导致其终止运行呢?1.try-catch方法 2.throws方法

3.异常的种类

我们可以分成两种异常 一种是检查型异常 一种是非检查型异常
前者的话 一般通过修改代码的方式难以避免 并且编译器会检查这个异常(如果开发者没有处理这个异常的话 那么编译器就会报错)
哪些是检查型异常呢?除了RuntimeException和Error以外的异常
后者的话 一般可以避免 并且编译器也不会进行异常的检查(如果开发者没有处理这个异常的话 那么编译器是不会报错的)
哪些是非检查型异常呢?RuntimeException和Error这些异常

1.常见的检查型异常

如果存在潜在的异常的话 那么就需要我们进行处理 处理的方式可以是try-catch 也可以是throws
1.可能会抛出FileNotFoundException异常(如果指定文件不存在的话 就会抛出FileNotFoundException这个异常 并且代码的修改无法左右文件的存在性 可以通过throws的方式处理这个异常)

static void test1() throws FileNotFoundException {
    FileOutputStream fos = new FileOutputStream("D:\1.txt");
}

2.解析日期的时候可能会抛出ParseException异常(如果解析的对象的格式和SimpleDateFormat指定的格式不一致的话 那么就会抛出ParseException这个异常 代码的修改无法解决这个异常 可以通过throws的方式进行处理)
(SimpleDateFormat.format()主要用于对未格式化的Date进行格式化操作 并且返回一个字符串
SimpleDateFormat.parse()主要用于对已格式化的字符串进行解析操作 并返回一个Date)

static void test2() throws ParseException {
    SimpleDateFormat fos = new SimpleDateFormat("yyyy-MM-dd");
    fos.parse("2022年10月11日");
}

3.程序睡眠的代码可能会抛出InterruptedException异常 需要我们主动处理 否则编译器就会检查并且报错

static void test3() throws InterruptedException {
    Thread.sleep(2000);
}

4.根据类名找到指定类 然后创建相应的类实例 其中的话 可能会抛出三个异常 一种是如果不存在指定类名的类的话 那么就会抛出ClassNotFoundException异常 一种是如果指定类中没有无参构造方法的话 那么就会抛出InstantiationException 一种是如果无参构造方法的权限为私有的话 那么外界无法访问 就会抛出IllegalAccessException

public class Dog {
}
static void test4() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    Class cls = Class.forName("Dog");
    Dog dog = (Dog)cls.newInstance();// 调用Dog中的无参构造方法进行Dog的实例化操作
}

其中的话 我们如果只根据Dog找到指定的类是不现实的 因为如果这个项目中存在多个Dog类的话 那么你应该去找谁呢 不知道 所以只能够写清楚全名 才能够解决ClassNotFoundException异常 并且由于我们的构造方法是公有且无参的 所以现在就不会因为异常而导致程序终止运行

2.常见的非检查型异常-Error

1.程序运行过程中因为堆空间溢出导致抛出OutOfMemoryError异常

static void test1(){
    System.out.println(1);
    for(int i = 0; i < 200; ++i){
        long[] a = new long[10_0000_0000];
    }
    System.out.println(2);
}

2.程序运行过程中因为栈空间溢出导致导致抛出StackOverFlowError异常

static void test2(){
    test2();
}

3.常见的非检查型异常-RuntimeException

1.程序运行过程中因为空值调用导致抛出NullPointerException

static void test3(){
    StringBuilder sb = null;
    sb.append("abc");
}

2.程序运行过程中因为构造方法的格式不对导致抛出NumberFormatException

static void test4(){
    Integer i = new Integer("abc");
}

3.程序运行过程中因为数组越界访问导致ArrayIndexOutOfBoundsException

static void test5(){
    int[] array = {11, 22, 33};
    System.out.println(array[3]);
}

4.程序运行过程中因为类型之间不能转换导致ClassCastException(java.lang.String不能转换为java.lang.Double 这是因为这两个不是子类和父类的关系)

static void test6(){
    Object o = "123.4";
    Double d = (Double)o;
}

4.异常的处理

程序如果产生了异常 我们一般称之为:抛出了异常

不管抛出的是检查型异常 还是非检查型异常 只要我们没有去处理异常的话 那么程序就会终止运行

异常有两种处理方式:1.try-catch 捕获异常
2.throws 将异常往上抛
我们使用上述两种方式 可以解决程序的终止运行

1.try-catch


你可能感兴趣的:(java)