【Java零基础入门篇】第 ⑥ 期 - 异常处理

简介: Java零基础入门

博主:命运之光
专栏:JAVA入门

JAVA.gif

学习目标

掌握异常的概念,Java中的常见异常类;

掌握Java中如何捕获和处理异常;

掌握自定义异常类及其使用;


异常概述

程序员在写代码的时候即便写的尽善尽美,在系统的运行过程中依据会遇到一些问题,因为很多问题不是靠代码能够避免的。

异常体系

🍓🍓异常是处理运行时错误的特殊类,所有异常类都是java.lang.Throwable的子类,Throwable 类是类库java.Lang 包中的一个类,它派生了两个子类:ExceptionError

  • Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。必须修改代码,程序才可以继续执行。
  • Exception其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问、试图读取不存在的文件、网络连接中断、数组下标越界等。

Exception分为:运行时异常(非受检异常)编译时异常(受检异常)

编译时异常:类型上都属于Exception类及其子类。编译时为了保证程序的健壮性 ,可以提前预料到的异常,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过

运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,也会编译通过。

常见的异常

1.ArithmeticException 异常

算术运算异常,当除数为零时就会产生此类异常。

例如:int  x=2/0;              //此时会发生ArithmeticException异常

2.ArrayIndexOutOfBoundsException异常

访问数组元素的下标越界异常,当访问的数组元素的下标超过数组的上下界时发生此类异常。

例如:   int a[]=new int[3]; //定义了数组a,下标从0到2是合法的 int x=a[3]; //下标超过上界,此时会发生ArrayIndexOutOfBoundsException异常

3.ArrayStoreException异常

数组存储异常,当数组存储空间不够或类型不匹配时会产生此类异常。

例如:   int a[]=new int[5];   String b=new String[5];   String.arraryCopy(a,b);       //类型不匹配会产生ArrayStoreException异常

4. NegativeArraySizeException异常

负值数组大小异常,当数组的存储单元个数为负数时会产生此类异常。例如:   int a[]=new int[-5];                     //数组个数大小为负数,发生NegativeArraySizeException异常。

5.IndexOutOfBoundsException异常

索引(下标)越界异常,是ArrayIndexOutOfBoundsException的父类。例如:   String s=”abc123”;   s.charAt(8);      // 下标8越界,发生IndexOutOfBoundsException异常

6.NullPointerException异常

访问空引用(指针)异常。例如:   String s=null;   s.charAt(2);                    //s为null,发生NullPointerException异常

7.  NumberFormatException异常

数值格式异常,当数据类型格式转换不匹配时会产生此类异常。

8.  ClassCaseException异常

类强制转换异常,当把一个类强制转换成另一个没有任何继承关系的类时产生此类异常。

9. StringIndexOutOfBoundsException异常

字符串下标越界异常。

10. SecurityException异常

安全性异常。

Java的异常处理机制

🍓🍓在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时,要检测分母为0,数据为空,输入的不是数据而是字符等。

🍓🍓Java中针对各种运行错误定义了很多异常类每个异常类都代表了一种运行错误。每当java程序运行过程中某段代码发生一个可识别的运行错误时,JVM都会产生一个相应的异常类的对象对象封装了异常的有关信息

Java提供的异常处理机制是采取抛出异常,然后捕获异常的处理形式,主要分为两个步骤:

  • 抛出异常:在程序运行中当语义规则被违反时,在异常代码处即产生一个异常事件,生成一个对应异常类的对象,将此对象抛出(throw) ,其后的代码不再处理。
  • 捕获异常:如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常

如果一个异常回到main()方法,并且main()也不处理,则程序运行终止;

程序员通常只能处理Exception,而对Error无能为力.

方式一:try – catch - finally

语法格式:

try {   
// 有可能出现异常的语句} catch (异常类型1对象) {  
// 异常处理 ;} catch (异常类型2对象) { 
// 异常处理 ;} catch (异常类型3对象) {  
// 异常处理 ;} .... 
finally {     
//不管是否出现异常,都执行的统一代码}

🍓🍓例1:直接使用对应异常类作为参数(try – catch - finally)。

publicclasstext1 {
publicstaticvoidmain(Stringargs[]) {
System.out.println("1、除法计算开始。");
try {
System.out.println("2、除法计算:"+ (10/0));   // 此处产生异常// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行System.out.println("异常产生后的语句");
        } catch (ArithmeticExceptione) {  // 处理算术异常System.out.println("******** 出现异常了 *********");
        }
System.out.println("3、除法计算结束。");
    }
}

说明:

  • try: 捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现异常的代码 放在try语句块中,一旦出现异常,就会生成一个对应异常类的对象;
  • catch (Exceptiontype e): catch语句块中是对异常对象进行处理的代码。每个try 语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
  • 如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类作为catch的参数。
  • 比 如 : 可以用 ArithmeticException 类(子类)作为参数的地方,就可以用 RuntimeException类(父类)作为参数,或者用所有异常的父类Exception类作为参数。

🍓🍓例2:使用异常类对应的父类作为参数(try – catch - finally)。

publicclasstext1 {
publicstaticvoidmain(Stringargs[]) {
System.out.println("1、除法计算开始。");
try {
System.out.println("2、除法计算:"+ (10/0));   // 此处产生异常// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行System.out.println("异常产生后的语句");
        } catch (RuntimeExceptione) {  // 处理算术异常System.out.println("******** 出现异常了 *********");
        }
System.out.println("3、除法计算结束。");
    }
}

注意:

  • 一旦try中的异常对象匹配到某一个catch时,进入catch中进行异常的处理,一旦处理完成,跳出try-catch结构(没写finally的情况),继续执行其它代码;
  • finally: 捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。
  • 不论在try代码块中是否发生了异常事件,catch语句是否执行,catch语句是否有异常,catch语句中是否有return,finally块中的语句都会被执行。
  • finally语句和catch语句是任选的。
  • 🍓catch中的异常类型如果没有子父类关系,则声明顺序没有要求,谁在上均可。
  • 🍓catch中的异常类型如果有子父类关系,则子类声明必须在父类声明之上否则报错

捕获异常的有关信息:    

与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法

  • getMessage() :获取异常说明信息,返回字符串
  • printStackTrace() :输出异常类名和异常信息,以及异常出现在程序中的位置。返回值void

🍓🍓例3:输出异常完整信息。

publicclasstext1 {
publicstaticvoidmain(Stringargs[]) {
System.out.println("1、除法计算开始。");
try {
System.out.println("2、除法计算:"+ (10/0));// 此处产生异常// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行System.out.println("若前面代码出现异常,此行代码不会执行!");
        } catch (ArithmeticExceptione) {   // 处理算术异常e.printStackTrace();    // 输出异常的完整信息        } finally {
System.out.println("### 不管是否出现异常我都执行!") ;
        }
System.out.println("3、除法计算结束。");
    }
}

方式二:throws+异常类型

🍓🍓Java中允许在方法的后面使用throws关键字对外声明该方法有可能发生的异常,但此方法中不处理异常。

🍓🍓这样调用者在调用方法时,就明确地知道该方法可能有异常,并且必须在程序中对异常进行处理,否则编译无法通过。

throws关键字声明抛出异常的语法格式如下:

修饰符返回值类型方法名(参数列表)throws异常类型列表{
………}

🍓🍓例:class  MyMath

声明如下方法可能会抛出一个ArithmeticExcption或IOException类型的异常,使它的调用者知道要捕获这个异常。

classMyMath { 
publicstaticintdiv(intx, inty) throwsArithmeticException, IOException {             
// 此方法不处理异常     returnx/y;   
}
}

🍓“throws + 异常类型”写在方法声明处,指明此方法执行时,可能会抛出的异常类型,一旦方法体执行时,出现异常,仍会在代码处生成一个异常的对象。此对象满足throws后的异常类型时,该对象就会被抛出。

🍓主方法也可以使用throws抛出异常,这时主方法里可以不用强制进行异常处理,而是将异常处理交给JVM进行默认处理,此时会导致程序中断。(不建议使用

手动抛出异常

🍓🍓Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要使用人工创建并抛出

手动创建并抛出异常,通过throw关键字。

throw语句用来直接抛出一个异常,后接一个可抛出的异常类对象

格式如下:

thrownew异常类名(【参数列表】)

异常类名对象名=new异常类名(【参数列表】)throw对象名;


例如:首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)

IOExceptione=newIOException( ); 
throwe;

或:  

thrownewIOException();

说明:

  • 可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:throw new String("want to throw");

重写方法声明抛出异常的原则

  • 一个方法被覆盖时,覆盖它的方法必须抛出跟被覆盖的方法相同的异常或者异常的子类,或者不抛出异常;
  • 如果父类抛出多个异常,那么重写(覆盖)的方法必须抛出那些异常的一个子集,也就是说不能抛出新的异常。

throws和throw的区别:

  • 首先throws出现在方法函数头(声明处),表示若抛出异常,由该方法的调用者来处理;
  • throw出现在函数体,表示在方法中手工抛出一个异常。

自定义异常

🍓🍓创建用户定义的异常类,可通过扩充(继承)Exception类创建自己的异常类,被扩充的异常类继承Exception类的属性和方法,具有异常类全部特性,同时也和任何其他类一样,可以有数据成员、构造方法及其他功能性的成员方法

自定义异常类后,创建异常类对象,最后再使用throw语句抛出该异常对象,在调用点添加异常处理语句即可。

自定义异常步骤

第1步:自定义异常类。例如:

classMyExceptionextendsException {   
……}

第2步:定义异常对象,并抛出该对象。

式1:

thrownewMyException ( );

方式2:

MyExceptione=newMyException( );       
throwe;

相关文章
|
14天前
|
Java 编译器
探索Java中的异常处理机制
【10月更文挑战第35天】在Java的世界中,异常是程序运行过程中不可避免的一部分。本文将通过通俗易懂的语言和生动的比喻,带你了解Java中的异常处理机制,包括异常的类型、如何捕获和处理异常,以及如何在代码中有效地利用异常处理来提升程序的健壮性。让我们一起走进Java的异常世界,学习如何优雅地面对和解决问题吧!
|
2天前
|
安全 Java 程序员
Java中的异常处理:从新手到专家
在Java编程的世界里,异常处理是每个开发者必须面对的挑战。本文将带你从基础的异常概念出发,逐步深入到高级处理技巧,让你在遇到代码中的“意外”时,能够从容应对,甚至化险为夷。
|
7天前
|
Java 数据库连接 开发者
Java中的异常处理:从基础到高级
【10月更文挑战第42天】在Java的世界中,异常处理是维护程序稳定性和健壮性的关键。本文将带你深入了解Java的异常处理机制,从基本的try-catch语句出发,逐步探索更复杂的异常处理策略。我们将通过实际代码示例来演示如何捕获和处理异常,以及如何自定义异常类型来满足特定需求。无论你是Java新手还是有经验的开发者,这篇文章都将帮助你更好地理解和应用Java的异常处理。
|
14天前
|
Java 开发者
Java中的异常处理:从基础到高级
【10月更文挑战第35天】在Java的世界里,异常处理是维护程序健壮性的关键。本文将深入浅出地探讨Java的异常处理机制,从基本的try-catch语句到自定义异常类的实现,带领读者理解并掌握如何在Java中优雅地处理错误和异常。我们将通过实际代码示例,展示如何捕获、处理以及预防潜在的运行时错误,确保程序即使在面临意外情况时也能保持稳定运行。
31 7
|
11天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
13天前
|
Java 数据库连接 开发者
Java中的异常处理机制及其最佳实践####
在本文中,我们将探讨Java编程语言中的异常处理机制。通过深入分析try-catch语句、throws关键字以及自定义异常的创建与使用,我们旨在揭示如何有效地管理和响应程序运行中的错误和异常情况。此外,本文还将讨论一些最佳实践,以帮助开发者编写更加健壮和易于维护的代码。 ####
|
17天前
|
Java
Java 异常处理下篇:11 个异常处理最佳实践
本文深入探讨了 Java 异常处理的最佳实践,包括早抛出晚捕获、只捕获可处理的异常、不要忽略捕获的异常、抛出具体检查性异常、正确包装自定义异常、记录或抛出异常但不同时执行、避免在 `finally` 块中抛出异常、避免使用异常进行流程控制、使用模板方法处理重复的 `try-catch`、尽量只抛出与方法相关的异常以及异常处理后清理资源。通过遵循这些实践,可以提高代码的健壮性和可维护性。
|
17天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
18天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
38 2
|
19天前
|
Java 程序员 数据库连接
深入浅出Java异常处理
【10月更文挑战第30天】在Java的世界里,异常处理就像是生活中的急救箱,遇到意外时能及时救治。本文不仅教你如何使用try-catch语句包扎“伤口”,还会深入讲解如何通过自定义异常来应对那些常见的“头疼脑热”。准备好,我们将一起探索Java异常处理的奥秘,让你的程序更加健壮。
下一篇
无影云桌面