Java异常

Java异常

1.Java异常类

超类Throwable被Error(错误)类和Exception(异常)类继承。

Throwable
常用方法:

//1.返回异常发生时的详细信息(简略描述信息)
public string getMessage();
//空指针异常

//2.返回异常发生时的简要描述(异常类和简略描述信息)
public string toString(); 
//java.lang.NullPointerException: 空指针异常

//3.在控制台上打印Throwable对象封装的异常信息(详细信息)
public void printStackTrace();
//java.lang.NullPointerException: 空指针异常
//at com.cwstd.exception.ExceptionTest.getnum(ExceptionTest.java:10)
//at com.cwstd.exception.ExceptionTest.main(ExceptionTest.java:17)


Error:无法通过程序进行纠正,必须通过修改源码解决错误。
Exception:异常后可以通过代码进行纠正,使程序能够继续运行。
注意:Exception有一个子类 RuntimeException或者RuntimeException的子类,指的是程序运行期的异常,可以不进行处理,默认可以交给JVM处理,其他编译期的异常类,需要进行处理(抛出异常交给方法调用者处理或者自己捕获异常

2.Throw关键字

Throw关键字:在指定方法中抛出指定异常(根据实际情况选择异常类,如果Java没有自带该异常类可以自定义)
写法: throw new xxxException("异常产生的原因");
getNum方法
创建一个返回数组指定位置元素的类,如果传入数组为null,抛出空指针异常

public static int getNum(int[]arr,int index)
    {
        if(arr==null)
        {
            throw new NullPointerException("空指针异常");
        }
        return arr[index];
    }
 public static void main(String[] args) {
        int [] arr=null;
        getNum(arr,0);
    }

因为 NullPointerException是运行期异常,所以不需要继续抛出异常或者捕获异常,默认交给JVM处理。

3.处理异常的两种方法

3.1抛出异常

不处理异常,把异常抛给调用方法者

public static void openFile(String path) throws FileNotFoundException {//抛出异常调用该方法的main方法
        if(!path.equals("C://123.txt"))
        {
            throw new FileNotFoundException();
        }
    }
    public static void main(String[] args) throws Exception  {//抛出异常给JVM
        int [] arr=null;
        openFile("D://123.txt");
    }

FileNotFoundException()是编译期异常,所以必须要抛出异常或者捕获。
注意

  • throws必须写在声明处
  • throws必须是Exception或者Exception的子类
  • 如果抛出的多个异常,他们是子类和父类的关系,可以只用抛出父类

3.2捕获异常

写法:

try{
            可能产生异常的代码
        }catch (定义异常类变量,接收抛出的异常类){
            处理异常代码,通常把异常写入到日志
        }
        finally{
            不管是否有异常都会执行的代码,通常做资源的释放
        }

注意:

  • try中可以抛出多个异常,可以使用多个catch进行捕获
  • try中如果抛出父类和子类异常,子类异常要先catch,不然都会被父类捕获报错,或者只写一个父类捕获

4.子父类的异常

父类异常是什么样,子类异常就是什么样

  • 子类重写父类的方法时候,抛出异常可以是父类异常的子类,或者不抛出异常
  • 父类没有异常,子类也不能有,如果方法内有,只能用try...catch捕获

5.自定义异常

自定义 SumException
判断两数的和是否正确,不正确抛出异常

package com.cwstd.exception;

public class SumException extends Exception{
    /**
     * 空参构造方法
     */
    public SumException()
    {

    }

    /**
     * 带异常信息,交给父类处理
     * @param s
     */
    public SumException(String s)
    {
        super(s);
    }

}

mian方法

    public static void sumTest(int a,int b,int sum) throws SumException {
        if(a+b!=sum)
        {
            throw new SumException("和错误");
        }
    }
    public static void main(String[] args) throws Exception  {

        sumTest(1,2,1);

    }
    

输出:Exception in thread "main" com.cwstd.exception.SumException: 和错误
at com.cwstd.exception.ExceptionTest.sumTest(ExceptionTest.java:25)
at com.cwstd.exception.ExceptionTest.main(ExceptionTest.java:30)

6.异常处理流程总结

原文地址:https://www.cnblogs.com/cwstd/p/14742574.html