Java异常详解

Java异常详解

文章目录


前言

开发中会遇到各种问题程序运行不下去,我们称之为异常,我们也可以不合逻辑的运行抛出异常


提示:以下是本篇文章正文内容,下面案例可供参考

一、概念

程序在运行时的时候,发生的不正常事件,就是所谓的异常。

二、异常分类

Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中。
Error:JVM、硬件、执行逻辑错误,不能手动处理。
常见错误: *Error、OutOfMemoryError等。
Exception:程序在运行和配置中产生的问题,可处理。

  • RuntimeException:运行时异常,可处理,可不处理。
  • CheckedException:检查时异常,必须处理

代码如下(示例):

/**
4 * 异常和错误的区别:
5 */
6 public class Demo {
7 public static void main(String[] args) {
8 //int[] arr = new int[3];
9 //System.out.println(arr[0]);
10 //数组越界异常,可以处理
11 //System.out.println(arr[3]);//java.lang.ArrayIndexOutOfBoundsException: 3
12
13 //错误:
14 int[] arr2 = new int[1024*1024*1024];
15
16
17 }
18 

检查异常:由编译器能够检查出来的异常。外部原因导致的异常,程序中必须处理。

  • FileNotFoundExcetpion
  • IOException
  • SQLException
    运行时异常:RuntimeException,也叫非受检异常,编译器不检查的异常。往往一些代码的逻辑问题。
  • NullPointerException
  • ArrayIndexOutOfBoundsException//数组越界
  • ArithemicException
  • ClassCastException
  • NumberFormatException

代码如下(示例):

3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.text.SimpleDateFormat;
6 import java.util.Date;
7
8 public class Demo5 {
9 public static void main(String[] args) {
10
11 int i=10;
12 int j = 0;
13 try{
14 //int div =i/j;//运行时异常,运行的过程中抛出的异常,
15 //可能抛出异常的代码
16 //System.out.println("div:"+div);
17 int k = Integer.parseInt("xxxx");
18 }catch (ArithmeticException e){
19 //异常的处理
20 //System.out.println();
21 e.printStackTrace();
22 }catch (NumberFormatException e){
23 e.printStackTrace();
24 }
25
26 System.out.println("end...........");
27
28
29 //SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
30 //sdf.parse("wowowwo");//检查异常
31
32 // File file = new File("c:\\a.jpg");
33 // FileInputStream fis = new FileInputStream(file);
34
35
36 }
37 }

三、异常产生和传递

异常产生

  • 自动抛出异常:当程序在运行时遇到不符合规范的代码或结果时,会产生异常。
  • 手动抛出异常:语法:throw new 异常类型(“实际参数”)。
  • 产生异常结果:相当于遇到 return语句,导致程序因异常而终止。

异常传递

  • 异常的传递:按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息)。
  • 受查异常:throws 声明异常,修饰在方法参数列表后端。
  • 运行时异常:因可处理可不处理,无需声明异常。

四、异常的处理

捕获异常:try,catch,finally
语法规则

try{
2 //可能产生异常的代码
3 }catch(异常类型1 e){
4 //捕获异常的处理
5 }catch(异常类型2 e){
6 //捕获异常的处理
7 }finally{
8 //无论程序是否产生异常,此处的代码一定会被执行。
9 //比如说:释放资源,删除临时文件等。。。
10 }

注意点
1.一个try可以匹配多个catch语句
2.如果try中产生了异常对象,那么会跳出try,进到相应的catch中处理异常,从上向下匹配。
3.如果是多个catch语句,那么小的异常捕获处理写前面,大的异常捕获处理写后面。
4.finally是可选的.

声明异常throws

方法级别上,向外抛出异常。
方法的声明上就要通过throws关键字声明抛出异常:

public static void test1(int i,int j)throws NullPointerException{
2
3 }
4 [修饰符1,修饰符2.。。] 返回值类型/void 方法名(参数列表) 异常的声明{
5
6 }

按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息)。
运行时异常的抛出,不一定要处理
检查异常的抛出,必须处理
Exception和RuntimeException的区别
1.RuntimeException是Exception的子类。
2.Exception包含了受检异常,所以抛出Exception以及受检异常时,代码中一定要给与处理。如果抛
出的是RuntimeException(运行时异常,非受检)以及它的子类异常,程序中不一定非要处理。
3.重写的时候,子类不能抛出比父类更大的异常

throw关键字

throw和throws的区别
1.throws,用于定义方法的时候,声明该方法向外抛出异常。
2.throw,主动抛出一个异常的对象。打断程序的执行。配合trycatch,或者throws来使用。

Exception exception = new Exception("我自定义的异常。。");
2
3 try {
4 throw exception;//自己主动抛出的异常
5 } catch (Exception e) {
6 e.printStackTrace();
7 }
8
9 System.out.println("main......end.....");
上一篇:leetcode-70. 爬楼梯


下一篇:基础语法