黑马程序员 第一篇 Java 异常处理 (Foundation; completed)

本文详细介绍了Java中的异常处理机制,包括try-catch-finally语句的使用方法、异常的分类及区别、自定义异常的创建与应用等内容。通过具体实例展示了如何有效地管理和处理程序运行时可能出现的各种异常情况。

——- android培训java培训、期待与您交流! ———-

Java 基础 异常处理

  • 什么是异常处理
  • 如何进行异常处理
  • 异常的分类和区别不同的异常
  • 自定义异常和使用自定义异常

    1. 异常处理基本介绍

1.1 try和catch捕获异常

try语句块主要用于可能会出现异常的区域,在try的后面会跟有一个或者多个catch语句块,在catch语句块中主要是编写相应异常的处理方法。

语法
try
{
    //此处是可能出现异常的代码
}
catch(Exception e)
{
    //此处是如果发生异常的处理代码
}
public class YiChang1
{
    public static void main(String args[])
    {
        try
        {
            int[] a = new int[5]; //定义一个长度为5的数组
            a[5] = 6;
        }
        catch(Exception e)
        {
            //发生异常时执行的语句
            System.out.println("该程序发生异常");
        }
    }
}           

该代码会运行try语句时,由于并不存在a[5],所以发生异常,执行catch语句

1.2 try…catch 语句使用注意点

  1. try…catch语句是对有可能发生异常的程序进行查看,如果没有发生异常,就不会执行catch语句中的内容.

  2. 在程序中如果不适用try…catch语句,则当程序发生异常的时候,会自动退出程序的运行.

  3. try…catch语句中catch语句可以不只是一个,可以存在多个catch语句来定义可能发生的多个异常。当处理任何一个异常时,则将不再执行其他catch语句.

public class YiChang2
{
    public static void main(String args[])
    {
        try
        {
            int[] a = new int[5];//定义一个长度为5的数组
            a[5]=6;              //为其中元素赋值
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            //发生数组下标越界异常时执行的语句
            System.out.println("该程序发生数组下标越界异常");
        }
        catch(Exception ee)
        {
            //发生异常时执行的语句
            System.out.println("该程序发生异常");
        }
    }
}

输出结果为:
该程序发生数组下标越界异常

代码解析:
第一个catch语句中ArrayIndexOutOfBoundsException就是数组下标异常,它是Exception异常的子类。
该程序执行第一段catch语句后,不执行第二段catch语句

  • 当对程序使用多个catch语句进行异常处理时,特别需要注意的是要将范围相对小的异常放在前面,讲范围相对大的异常放在后面。以下示范一个错误的catch语句顺序。
public class YiChangeCatchOrder
{
    public static void main(String args[])
    {
        try
        {
            int[] a = new int[5];//定义一个长度为5的数组
            a[5]=6;              //为其中元素赋值
        }
        catch(Exception ee)
        {
            //发生异常时执行的语句
            System.out.println("该程序发生异常");
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            //发生数组下标越界异常时执行的语句
            System.out.println("该程序发生数组下标越界异常");
        }
    }
}

输出结果:
该程序发生异常
代码解析:
由于第一段catch语句将对所有异常进行处理,执行该catch语句后将不执行后面的catch语句。

1.3 finally 语句

finally 语句是无论程序中是否发生异常都会被执行的

语法

try
{
    //此处是可能出现异常的代码
}
catchException e)
{
    //此处是如果发生异常的处理代码
}
finally
{
    //此处是肯定被执行的代码
}

可能会中断finally语句的情况

  1. finally语句中本身就产生异常
  2. 执行finally语句的线程死亡
  3. 执行到finally语句时停电

1.4 异常处理注意点

try…catch…finally语句
1. try后面必须有catch语句或者finally语句,否则程序不能通过编译
2. try…catch…finally语句之间不能有其他语句执行

2.异常的分类

这里写图片描述

这里写图片描述

补充:
捕获异常
通常是由外部因素造成的,不是由程序造成的。例如连接网络等操作,这些是和很多因素有关系,可能并不是程序的错误。虽然这些错误并不是程序的错误,但也是必须要进行处理的。

未捕获异常
1. 包括Error类以及它的直接子类和间接子类
RuntimeException类以及它的直接子类和间接子类

  1. Error类通常由硬件运行错误所导致的错误
    RuntimeException类通常是程序运行时引起的异常

3.抛出异常

3.1

定义:
当一个程序段发生异常时,如果自己不能够进行异常处理,就可以抛出异常给上一层。如果上一层也不能解决就可以一直向上抛出异常,直到抛出给main方法。如果仍然不能解决,就会中断程序,将异常显示出来。

public class YiChang3
{
    public static void main(String args[])
    {
        YiChang3 yc=new YiChang3();
        yc.a();
    }
    //在a方法中进行异常处理
    public void a()
    {
        try
        {
            b();
        }
        catch(Exception e)
        {
            System.out.println("在该处进行异常处理");
        }
    }
    //该方法没有进行异常处理,抛出异常给a方法
    public void b()
    {
        c();
    }
    //该方法没有进行异常处理,抛出异常给b方法
    public void c()
    {
        int[] a=new int[5];
        a[5]=6;
    }
}

运行结果:
    在该处进行异常处理

分析:
    说明该程序进行了try..catch语句的异常处理,使程序能正常运行。

3.2 使用throws和throw语句抛出异常

throws语句是在方法的声明中使用抛出异常,而throw语句是在方法体内使用抛出异常。

import java.net.*;
public class YiChange32
{
    //在main方法中使用throws语句声明该方法抛出IOException异常
    public static void main(String args[])throws IOException
    {
        try
        {
            //可能出现捕获异常的语句
            ServerSocket s=new ServerSocket(8080);
        }
        catch(IOException e)
        {
            //使用throw语句抛出该IOEexception异常
            throw e;
        }   
    }
}
运行结果:
    正常运行
分析:
    使用throw语句抛出catch IOException异常,并在main方法中使用throws语句声明该方法抛出IOException异常

4.自定义异常

4.1 创建和使用自定义异常类

创建自定义异常类需要继承Exception类。在class自定义的异常类中通过
具有一个无参构造器和一个带有字符串参数的有参构造器。定义异常类通
常充当捕获异常的角色,所以需要从Exception类或者其他的类继承,它
的基本格式如下

class 类名 extends Exception
{
    类体
}

以下演示一个最简单的自定义异常类

class MyException extends Exception
{
    public MyException()
    {
    }
    public MyException(String s)
    {
        super(s);
    }
}


代码解析:
在该自定义异常类中定义了一个无参构造器和一个需要字符串类型的有参构造器,自定义的类继承Exception类,这是一个最简单的自定义异常类。


Tips:
在自定义的异常类中继承Exception类可以拥有以下方法
printStackTrace:可以显示异常调用栈的信息
getMessage: 可以得到异常对象的字符串表示
toString: 可以得到异常对象中携带的出错信息

以下是一个使用自定义异常类的程序


public class YiChang
{
    public static void main(String args[])
    {
        MyException me = new MyException("自定义异常类");
        System.out.println("自定义异常对象携带的错误信息为: "+me.getMessage());
        System.out.println("自定义异常的字符串表示为: "+me.toString()); 
    }
}

4.2 自定义异常的实际应用

例子
在百分制的考试当中,0到100的得分都是可能发生的,但是超出这个范围,则肯定是发生了错误。这里就可以使用自定义异常。

以下一个在实际应用中使用自定义异常的程序

public class YiChang
{
    public String deiFen(int fen)throws MyException
    {
        if(fen>=0&&fen<=100)
        {
            return "正常";
        }
        else
        {
            throw new MyException("错误输入");
        }
    }
    public static void main(String args[])
    {
        YiChang yc = new YiChang();
        try
        {
            String s = yc.deiFen(68);
            System.out.println(s);
            String ss = yc.deiFen(123);
            System.out.println(ss);
        }
        catch(MyException e)
        {
            System.out.println("异常信息为: "+e.getMessage());
        }
    }
}


——- android培训java培训、期待与您交流! ———-

「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 笔记本的散热风扇管理 ---------------------------------------- 09 November 2006. 对于版本20061109的变更概述如下: 1) ACPI CA核心子系统:在源操作数是一个操作区域的场景下,对负载ASL操作符进行了优化。仅需映射操作区域内存,而不是执行逐字节读取。 (区域必须为SystemMemory类型,见下文。)修正了源操作数为区域字段的负载ASL操作符问题。也允许缓冲区对象作为源操作数。 BZ 480 解决了负载ASL操作符允许源操作数为任意类型操作区域的问题。现被限制为仅SystemMemory类型的区域,符合ACPI规范。 BZ 481 对新表管理器代码进行了额外的清理和优化。AcpiEnable将在所有必需的ACPI表未加载时失败(FADT, FACS, DSDT)。 BZ 477 在acobject.h中添加了#pragma pack(8/4),以确保此头文件中的结构始终编译为对齐。ACPI_OPERAND_OBJECT已被手动优化为对齐,并在字节打包时无法工作。示例代码和数据大小:这些是Microsoft Visual C++ 6.0 32位编译器生成的、与操作系统无关的acpica.lib的大小。调试版本的代码包含调试输出跟踪机制,具有更大的代码和数据大小。上一个版本:非调试版本:78.1K代码,17.1K数据,95.2K总计 调试版本:155.4K代码,63.1K数据,218.5K总计 当前版本:非调试版本:77.9K代码,17.0K数据,94.9K总计 调试版本:155.2K代码,63.1K数据,...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值