【JAVA学习之路 | 提高篇】异常(Exception)

简介: 【JAVA学习之路 | 提高篇】异常(Exception)

1.程序的异常

  • 在使用计算机语言进行项目开发过程中,即使程序员把代码写到尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码来避免的,(比如客户输入的格式问题,读取的文件是否存在).
  • 异常 : 指程序在执行过程中,出现了非正常的情况,如果不处理将导致JVM的非正常停止.
  • 异常并不是指的是语法错误或逻辑错误.语法错了,编译不通过,不会产生字节码文件,根本不会运行.代码逻辑错误,只是得不到自己想要的结果.

2.异常抛出机制

  • java中把不同的异常用不同的类表示,一旦发生某种异常,就会创建该异常的对象,并且throw.程序员可以catch这个异常,并处理;如果没有catch异常,则可能导致程序异常终止.

3.对待异常

  • 遇到错误终止程序运行.
  • 程序员在编写代码时,充分考虑到各种可能发生的异常或错误,极力预防和避免.实在无法避免的,要编写相应的代码进行异常检测,以及异常处理,保持代码的健壮性.

4.异常体系

(1). Throwable

java.lang.Throwable类是程序执行过程中涉及到的异常的根父类.该类继承与java.lang.Object.

Throwable中的常用方法 :

  • public void printStackTrace()打印异常的详细信息.包含了异常的类型,原因,出现的位置,在开发和调试阶段都得使用该方法.
  • public String getMessage()获取异常发生的原因.

Throwable可分为Error和Exception两类,分别对应java.lang.Error和java.lang.Exception.


(2). Error : java虚拟机无法解决的严重问题.如JVM系统内部错误,资源耗尽的严重情况.一般不编写针对性的代码进行捕获.(考虑修改源代码)例如 : StackOverflowError和OutOfMemoryError.


(3). Exception : 其他因编程错误或偶然的外在因素导致的一般性问题,需要编写针对性代码进行捕获,使程序得以正常运行.例如 : 空指针异常,试图读取不存在的文件.

5.编译时期异常与运行时期异常

                   javac.exe                          java.exe


java源程序---------------->字节码文件-------------->在内存中加载类,运行类


(1). 编译时期异常(checked异常,受检异常) : 在代码编译阶段,编译器就能明确警示(代码下有红线)当前代码可能发生的异常(不非要是一定发生),并明确督促程序员提前编写处理他们的代码.如果程序员没有编写异常处理代码,则编译器判定编译失败.从而不能生成字节码文件.通常,这些异常不是由程序员的代码引起的,或者说不是靠简单判断就可以避免的.(如FileNotFoundException).


(2). 运行时期异常 (runtime异常,unchecked异常) : 在代码编译阶段,编译器完全不做任何检查.无论该异常是否会发生,都不会提醒报错.只有当代码真正运行跑起来以后确实发生了异常,他才会被发现.通常,这类异常是程序员的代码编写不当引起.

java.lang.RuntimeException类及其子类都是运行时异常.比如ArrayIndexOutOfBoundsException(角标越界一场).

    //ArrayIndexOutOfBoundsException
    public void test1() {
        int[] a = new int[10];
        //编译阶段未报错,但运行时会报错
        System.out.println(a[10]);
    }
    //NullPointerException
    public void test2() {
        String str = null;
        str.toString();
    }
    //ClassCastException
    public void test3() {
        Object obj = new String();
        Date date = (Date) obj;
    }
    //NumberFormatException
    public void test4() {
        String str = "abc";
        int i = Integer.parseInt(str);
    }
    //InputMismatchException
    public void test5() {
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        //假如输入了"abc";
    }
相关文章
|
6月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
366 1
|
7月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
212 1
|
6月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
534 0
|
6月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
623 8
|
7月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
115 5
|
7月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
199 5
|
7月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
263 3
|
7月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
132 1
|
7月前
|
设计模式 存储 Java
Java基础学习day07
本节讲解Java中的final关键字、单例设计模式、枚举类、抽象类与接口。涵盖常量定义、单例写法(饿汉式/懒汉式)、枚举特点及应用场景,以及抽象类与接口的使用与区别,助力掌握核心面向对象编程思想。
246 1
|
7月前
|
Java
Java基础学习day05-作业
本文为Java基础学习第五天作业,通过五个案例练习类与对象的定义、构造方法、set/get方法及成员方法的应用。涵盖女友、学生、教师、手机和电影等类的设计与测试,强化面向对象编程基础。
121 2
下一篇
开通oss服务