JAVA--异常

一、Java 异常概念

异常:就是不正常,程序运行过程中出现的不正常的情况。(数组越界)

Java程序在执行过程中所发生的异常(运行时一切不正常情况)事件可分为两类

本次java异常则主要是狭义上的异常,也就是java中的Exception

(一)广义上的异常

指的是程序运行中一切不正常的情况;

Error :Java虚拟机无法解决的严重问题。如:JVM系统内部错误、内存不足等严重情况。一般不编写针对性的代码进行处理。

import java.util.ArrayList;
import java.util.Date;

public class errordemo {
    public static void main(String[] args) {
        /*
        //集合
        ArrayList arrayList  = new ArrayList();

         while (true){
             arrayList.add(new Date());
         }

         */

        //sum(50000);
        //StackOverflowError
    }
    public  static  int sum(int n){
        if(n==1){
            return 1;
        }
        return n+sum(n-1);
    }
}

(二)狭义上的异常

狭义上的异常(Exception):也是程序运行中出现了问题,但是可以通过异常处理机制代码进行解决,解决后程序可以继续向后运行.

对于一般的异常,出现后,程序会立即终止执行, 或者 实现采用异常处理机制来进行处理。


public class exceptiondemo1 {
    public static void main(String[] args) {
        //1.数组越界    ArrayIndexOutOfBoundsException
        /*
        int []a = new int[10];
        a[10]=6;

         */
        //2.数字格式化异常    NumberFormatException
        /*
        Integer.parseInt("aa");

         */

        //3.空指针异常,使用了null作为对象  NullPointerException
        /*
        String s = null;
        s.equals("");
        */
        //4.类类型转换异常  ClassCastException
        /*Object obj = "abc";
        Integer a = (Integer) obj;//"abc"不能转为Integer

         */
        //5.算数异常    ArithmeticException
        System.out.println(1/0);

        /*
        java中把语法中能够出现的问题种类,都封装成了一个个类来进行表示
                                             |<----异常的类型---->|  |<-异常原因->|
        Exception in thread "main" java.lang.ArithmeticException: / by zero
	        at com.ffyc.javaexception.exceptiondemo1.main(exceptiondemo1.java:28)
	                                                     |<-------异常位置------>|
	     //以上异常,虽然在运行期间会出现,但是编译期间并不需要强制处理-->运行时异常
            //这种在编译期间,就需要我们进行强制处理的,又是异常中的一类(检查异常,编译期间异常)
           // new SimpleDateFormat("").parse("");
            // "abc".getBytes("utf-8");
         */

    }
}

对于一般的异常,出现后,程序会立即终止执行, 或者采用异常处理机制来进行处理

分类:编译时异常和运行时异常

二、异常的体系

Throwable类有两个直接子类 Exception类、Error类

(一)Error是错误

可能是编译期出错或者系统错误,与程序无关,本章节不作介绍;

(二)Exception是异常

是所有异常类的父类,与程序息息相关,是程序员所关心的。

上面已经说过,异常分为运行期异常和编译期异常两种

编译器异常(Checked Exception):直接或间接继承Exception的类

运行期异常(RuntimeException):编写代码时,没有必要直接处理掉异常,可以做一些提示或者抛出。通常包括:

ArrayIndexOutOfBoundsException

NumberFormatException

NullPointerException

ClassCastException

ArithmeticException

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3I0WM2I-1682436836994)(C:\Users\李凯松\AppData\Roaming\Typora\typora-user-images\1682306584964.png)]

三、异常处理

(一)概括

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DrLNWKa-1682436836995)(C:\Users\李凯松\AppData\Roaming\Typora\typora-user-images\1682306663686.png)]

(二)具体实现

一般通过5个关键字来实现:

try catch finally throw throws

public class exceptiondemo4 {
    public static void main(String[] args) {
        /*
        finally {

        }
        不能单独使用,必须与try{}catch(){}一起使用或者 try{}
        try{
            可能会出异常的代码
        }catch(异常类型 引用名){
            处理办法
        }finally {
            最后一定会执行的代码
        }

        ==============

        try{

        }finally{

        }
         */
        System.out.println("begin");
        try {
            System.out.println(10/0);
        }catch(ArrayIndexOutOfBoundsException arraye){
            System.out.println("数组越界");
        }catch(ArithmeticException ae){
              System.out.println("除数为0");
        }catch (NumberFormatException ne){
            System.out.println("数字格式化异常");
        }catch (Exception e){
            System.out.println("系统繁忙");
        }finally {
            System.out.println("最后一定要执行的代码");
        }
        System.out.println("end");
    }
}

(三)解释

try 检测异常的代码(发现异常)

try{}中代码发生异常,下面的代码将不再执行,程序跳转到异常处理catch(){}块中,try {}中一般为可能会出现异常的代码

catch(){} 捕获异常类型,是程序可以继续运行紧跟try{}后面,可以有多个catch语句,分别捕获不同的异常类型,父类异常类型只能写在最后一个catch块里面,否则程序会出错。

​ getMessage() 获取异常原因,返回字符串

/ by zero

​ printStackTraace() 获取异常类名和异常信息,以及异常在程序中的 位置。返回值void

java.lang.ArithmeticException: / by zero
	at
com.ffyc.javaexception.exceptiondemo3.main(exceptiondemo3.java:22)

finally{} 为必须要执行的代码,同时也只能有一个finally{}语句

​ finally{

​ 必须执行的代码

​ }

四、throws 和 throw

(一)throws

在方法定义时,进行声明的,声明此方法可能会出现某种异常.
throw
在方法体内,用来抛出一个异常对象.

可以throws 多个异常

public void test() throws 异常1,异常2,异常3{

}

1.任何方法都可以使用throws关键字声明异常类型,包括抽象方法

2.子类重写父类中的方法,子类方法不能声明抛出比父类类型更大的异常(针对编译期异常)

3.使用了throws的方法,调用时必须处理声明的异常,要么使用try-catch,要

么继续使用throws声明。

异常处理

throw关键字用于显式抛出异常,抛出的时候是抛出的是一个异常类的实

例化对象.

在异常处理中,try语句要捕获的是一个异常对象,此异常对象也

可以自己抛出

(二)throw

写在方法体内,给定某些条件,不符合是就可以使用throw抛(语句提示)

在源码中很多都是使用throws和throw处理异常,

而我们的业务代码中,出现问题,需要try catch


public class exceptiondemo8 {
    public static void main(String[] args) {

        try {
            charAt(-1);
        }catch (StringIndexOutOfBoundsException se){
            System.out.println(se.getMessage());
        }
    }
    /*
        throw 是在方法体中,用来抛出一个异常对象的,
                        抛出后,方法相当于出现了异常
    */
    public static char charAt(int index)throws StringIndexOutOfBoundsException{
        if(index<0||index>10){
        /*
            throw new 异常类();
            在方法运行过程,当不满足某种条件时,主动的在程序抛出异常对象.
        */
            throw new StringIndexOutOfBoundsException("字符串下标越界:"+index);
        }
        return '1';

    }
}

五、自定义异常

自定义异常就是自己定义的异常类,也就是API中的标准异常类的直接或间接的

子类

java语言中提供了许许多多的异常类,都是与语法相关的.

而实际的业务开发,有时,我们也需要在某种条件下以抛出异常对象的方式进行处理.

用自定义异常标记业务逻辑的异常,避免与标准异常混淆

自定义异常类中往往不写其他方法,只重载需要使用的构造方法

继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或

throws抛出

public class TestScore {
    public static void main(String[] args) {
        try {
            pingfen(101);
        } catch (ScoreException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }

    public static char pingfen(int score) throws ScoreException {
        if(score<0|score>100){
            throw new ScoreException("分数不合法"+score);
        }
        if(score>=90&&score<=100){
            return 'A';
        }else if(score>=80&&score<=90){
            return 'B';
        }else{
            return 'C';
        }
    }
}

自定义异常类

public class ScoreException extends Exception{
    /*
    自定义的异常类
    满足适合条件时 抛出
     */
    public ScoreException() {

    }

    public ScoreException(String message) {
        super(message);
    }
}

0&&score<=90){
return ‘B’;
}else{
return ‘C’;
}
}
}


自定义异常类

```java
public class ScoreException extends Exception{
    /*
    自定义的异常类
    满足适合条件时 抛出
     */
    public ScoreException() {

    }

    public ScoreException(String message) {
        super(message);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值