异常

一、异常:就是程序出现不正常的情况。

Throwable Error
Exception RuntimeException
非RuntimeException
  1. Error:严重问题,不处理
  2. Exception:异常类,程序本身可以处理
    • RuntimeException:编译期间不检查,程序出现问题再修改代码
    • 非RuntimeException:编译期间处理,否则程序不能通过编译,更不能运行

二、异常处理方案:

1. try...catch...
2. throws

1. try...catch...

//系统默认处理异常方式
   public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("开始");
        method();
        System.out.println("结束");
    }
    public static  void method (){
        int[] arr = {1,2,3};
        System.out.println(arr[3]);
    }
}

运行结果:当出现异常时,程序不能继续往下执行

开始
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:17)
at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)
//try...catch..处理异常
public class ExceptionDemo {
 public static void main(String[] args) {
     System.out.println("开始");
     method();
     System.out.println("结束");
 }
 public static  void method (){
     int[] arr = {1,2,3};
     try {
         System.out.println(arr[3]);
     } catch (ArrayIndexOutOfBoundsException e) {
         e.printStackTrace();
     }
 }
}

运行结果:当出现异常时,程序能继续往下执行

开始
结束
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:18)
	at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)

2. Throwable:所有异常的父类,包含的一些方法

public String getMessage()		返回异常信息
public String toString()		返回可抛出的简短说明
public void printStackTrace()	打印详细异常信息
public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("开始");
        method();
        System.out.println("结束");
    }
    public static  void method (){
        int[] arr = {1,2,3};
        try {
            System.out.println(arr[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            //e.printStackTrace();
            //返回异常信息
            System.out.println("异常信息:"+e.getMessage());
            //返回可抛出的简短说明
            System.out.println("简短说明:"+e.toString());
            //打印详细异常信息
            e.printStackTrace();
        }
    }
}

运行结果:

开始
异常信息:Index 3 out of bounds for length 3
简短说明:java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
结束
//详细异常信息
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at com.chawaner.test2.ExceptionDemo.method(ExceptionDemo.java:18)
	at com.chawaner.test2.ExceptionDemo.main(ExceptionDemo.java:11)

3. 编译时异常和运行时异常的区别
运行时异常:

public class ExceptionDemo1 {
    public static void main(String[] args) {
        method();
    }
    public static void method (){
        int[] arr = {1,2,3};
        //这个索引越界了,但是写代码时没有报错,运行的时候才报错
        //所以,这是个运行时异常
        System.out.println(arr[3]);
    }
}

运行结果:ArrayIndexOutOfBoundsException

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at com.chawaner.test2.ExceptionDemo1.method(ExceptionDemo1.java:17)
	at com.chawaner.test2.ExceptionDemo1.main(ExceptionDemo1.java:10)

编译时异常:不一定会出问题,但有可能会出问题
Java异常
4. throws
有时候异常能够用try...catch...处理,有时候可能出现的异常是我们处理不了的,这个时候用throws解决。

在方法括号后跟上throws 异常类名
Java异常
运行结果:throws可以解决编译时异常那个红色波浪线的提示。

Wed Nov 09 00:00:00 CST 2022

Java异常
运行结果:运行时异常用throws解决不了,只是抛出异常。还得用try...catch...处理,才能在提示报错后,继续执行后面的程序。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at com.chawaner.test2.ExceptionDemo1.method(ExceptionDemo1.java:24)
	at com.chawaner.test2.ExceptionDemo1.main(ExceptionDemo1.java:14)

Java异常
总结:

  • 运行时异常用try...catch...
  • 编译时异常用throws或者try...catch...
  • try...catch...是有显示处理的,就是用try...catch...你可以自己处理异常
  • throws是抛出异常,控制台显示的是系统给的异常结果

自定义异常

写一个类,让类继承Exception

//自己写的JException异常类
public class JException extends Exception{
    public JException() {
    }
    public JException(String message) {
        super(message);
    }
}
/*
	IntNumber类,里面有个检查数字范围的方法checkNum(int i)
	checkNum(int i)方法是由JException抛出的
	JException抛出的异常结果显示为:输入的数字有误,范围应为:0-100
*/
public class IntNumber {
    public void checkNum(int i) throws JException{
        if (i < 0 || i > 100) {
            //抛出异常,并显示自己写的异常结果信息
            throw new JException("输入的数字有误,范围应为:0-100");
        }else {
            System.out.println("正常");
        }
    }
}
//测试类:输入数字,并检查数字的范围
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int i = sc.nextInt();
        IntNumber in = new IntNumber();
        try {
            //编译时异常
            in.checkNum(i);
        } catch (JException e) {
            e.printStackTrace();
        }
    }
}
//运行结果:控制台显示了自定义异常类JException
//以及自己处理的异常显示结果:输入的数字有误,范围应为:0-100
请输入一个数字:
120
com.chawaner.test3.JException: 输入的数字有误,范围应为:0-100
	at com.chawaner.test3.IntNumber.checkNum(IntNumber.java:12)
	at com.chawaner.test3.Test.main(Test.java:18)

throws和throw的区别

throws throw
用在方法声明后,后面跟异常类名 用在方法体内,后面跟异常对象
抛出异常,由方法调用者处理 抛出异常,由方法内的语句处理
表示可能发生异常,但不一定会发生 执行throw时,一定抛出了异常
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。