【JAVA】Java 异常处理

1、什么是异常?

将程序执行中发生的不正常情况称为“异常”

2、Java程序在执行过程中所发生的异常事件可分为两类

java.lang.Error:一般不编写针对性的代码进行处理

java.lang.Exception:可以进行异常的处理

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

package com.err;

/*
 * Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源 耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性 的代码进行处理
 */
public class DemoErr {
    public static void main(String[] args) {
        // 1.java.lang.StackOverflowError 栈溢出
        // main(args);
        
        // 2.java.lang.OutOfMemoryError 堆溢出
        Integer[] array = new Integer[1024*1024*1024];
    }
}
DemoErr.java

 

 

执行结果:

 

Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使 用针对性的代码进行处理  

  编译时异常:IOException、  FileNotFoundException、  ClassNotFoundException

  运行时异常:NullPointerException、 ArrayIndexOutOfBoundsException、  ClassCastException、 NumberFormatException、 InputMismatchException

package com.err;

import java.util.Date;
import java.util.Scanner;

public class DemoRunExcept {

    // NullPointerException 空指针异常
    public void NullPointerE() {
        Integer[] array = null; // 空指针举例
        System.out.println(array[0]);
    }

    // ArrayIndexOutOfBoundsException 角标越界
    public void ArrayIndexE(){
        int[] array = new int[2]; // 数组角标越界举例
        System.out.println(array[2]);
    }

    // ClassCastException 类型转换异常
    public void ClassCastE() {
        Object obj = new Date();
        String str = (String)obj;
        System.out.println(str);
    }

    // NumberFormatException 数字转换异常
    public void NumberFormatE() {
        String num = "123a";
        int number = Integer.parseInt(num);
        System.out.println(number);
    }

    // InputMismatchException 输入不匹配
    public void InputMisE() {
        Scanner scanner = new Scanner(System.in);
        int score = scanner.nextInt(); // 键盘输入abc
        System.out.println(score);
    }

    public static void main(String[] args) {
        DemoRunExcept demoRunExcept = new DemoRunExcept();
        demoRunExcept.NullPointerE();
        demoRunExcept.ArrayIndexE();
        demoRunExcept.ClassCastE();
        demoRunExcept.NumberFormatE();
        demoRunExcept.InputMisE();


    }

}
DemoRunExcept.java

 

执行结果:

 ……

 

 3、解决异常的方法

  ① 遇到错误就终止程序 的运行

  ② 编写程序时,对错误进行处理(如:抛出提示信息等)

 

4、异常处理 

1)try-catch-finally  <真正的将异常给处理掉>

try 块:用于捕获异常 <try 后必须存在catch和finally其中之一或全部 >

catch 块:用于处理try捕获到的异常

  <catch不会被执行的情况:① try语句没有被执行; ② try语句未触发异常 ③ 异常类型不匹配 >

finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行;

  <当try块中或者catch块中遇到return语句时,先执行完finally中的代码,再执行return语句且不会执行finally后续代码>

  <finally不会被执行的情况:① try语句没有被执行; ② try内包含exit等终止程序的操作>

 语法:

try{

  // 可能出现异常的代码

  }catch(异常类型1 变量1){

  // 异常类型1处理方式

  }catch(异常类型2 变量2){

  // 异常类型2处理方式

  }

  ...

  finally{

  // 无论有无异常一定会执行的代码

  }
语法

 

 

 示例

package com.err;

public class DemoTry {

    public static void main(String[] args) {
        try{
            Integer[] array = null; // 空指针举例
            System.out.println(array[0]);
        }catch(NullPointerException npe){
            npe.printStackTrace();
            System.out.println("catch");
        }finally{
            System.out.println("over~");
        }

    }
}

 

 执行结果:  

 

 2)throw 语句抛出异常 

throw 捕获之后再抛出, 将异常抛出给调用方法,未对异常做出处理

throw要么和try-catch-finally语句配套使用,要么与throws配套使用

throw (异常对象);
语法

 

 

package com.err;

public class DemoTry {

    public void DemoThrowMethod(){
        try{
            Integer[] array = null; // 空指针举例
            System.out.println(array[0]);
        }catch(NullPointerException npe){
            throw npe;
        }finally{
            System.out.println("over~");
        }

    }
public static void main(String[] args) { DemoTry demoTry = new DemoTry(); demoTry.DemoThrowMethod(); } }

 

 执行结果:

 

3)throws 出现异常的一种可能性,并不一定会发生这些异常

throws 抛出且不处理异常 ,可以单独使用

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

 

package com.err;

import java.io.IOException;

public class DemoTry {

    public void DemoThrowsMethod() throws NullPointerException, Exception {

        Integer[] array = null; // 空指针举例
        System.out.println("throws");
        System.out.println(array[0]);
    }

    public static void main(String[] args) {
        DemoTry demoTry = new DemoTry();
        try {
            demoTry.DemoThrowsMethod();
        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }
}

 

执行结果:

 

 

4)手动抛出异常

手动的生成一个异常对象,并抛出(throw)  <仅抛出异常不进行出,所以需要捕获获取 若未捕获会出现:java: 未报告的异常错误java.lang.Exception; 必须对其进行捕获或声明以便抛出>

package com.err;

import java.io.IOException;

public class DemoTry {

    public void DemoThrowsMethod() throws NullPointerException, Exception {
        throw new Exception("自定义异常");//手动抛出异常
    }

    public static void main(String[] args) {
        DemoTry demoTry = new DemoTry();
        try {
            demoTry.DemoThrowsMethod();
        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }
}

 

执行结果

 

5)自定义异常

1、通过继承 Exception 来实现自定义异常
2、自定义异常类的类名命名为 XXXException
<class><自定义异常名><extends><Exception>{
    ……
}
语法

 

package com.err;

// 通过继承 Exception 来实现自定义异常
class MyException extends Exception {
    // 无参的默认构造方法
    public MyException(){
        super();
    }

    // 以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。
    public MyException(String s){
        super(s);
    }
}

public class DemoMyException {
    public static void main(String[] args) {
        try {
            throw new MyException("抛出自定义异常");
        } catch (MyException e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }
}

 

执行结果

 

 

 

 

 

 


 

拓展1:异常打印

try{……} catch(Exception e){……}

 

System.out.println(e):这个方法打印出异常,并且输出在哪里出现的异常;

e.printStackTrace():打印出异常,但是它还将显示出更深的调用信息

 

package com.err;

public class DemoTry {

    public void DemoThrowMethod(){
        try{
            Integer[] array = null; // 空指针举例
            System.out.println(array[0]);
        }catch (NullPointerException npe){
            System.out.println(npe);
            System.out.println("========分割线========");
            npe.printStackTrace();
        }finally{
            System.out.println("over~");
        }

    }

    public static void main(String[] args) {
        DemoTry demoTry = new DemoTry();
        demoTry.DemoThrowMethod();

    }
}
示例

 

执行结果:

 

 

参考地址:https://www.cnblogs.com/laizhenghua/articles/13054556.html

posted @ 2023-05-11 16:34  Phoenixy  阅读(27)  评论(0编辑  收藏  举报