Java中的异常和错误简单分类

Java中的异常和错误大体上的分类如下图(不完全,用户也可以通过throw自定义异常)
在这里插入图片描述
运行异常(非强制性异常/RuntimeException)和非运行异常(强制性异常/编译错误/CheckedException)
1.运行时异常:这些异常一般是由程序逻辑错误引起的,Java编译器不会检查它,程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
2.非运行时异常 (编译异常):是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
异常处理
抛出异常
捕获异常

  • java语言中异常是以什么形式存在的呢?
  • 1、异常是在java中以类的形式存在的,每一个异常类都可以创建异常对象
  • 2、然后实际上jvm在执行到有异常的语句时,会new异常对象,并将new的异常对象抛出,打印输出信息到控制台
  • 异常发生就是new异常对象
  • java的异常处理机制
  • 1、在方法声明的位置上,使用throws关键字,抛给上一级
  • 如果异常一直上抛最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道以后就终止程序的执行
  • 所以,如果他是发生在main方法中的异常就直接抛给jvm
  • 2、使用try。。。catch语句进行异常的捕捉
  • catch可以写多个,建议精确控制,从上到下从小到大。
  • jdk8可以catch(| | |)

*注意:

  • 只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行
  • 另外需要注意try语句块中的某一行出现异常,该行后面的代码不会执行
  • try catch捕捉异常之后,后续代码可以执行
  • 不管有木有出现异常,finally块中代码都会执行
public class ExceptionTest01 {
	public static void main(String[] args) {
		//通过异常类实例化异常对象
		NumberFormatException nfe = new NumberFormatException("数字格式化异常!");
			System.out.println(nfe);
			//java.lang.NumberFormatException: 数字格式化异常!
		
			//	doSome();//因为是属于编译异常,所以我们在调用doSome()方法的时候必须对这种异常进行预先的处理不然编译报错
			
			
			//第一种处理方式
			//可以抛出此异常的父类
			//throws后面可以写多个异常用逗号隔开
//			public static void main(String[] args)throws ClassNotFoundException {
//				doSome();
//				
//			}
			//第二种处理方式:try..catch
			try {
				doSome();
			}catch(ClassNotFoundException e)
			{
				e.printStackTrace();
			}
	}
	/*
	 * doSome方法在方法声明位置上使用了throws ClassNotFoundException
	 * 这个代码表示doSome()方法在执行过程中,有可能会出现ClassNotfoundException异常
	 * 叫做类没找到异常,这个异常的直接父类是Exception所以属于编译异常
	 */
	public static void doSome() throws ClassNotFoundException
	{
		System.out.println("doSome!!!");
	}

}


public class ExceptionTest02 {
	public static void main(String[] args) {
		//这里为了测试方法,只是new了异常对象,没有将其抛出,jvm会认为这是一个普通的java对象
		NullPointerException e = new NullPointerException("空指针异常");
		//获取异常简单描述信息:这个信息实际上就是构造方法上面String参数
		String msg  =  e.getMessage();//空指针异常
		System.out.println(msg);
		//打印异常堆栈信息(追踪)
		//java后台打印异常堆栈追踪信息的时候,采用了异步线程的方式打印的
		e.printStackTrace();
		for(int i=0;i<1000;i++)
		{
			System.out.println("i="+i);
		}
		System.out.println("Hello World");
	}
}

自定义异常
自定义异常类最好定义检查异常
检查异常:
就是编译器要求你必须处理的异常。比如我们在编程某个文件的读于写时,编译器要求你必须要对某段代码try…catch… 或者 throws exception,这就是检查异常,简单的来说,你代码还没有运行,编码器就会检查你的代码,对可能出现的异常必须做出相对的处理。(比如当文件不存在时…)

如何处理检查异常:
1、继续往上抛出,(这是一个消极的方法),一直可以抛到java虚拟机来处理,通过throw exception抛出。

2、用try…catch捕获

(提示) 对于检查时的异常必须处理,或者必须捕获或者必须抛出

检查异常大概有哪些?
除了RuntimeException与其派生类(子类),以及错误(Error)。其他的差不多都是检查异常。

非检查异常:
编译器不要求强制处置的异常,虽然有可能出现错误,但是我不会在编译的时候检查。

如何处理非检查异常:
1、try…catch捕获

2、继续抛出

3、不处理

这类异常一般我们是不处理的,因为会很判断会出现什么问题,而且有些异常你也无法运行时处理,比如空指针。

非检查异常有哪些:
RuntimeException与其子类,以及错误(Error)

Exception异常进行划分,它可分为运行时异常和非运行时异常。
运行时异常:
都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是非检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过

非运行时异常:
是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不要自定义检查异常。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值