Java的第十一篇文章——异常(后期再学一遍)

简介: Java的第十一篇文章——异常(后期再学一遍)

第十一章 异常

学习目标

  • try catch 处理异常
  • 多catch处理
  • throw和throws的使用
  • finally代码块
  • 自定义异常
  • 集合框架介绍
  • 集合的顶层接口Collection
  • 迭代器Iterator接口
  • 集合的接口List

1.异常

异常:程序在运行中出现的不正常现象就是异常。

异常的知识点不好理解,要求同学们学习异常,主要的目的记住使用格式。

1.1 异常继承体系

一切都是对象,异常也是对象。JDK为异常定义了大量的类,类之间产生继承关系。

异常中的顶级父类:

  • java.lang.Throwable : 所有异常和错误的父类
  • java.lang.Error : 所有错误的父类
  • java.lang.Exception : 所有异常的父类
  • java.lang.RuntimeExeption : 所有的运行异常父类

错误:程序中出现了错误,程序人员只能修改代码,否则不能运行。

异常:程序中出现了异常,可以把异常处理调用,程序继续执行。

1.2 Throwable的方法

  • String toString() 返回异常信息简短描述 (控制台红色部分)
  • String getMessage() 返回异常信息的详细描述
  • void printStackTrace() 异常信息追踪到标准的错误流
  • JVM对异常进行了处理:输出信息,结束程序。

  • 处理异常,没有异常,继续执行程序
  • 如果是jdk定义过的异常,JVM是可以自行创建的,如果没有就需要用户自个throw new 自定义异常类来抛出,方法上也要写明throws 异常类。

1.3 try…catch异常处理

try catch的异常处理的格式写法:

try{
    被检测的代码
    可能发生异常的代码
}catch(异常类的类名  变量名){
    异常的处理方式 : 写什么都可以
    定义变量,创建对象,调用方法,循环,判断...
    只要写了catch,异常就被处理掉了
}

1.4 多catch并行处理

异常处理的代码中:try 可以跟随多个catch

好处:不同的异常,可以区别对待,分开处理。

public static void main(String[] args) {
    /**
    *   myExec出现2个异常
    *   写2个catch分别捕获异常
    */
    try {
          myExec(0);
        }catch (NullPointerException ex){
          System.out.println("处理空指针异常");
        }catch (ArrayIndexOutOfBoundsException ex){
          System.out.println("处理越界异常");
        }
    }
    /**
    * 定义方法,目的引发异常
    * 传递参数 : 对参数进行判断
    */
    public static void  myExec(int i){
    if ( i == 0){
        //引发空指针异常
        String s = null;
        int len = s.length();
    }else {
        //引发越界异常
        int[] arr = {};
        int a = arr[0];
    }
}

多个catch处理异常的时候,写法特别注意:如果catch中的异常类没有关系,先写后写没有区别,catch中的异常类有继承关系,父类写在最下面。

1.5 throw和throws关键字的使用

  • throw关键字:只能写在方法内部,关键字的后面跟随对象的创建。
  • throws关键字:只能写在方法的定义上,关键字后面跟随异常类名。
public static void main(String[] args) {
       /**
         *   getArea()调用方法,方法上有异常
         *   只能处理,不处理编译失败
         *   在main的方法上加throws 异常没有处理,交给JVM处理
         *   try catch处理
         */
    try {
        int area = getArea(-10);
        System.out.println(area);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
/**
     * 功能: 计算正方形的面积
     * 需要参数 : 边长
     * 语法 : 方法的内部出现了异常,必须在方法定义上暴露
     */
public static int getArea(int length) throws  Exception{
    if (length <= 0)
        //数据错误,导致后面的计算不能进行
        //内部出现问题
        throw new Exception("边长不存在");
    return length * length;
}

1.6 finally代码块

finally代码块跟随try ... catch使用,也有跟随try使用

finally代码块里面的程序,无论是否出现异常,都会执行,必须执行

结束JVM了,finally不执行。

主要用于释放资源

public static void main(String[] args) {
    try {
        int[] arr = {1};
        System.out.println(arr[0]);
    }catch (Exception ex){
        ex.printStackTrace();
    }finally {
        //后期用于资源的释放
        System.out.println("这里的代码,必须执行");
    }
}

1.7 RuntimeException异常

异常的父类是Exception,Exception类的子类RuntimeException,凡是RuntimeException和他的所有子类,都称为运行异常,非子类的称为编译异常。

  • 编译异常:方法出现编译异常,调用者必须处理,否则编译失败。处理方式可以是try catch或者是throws都可以
  • 运行异常:方法出现运行异常,方法的定义上,不需要throws声明,调用者也不需要处理这个异常

不要处理运行异常:程序一旦发生运行异常,请程序人员修改源码。

  • 常见的运行异常
  • NullPointerException 空指针
  • IndexOutOfBoundsException 越界异常
  • ClassCastException 类型强制
  • IllegalArgumentException 无效的参数异常

1.8 自定义异常

Java官方已经定义了大量的异常类,但是依然不够,以后做项目的时候,会出现的异常,在JDK中没有定义的,需要我们自己定义异常。

  • 自定义异常,入伙,继承Exception或者RuntimeException
  • 只有Exception和他的子类,才具有可抛出性
  • 自定义的类中,构造方法,super调用父类构造方法,传递异常信息
/**
 *  自定义的异常类
 *    成绩负数的异常
 *    继承哪个父类呢
 *
 *    自定义异常信息 : 继承父类 RuntimeException 带有String类型的构造方法 (String 异常信息)
 */
public class ScoreException extends RuntimeException{
    public ScoreException(String s){
        super(s);
    }
}
public static void main(String[] args) {
       // int[] arr = {1};
        //System.out.println(arr[2]);
        int avg = getAvg(-100,2);
        System.out.println("avg = " + avg);
    }
    /**
     * 计算成绩的平均分
     */
    public static int getAvg(int math,int chinese) throws ScoreException{
        //判断成绩的数值
        if ( math < 0 || chinese < 0)
            //手动抛出,自己定义的异常
            throw new ScoreException("成绩不存在");
        return  (math + chinese) / 2;
    }
相关文章
|
14天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
31 3
|
6天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
9天前
|
存储 安全 Java
如何避免 Java 中的“ArrayStoreException”异常
在Java中,ArrayStoreException异常通常发生在尝试将不兼容的对象存储到泛型数组中时。为了避免这种异常,确保在操作数组时遵循以下几点:1. 使用泛型确保类型安全;2. 避免生类型(raw types)的使用;3. 在添加元素前进行类型检查。通过这些方法,可以有效防止 ArrayStoreException 的发生。
|
10天前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
24 2
|
12天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
36 4
|
13天前
|
Java 索引
如何避免在 Java 中引发`StringIndexOutOfBoundsException`异常
在Java中,处理字符串时若访问了不存在的索引,会抛出`StringIndexOutOfBoundsException`异常。为避免此异常,应确保索引值在有效范围内,例如使用`length()`方法检查字符串长度,并确保索引值不小于0且不大于字符串长度减1。
|
15天前
|
安全 Java 数据安全/隐私保护
如何配置 Java 安全管理器来避免访问控制异常
配置Java安全管理器以防止访问控制异常,需在启动JVM时通过 `-Djava.security.manager` 参数启用,并设置安全策略文件,定义权限规则,限制代码执行操作,确保应用安全。
|
22天前
|
Java
让星星⭐月亮告诉你,Java异常分类[Throwable(Error/Exception(RuntimeException/其他异常)) 检查时异常 非检查时异常]
本文深入解析了Java异常处理机制,重点介绍了`Throwable`类及其子类`Error`和`Exception`,并通过实例代码、流程图和表格详细解释了异常的分类、区别及处理方法,帮助读者掌握异常处理的关键技巧,提升程序的稳定性和健壮性。
40 1
|
26天前
|
Java 程序员
关于java异常
关于java异常
20 5
|
2月前
|
Java 编译器 数据库连接
Java——异常
在 Java 中,程序执行过程中的不正常行为被称为异常。异常分为 Error 和 Exception。Error 表示系统级错误,而 Exception 则封装程序可能出现的问题。异常包括编译时异常和运行时异常(如数组越界)。异常可用于查找 bug 信息和作为方法内部的特殊返回值。处理异常的方式有默认处理和捕获异常,后者通过 try-catch 结构实现。此外,还可以自定义异常类来更灵活地处理特定情况。
34 9
Java——异常