java基础 韩顺平老师的 异常 自己记的部分笔记

java · 浏览次数 : 0

小编点评

**第 5 点** ```java class Person { private String name = "jack"; public String getName() { return name; } } public class Exception { public static void main(String[] args) { try { int n1 = 10; int n2 = 0; System.out.println(n1 / n2); } finally { System.out.println("执行了finally..."); } System.out.println("程序继续执行..."); } } ``` **第 6 点** * 使用 `throws` 关键字: ```java class Throws { public static void main(String[] args) throws FileNotFoundException { //代码... } } ``` * 使用 `throws` 关键字和 `finally` 块: ```java class Throws { public static void main(String[] args) throws ArithmeticException { int n1 = 10; int n2 = 0; double res = n1 / n2; } } ``` **第 7 点** * 自定义异常: ```java class CustomException extends RuntimeException { public CustomException(String message) { super(message); } } ``` **第 8 点** * `throw` 和 `throws` 的区别: `throw` 关键字直接抛出指定的异常类型。 `throws` 关键字通过类型声明来捕获指定的异常类型。

正文

443,异常处理入门

 

package com.hspedu.exception_;

public class Exception {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        //老韩解读
        //1,num1 / num2 = 10 / 0
        //2,当执行到 num1 / num2,因为 num2 = 0,程序就会出现(抛出)异常 ArithmeticException
        //3,当抛出异常后,程序就退出,崩溃了,下面的代码就不在执行
        //4,大家想想这样的程序好吗?不好,不应该出现了一个不算致命的问题,就导致整个系统崩溃
        //5,java 设计者,提供了一个叫 异常处理机制来解决该问题

        //int res = num1 / num2
        //如果程序员,认为一段代码可能出现异常/问题,可以使用try-catch异常处理机制来解决
        //从而保证程序的健壮性
        //将该该代码块->选中->快捷键 ctrl + alt + t -> 选中 try-catch
        //6,如果进行异常处理,那么即使出现了异常,程序可以继续执行

        try {
            int res = num1 / num2;
        } catch (java.lang.Exception e) {
            //e.printStackTrace();
            System.out.println("出现异常的原因=" + e.getMessage());//输出异常信息
        }

        System.out.println("程序继续运行...");
    }
}

 

444,异常基本介绍

 

 445,异常体系图

 

 

 

446,五大运行时异常

 

(1)NullPointerException空指针异常

 

package com.hspedu.exception_;

public class Exception {
    public static void main(String[] args) {
        String name = null;
        System.out.println(name.length());
    }
}

 

(2)ArithmeticException数学运算异常

 例子在 443节有

 

(3)ArrayIndexOutOfBoundsException数组下标越界异常

 

package com.hspedu.exception_;

public class Exception {
    public static void main(String[] args) {
       int[] arr = {1,2,4};
       for(int i = 0; i <= arr.length; i++)
       {
           System.out.println(arr[i]);
       }
    }
}

 

(4)ClassCastException类型转换异常

 

package com.hspedu.exception_;

public class Exception {
    public static void main(String[] args) {
        A b = new B(); //向上转型
        B b2 = (B)b;//向下转型,这里好着呢
        C c2 = (C)b;//这里抛出ClassCastException
    }
}
class A {}
class B extends A {}
class C extends A {}

 

(5)NumberFormatException数字格式不正确异常

 

package com.hspedu.exception_;

public class Exception {
    public static void main(String[] args) {
        String name = "韩顺平教育";
        //将String 转成 int
        int num = Integer.parseInt(name);//抛出NumberFormatException
        System.out.println(num);
    }
}

 

447,异常课题练习(了解编译异常)

 

448,异常处理机制

 

 

449,try-catch

前3点

 

package com.hspedu.exception_;

public class Exception {
    public static void main(String[] args) {
        //ctrl + alt + t,选中这3行
        try {
            String str = "韩顺平";
            int a = Integer.parseInt(str);
            System.out.println("数字:" + a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息=" + e.getMessage());
        } finally {
            System.out.println("finally代码块被执行...");
        }
        System.out.println("程序继续...");
    }
}

 

第4点

 

package com.hspedu.exception_;

public class Exception {
    public static void main(String[] args) {
        //老韩解读
        //1,如果try代码块有可能有多个异常
        //2,可以使用多个catch 分别捕获不同的异常,相应处理
        //3,要求子类异常写在前面,父类异常写在后面
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName()); //NullPointerException
            int n1 = 10;
            int n2 = 0;
            int res = n1 / n2; //ArithmeticException
        } catch (NullPointerException e) { //子类异常
            System.out.println("空指针异常=" + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("算术异常=" + e.getMessage());
        } catch (java.lang.Exception e) //父类异常
        {
            System.out.println(e.getMessage());
        } finally {
        }
    }
}
class Person {
    private String name = "jack";

    public String getName() {
        return name;
    }
}

 

第5点

 

package com.hspedu.exception_;

public class Exception {
    public static void main(String[] args) {
        try {
            int n1 = 10;
            int n2 = 0;
            System.out.println(n1 / n2);
        } finally {
            System.out.println("执行了finally...");
        }
        System.out.println("程序继续执行...");
    }
}

 

450,try-catch小结(练习听懂后的)

 

451,try-catch最佳实践

 

package com.hspedu.exception_;

import java.util.Scanner;

public class Exception {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = 0;
        String inputStr = "";
        while(true) {
            System.out.println("请输入一个整数:");
            inputStr = scanner.next();
            try {
                num = Integer.parseInt(inputStr);//这里可能抛出异常
                break;
            } catch (NumberFormatException e) {
                System.out.println("你输入的不是一个整数:");
            }
        }
        System.out.println("你输入的值是=" + num);
    }
}

 

452,throws入门案例

 

package com.hspedu.exception_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

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

    }
    public void f2() throws FileNotFoundException {
        //创建了一个文件流对象
        //老韩解读
        //1,这里的异常是一个FileNotFoundException 编译异常
        //2,使用前面讲过的 try-catch-finally
        //3,使用throws,抛出异常,让调用f2方法的调用者(调用者也是方法)处理
        //4,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类Exception
        //5,throws 关键字后也可以是 异常列表,即可以抛出多个异常 FileNotFoundException,NullPointerException,ArithmeticException
        FileInputStream fis = new FileInputStream("d//aa.txt");
    }
}

 

453,throws使用细节

 

第1点和第2点

package com.hspedu.exception_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Throws {
    public static void main(String[] args) {
        f2();//调用者是main方法,main方法也有默认的throws处理,所以又把异常抛给了JVM处理
    }
    public static void f2() throws ArithmeticException{ //f2方法显式的声明抛出异常,之后该异常由f2方法的调用者处理
        //1,对于编译异常,程序中必须处理,比如 try-catch 或者 throws
        //2,对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
        int n1 = 10;
        int n2 = 0;
        double res = n1 / n2;
    }
}

 

第3点和第4点

package com.hspedu.exception_;
public class Throws {
    public static void main(String[] args) {
    }
}
class Father {//父类
    public void method() throws RuntimeException {
    }
}
class Son extends Father {//子类
    //3,子类重写父类的方法时,对抛出异常的规定:
    //子类重写的方法所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型
    //4,在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws
    @Override
    public void method() throws ArithmeticException {
    }
}

其他细节点

package com.hspedu.exception_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

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

    }
    public static void f1() throws FileNotFoundException {
        //这里大家思考问题 调用f3() 报错
        //老韩解读
        //1,因为f3() 方法抛出的是一个编译异常
        //2,即,这时就要f1() 必须处理这个编译异常
        //3,在f1() 中,要么 try-catch-finally,或者继续throws 这个编译异常
        f3();
    }
    public static void f3() throws FileNotFoundException {
        FileInputStream fis = new FileInputStream("d//aa.txt");
    }
    public static void f4() {
        //老韩解读
        //1,在f4()中调用方法f5() 是好的
        //2,原因是f5() 抛出的是运行异常
        //3,而java中,并不要求程序员显式处理,因为有默认处理机制
        f5();
    }
    public static void f5() throws ArithmeticException{
    }
}

 

454,自定义异常

 

package com.hspedu.exception_;

public class CustomException {
    public static void main(String[] args) {
        int age = 180;
        if(!(age >= 18 && age <= 120)){
            throw new AgeException("年龄需要在 18~120之间");
        }
        System.out.println("你的年龄范围正确");
    }
}
//自定义一个异常
//老韩解读
//1,一般情况下,我们自定义异常是继承 RuntimeException
//2,即把自定义异常做成 运行时异常,好吃是我们可以使用默认的处理机制
//3,即比较方便
class AgeException extends RuntimeException {
    public AgeException(String message) {//构造器
        super(message);
    }
}

 

455,throw和throws区别

 

456,异常课后作业1

 

package com.hspedu.exception_;

import java.util.Scanner;

public class Homework {
    public static void main(String[] args) {
        try {
            //先验证输入的参数的个数是否正确 两个参数
            if(args.length != 2)
            {
                throw new ArrayIndexOutOfBoundsException("参数个数不对");
            }

            //先把接收到的参数,转成整数
            int n1 = Integer.parseInt(args[0]);
            int n2 = Integer.parseInt(args[1]);

            double res = cal(n1, n2); //该方法可能抛出ArithmeticException
            System.out.println("计算结果是=" + res);

        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e.getMessage());
        } catch (NumberFormatException e) {
            System.out.println("参数格式不正确,需要输出整数");
        } catch (ArithmeticException e) {
            System.out.println("出现了除0的异常");
        }


    }
    //编写cal方法,就是两个数的商
    public static double cal(int n1,int n2)
    {
        return n1 / n2;
    }
}

 

要配置参数,之前讲过

如果不配置参数,就出现 "参数个数不对"的异常

 运行结果:

 

配置10 hsp 的参数,出现"参数格式不正确,需要输出整数"的异常

 

 

配置 10 0 的参数,出现 "出现了除0的异常"

 

 

与java基础 韩顺平老师的 异常 自己记的部分笔记相似的内容:

java基础 韩顺平老师的 异常 自己记的部分笔记

443,异常处理入门 package com.hspedu.exception_; public class Exception { public static void main(String[] args) { int num1 = 10; int num2 = 0; //老韩解读 //1,nu

Java基础 韩顺平老师的 常用类 的部分笔记

459,八大Wrapper类 包装类的分类 1) 针对八种基本数据类型相应的引用类型—包装类 2) 有了类的特点, 就可以调用类中的方法。 460,装箱和拆箱 package com.hspedu.Wrapper; public class WrapperType { public static v

我在前端写Java SpringBoot项目

本篇文章主要是使用 NestJs + Sequelize + MySQL 完成基础运行, 带大家了解 Node 服务端的基础搭建,也可以顺便看看 Java SpringBoot 项目的基础结构,它俩真的非常相似,不信你去问服务端开发同学。

[转帖]【JVM】类文件结构

Class文件的定义 一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在class文件中,中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序。 注:Java虚拟机规范规定,Class文件格式采用类似C语言结构体的伪结构来存储数据,这种结构只有两种数据类型:

Java基础:线程的三种创建方式

一、继承Thread类 定义一个类继承线程类Thread 重写run()方法 创建线程对象 调用线程对象的start()方法创建线程 Thread类的常用API setName(String name):给线程取名字 getName():获取线程的名字 public static Thread cu

Java基础:throw和throws的详解

总结来说,throw是用来抛出一个具体的异常实例,而throws是用来声明方法可能会抛出哪些类型的异常,是对调用者的一种通知和要求。 1. throw 作用: throw关键字用于在方法体内实际抛出一个异常实例。当程序运行到throw语句时,指定的异常会被创建并抛出,立即终止当前方法的执行,并将控制

浅拷贝、深拷贝与序列化【初级Java必需理解的概念】

浅拷贝 首先创建两个类,方便理解浅拷贝 @Data class Student implements Cloneable{ //年龄和名字是基本属性 private int age; private String name; //书包是引用属性 private Bag bag; public Stu

Fastjson基础环境配置与Java基础概念

Preface 此篇系列文章将会从 Java 的基础语法开始,以 Fastjson 的各个反序列化漏洞分析为结尾,详细记录如何从一个具有基础面向对象编程但毫无 Java 基础的小白成长为了解 Fastjson 的各个漏洞并能够熟练利用的网络安全人员。 环境配置 我们使用 IDEA 作为开发的 IDE

不只有 Spring,这四款 Java 基础开发框架同样值得关注! 审核中

Java 开发不只有 Spring ,今天给大家推荐几个同样优秀的 Java 基础开发框架,为日常项目开发提供更多的选择。答应我,请不要再叫我 Spring 小子了,​好吗? 项目概览: Guice:轻量级依赖注入框架 Javalin:轻量级 Java 和 Kotlin Web 框架 Quarkus

从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁

写在开头 随手一翻,发现对于Java中并发多线程的学习已经发布了十几篇博客了,多线程 是Java基础中的重中之重!因此,可能还需要十几篇博客才能大致的讲完这部分的知识点,初学者对于这部分内容一定要多花心思,不可马虎!今天我们继续来学习一个重要知识点:ReentrantLock ReentrantLo