Java中的异常

一、异常的概念

异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

程序运行--->异常--->程序中断运行

二、异常处理

Java编程语言使用异常处理机制为程序提供了错误处理的能力

程序中预先设置好对付异常的处理方法--->程序运行--->异常--->对异常进行处理--->处理完毕,程序继续运行

三、异常处理方法

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

捕获异常声明异常抛出异常
try--->执行可能产生异常的代码throwsthrow
catch--->捕获异常声明方法可能要抛出的各种异常手动抛出异常
finally--->无论是否发生异常,代码总能执行

四、try-catch

使用try-catch块捕获异常,分为三种情况:

1、正常

public void method() {
         try {
                 // 代码段(此处不会产生异常)
         } catch (异常类型 e) {
                 // 对异常进行处理的代码段
         }
         // 代码段

2、出现异常

public void method() {
         try {
                // 代码段 1
                // 产生异常的代码段 2
                // 代码段 3
         } catch (异常类型 e) {
                // 对异常进行处理的代码段4
         }
         // 代码段5

异常是一种特殊的对象,类型为java.lang.Exception或其子类

try---发生异常--->产生异常对象--->异常类型匹配---进入catch块--->catch---程序继续执行--->try-catch后的代码段

3、异常类型不匹配

public void method() {
        try {
                // 代码段 1
                // 产生异常的代码段 2
                // 代码段 3
        } catch (异常类型 e) {
                // 对异常进行处理的代码段4
        }
        // 代码段5

try---发生异常--->产生异常对象--->异常类型不匹配--->程序中断运行

说明:

1)在catch块中处理了异常

加入用户自定义处理信息

 System.err.println("出现错误:被除数和除数必须是整数"); // 输出结果是红色字体

2)调用方法输出异常信息  

catch(Exception e) {
    e.printStackTrace();
}
    // 当try语句中出现异常时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e初始化,也就是实例化Exception类型的对象。e是此对象引用名称,然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace();
    // printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因 

3)异常对象常用方法

方法说明
void printStackTrace()输出异常的堆栈信息
String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分

五、常见的异常类型

异常类型说明
Exception异常层次结构的父类
ArithmeticException算术错误情形,如以零作被除数
ArrayIndexOutOfBoundsException数组下标越界
NullPointerException尝试访问 null 对象成员
ClassNotFoundException不能加载所需的类
IllegalArgumentException方法接收到非法参数
ClassCastException对象强制类型转换出错
NumberFormatException数字格式转换异常,如把"abc"转换成数字

package javaobjectdemo0123.demo01;

public class Demo01 {

    public static void main(String[] args) {

        try {
            int a = 5;
            int b = 0;
            int result = a / b;
            System.out.println(result);
        } catch (RuntimeException e) {
            System.out.println("程序以零作被除数"); // 程序以零作被除数
        }

        try {
            int[] nums = new int[3];
            System.out.println(nums[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("程序数组下标越界"); // 程序数组下标越界
        }

        try {
            String str = null;
            System.out.println(str.length());
        } catch (NullPointerException e) {
            System.out.println("程序发生空指针异常"); // 程序发生空指针异常
        }

        try {
            // 尝试加载类的代码
            // static Class<?> forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象 
            Class.forName("com.example.MyClass");
        } catch (ClassNotFoundException e) {
            // 处理ClassNotFoundException异常的代码
            System.out.println("程序不能加载所需的类"); // 程序不能加载所需的类
        }
        
        System.out.println("------ ------ ------")
            
        public class Demo02 {

        public void doSomething(int value) {
            try {
                if (value < 0 || value > 100) {
                    throw new IllegalArgumentException("参数value的取值范围必须在[0, 100]之间");
                }
                // 其他业务逻辑
            } catch (IllegalArgumentException e) {
                // 异常处理代码
                System.out.println("程序调用方法传参错误");
            }
        }

}

        Demo02 demo02 = new Demo02();
        demo02.doSomething(101); // 程序调用方法传参错误


        try {
            String numString = "abc";
            // static int parseInt(String s)将字符串参数作为有符号的十进制整数进行解析
            System.out.println(Integer.parseInt(numString));
        } catch (NumberFormatException e) {
            System.out.println("程序数字格式转换异常"); // 程序数字格式转换异常
        }

        /*
        * 在实际开发中,可能会抛出很多种不同类型的运行时异常,我们可以将它们的父类设为RuntimeException,这样就可以在catch块中捕获并处理这些异常
        * */
    }
}

 

package javaobjectdemo0123.demo02;

public class Pet {

    public String name;

    public Pet() {
    }

    public Pet(String name) {
        this.name = name;
    }

    public void info() {
        System.out.println("我的名字是:" + this.name);
    }

}

package javaobjectdemo0123.demo02;

public class Dog extends Pet{

    // 子类中特有的属性
    public String strain; // 品种

    public Dog() {
    }

    public Dog(String name, String strain) {
        super(name);
        this.strain = strain;
    }

    @Override
    public void info() {
        super.info();
        System.out.println("我的品种是:" + strain);
    }

    // 子类中特有的方法
    public void shout() {
        System.out.println("拆家旺旺");
    }

}

package javaobjectdemo0123.demo02;

public class Cat extends Pet{

    // 定义子类中特有的属性
    public String color; // 颜色

    public Cat() {
    }

    public Cat(String name, String color) {
        super(name);
        this.color = color;
    }
}

package javaobjectdemo0123.demo02;

public class Test {

    public static void main(String[] args) {

        // 向上转型
        Pet pet1 = new Dog("壮实","萨摩耶");
        pet1.info();
        System.out.println("------");
        // 向下转型
        Dog dog1 = (Dog) pet1;
        dog1.shout();

        System.out.println("------ ------ ------");

        Pet pet2 = new Cat("蓝莓","蓝灰色");
        pet2.info();
        System.out.println("------");
        try {
            // 向下转型报错
            Dog dog2 = (Dog) pet2; // pet2向上转型类型为Cat类
        } catch (ClassCastException e) {
            System.out.println("程序强制转换类型错误"); // 程序强制转换类型错误
        }

    }
}

 

六、try-catch-finally

1、在try-catch块后加入finally块

1)是否发生异常都执行

2)不执行的唯一情况

 System.exit(1);

try块---有异常--->catch块(System.exit(1))--->finally块

try块---无异常,中断程序,退出Java虚拟机--->finally块

2、存在return的try-catch-finally块

public void method(){
         try {
               // 代码段1
               // 产生异常的代码段2
          } catch (异常类型 ex) {
               // 对异常进行处理的代码段3
               return;
          }finally{
               // 代码段4
          }

try---发生异常--->产生异常对象--->异常类型匹配---进入catch块--->catch(return)--->执行finally--->执行return退出方法

七、多重catch块

引发多种类型的异常

1)排列catch语句的顺序:先子类后父类

2)发生异常时按顺序逐个匹配

3)只执行第一个与异常类型匹配的catch语句

八、小结

1、try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一

2、try-catch块中存在return语句,是否还执行finally块?如果执行,说出执行顺序

3、try-catch- finally块中, finally块唯一不执行的情况是什么?

存在结束虚拟机语句

九、声明异常

如果在一个方法体中抛出了异常,如何通知调用者?

throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开

1)方式1:调用者处理异常

2)方式2:调用者继续声明异常

main()方法声明的异常由Java虚拟机处理

十、抛出异常

除了系统自动抛出异常外,有些问题需要程序员自行抛出异常

1)使用throw抛出异常

2)throw与throws

throwthrows
生成并抛出异常声明方法内抛出了异常
位于方法体内部,可作为单独语句使用必须跟在方法参数列表后面,不能单独使用
抛出一个异常对象,且只能是一个声明抛出异常类型,可以跟多个异常

/*
在 Java 中,当前执行的语句必属于某个方法。Java 解释器调用 main 方法开始执行一个程序。每个方法都必须声明它可能抛出的必检异常的类型。这称为声明异常只对编译时异常进行声明,告知方法的调用者有异常。为了在方法中声明一个异常,就要在方法头中使用关键字 throws
*/
public void myMethodO throws IOException
/*
关键字 throws 表明 myMethod 方法可齙会抛出异常 IOException。如果方法可能会抛出多个异常,就可以在关键字 throws 后添加一个用逗号分隔的异常列表
*/
public void myMethodO throws Exceptionl, Exception2,… ,ExceptionN
    // 注意:如果方法没有在父类中声明异常,那么就不能在子类中对其进行继承来声明异常

    
package com.learn.demo02;

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


public class Demo01 {

    // throws是声明异常,必须写在方法的参数列表后,可以写多个异常对象,多个异常对象之间使用逗号隔开
    public static void main(String[] args) throws FileNotFoundException {

        // 调用一个可成产生异常的方法,调用者使用try-catch来处理可能产生的异常
        // try {
        // InputStream inputStream = new FileInputStream("F:/a.txt");
        // } catch (FileNotFoundException e) {
            // throw是抛出异常,写在方法体内部,一次只能抛出一个异常,可以单独写语句
        // throw new RuntimeException(e);
        // }

        // 调用一个可能产生异常的方法,调用者不处理,将异常继续向上声明,-
        InputStream inputStream = new FileInputStream("F:/a.txt");
    }
}

 

十一、异常处理原则

1、异常处理与性能

2、异常只能用于非正常情况

3、不要将过于庞大的代码块放在try中

4、在catch中指定具体的异常类型

5、需要对捕获的异常做处理

 

 

 

 

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java异常机制是一种用于处理程序执行期间可能出现的错误情况的机制。Java异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。其,受检异常必须在代码进行捕获和处理,否则编译器将会报错。而非受检异常则不需要在代码进行捕获和处理,但是如果不进行处理,会导致程序的异常终止。 Java异常机制通过抛出异常对象来表示程序出现的异常情况,通常情况下,异常对象包含了异常的类型、异常的消息以及异常发生的位置等信息。当程序执行过程出现异常情况时,就会抛出相应的异常对象,这个异常对象会被传递给调用栈上的上层方法,直到被捕获或者到达程序的顶层方法。 Java异常机制主要由三个关键字来实现:try、catch和finally。try块包含可能抛出异常的代码,catch块用于捕获并处理异常,finally块则用于执行一些必须要完成的代码,无论是否抛出异常都会执行。 下面是一个简单的Java异常处理的例子: ``` public class ExceptionDemo { public static void main(String[] args) { try { int num = Integer.parseInt(args[0]); System.out.println("10 / " + num + " = " + (10 / num)); } catch (ArithmeticException e) { System.out.println("除数不能为0"); } catch (NumberFormatException e) { System.out.println("请输入数字"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("请至少输入一个参数"); } finally { System.out.println("程序执行完毕"); } } } ``` 在这个例子,我们使用了try-catch-finally关键字来处理用户输入的参数,当输入参数不满足条件时,就会抛出相应的异常。catch块用于捕获并处理异常,finally块则用于执行一些必须要完成的代码,无论是否抛出异常都会执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值