异常机制(异常分类,及处理,getMessage,printStackTrace)

(图中所有截图,以及资料笔记,来源于动力节点,为自己学习使用)
1.异常是什么?
第一,异常模拟的是现实世界中“不正常”事件
第二,java中通过 ‘类’ 的方式去模拟异常
在java.lang包下有异常的描述
第三,类是可以创建对象的
NullPointerException e = 0x1234; //这里相当于类的实例化,将异常类实例化,就成了真 实存在的异常事件
这个对象一定是NullPointerException类型
这个对象就是表示真实存在的异常事件
NullPointerExceptions是一类异常

	“抢劫”就是一类异常
	张三被抢劫就是一个异常时间。

2.异常机制得作用?
java语言为我们提供了一种完善的异常处理机制,
作用是:程序发生异常事件之后,为我们输出详细的信息,
程序员通过这个信息,可以对程序进行一些处理,使得程序更加的健壮

public class Test{

public static void main(String[] args){
	int a = 5;
	int b = 0;
	int c = a/b;  //程序语法没问题,编译能通过,但是不符合数学规则,无法运行

	System.out.println("hello");  //	如果上面的异常没有处理,不会接着执行下面的语句,JVM会做主自动								退出该语句
	/*Exception in thread "main" java.lang.ArithmeticException: / by zero
 at 异常机制/test.Test01.main(Test01.java:8)*/	系统报的异常反馈
 	本质:程序执行过程中发生了算数异常这个事件,JVM为我们创建了一个ArithmeticException类型的对象。并且这个对象中包含了详细的异常信息,并且JVM将这个对象中的信息输出到控制台。


}

}

//一下是我们在知道异常后,对异常进行处理,通过改变代码对这些异常处理
public static void main(String[] args){
	int a = 11;
	int b = 0;
	if(b!=0){
		System.out.println(a+"/"+b+"="+a/b);
	}else
	{
		System.out.println("b不能为0");			//这就是异常处理,这样就规避了异常的出现
	}
}

异常继承结构图
Throwable() 所有异常和错误 的超类,都是继承与他
在这里插入图片描述

在这里插入图片描述
Exception(异常)下分为编译异常和运行时异常
编译时异常(有很多种) 与 运行时异常(RuntimeException)是E
编译时异常与运行时异常的区别
所有的编译时异常,要求程序员在编写程序阶段,必须对他进行处理,如果不处理的话,编译无法通过。处理异常有两种方式: 捕捉 和 声明抛出。捕捉:try…catch… , 声明抛出就是在方法声明的位置上使用throws关键字抛出异常,
编译时异常发生几率较高

所有RuntimeException的子类都是运行时异常,运行时异常程序员在编写阶段不需要对它进行处理
运行发生的几率比较低

处理异常有两种方式:
	1.声明抛出:throws
	2.捕捉:	try...catch..
	
	以下程序演示第一种方式:声明抛出,在方法声明的位置上使用throws关键字向上抛出异常。
public class Test{
	public static void  main(String[] args)
	{
		//思考:java编译器是如何知道一下的代码执行过程中可能出现异常
		//java编译器是如何知道这个异常发生的几率比较高呢?
		
		FileInputstream fis = new FileInputstream("c:/ab.txt")

		//其实当我查API文档对于FileInputStreamd类的定义时候,有如下代码
		public FileInputStream​(String name) throws FileNotFoundException 该类在定义的时候后面就		跟了throws,并且throws后面跟的是一个 FileNotFoundException异常,该异常继承于编译异常。
		所以调用该类,就必须要有对于的异常处理机制,
	}
}
//以上程序编译不通过
/*
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Unhandled exception type FileNotFoundException at 异常机制/运行异常.Tets.main(Tets.java:6)
*/

一下程序演示第一种异常处理方式:声明抛出,在方法声明的位置上使用throws关键字向上抛出异常

如果没有throws,即没有异常处理机制,编译都将无法通过,但是有了异常处理机制之后,编译可以通过,在异常发生之前的语句是可以正常运行的,但是有问题之后的语句无法通过

public class Test{
	//public static void main(String[] args) throws IOException
	//public static void main(String[] args) throws Exception
	public static void main(String[] args) throws FileNoFoundException{ 
	FileInputStream fis = new FileInputStream("c:/ab.txt");
	}

}

深入throws
throws代表向上抛,代表调用它的方法,需要用throwsn后面跟异常处理类
当发生异常后,throws会一致往上抛,但是不会被解决,如果一直网上抛,不解决的话,最终会又JVM结束程序
异常通过try…catch…来解决

public class Test{
	public static void main(String[] args)	 throws FileNotFoundException{
		m1();
		//使用throws处理异常不是真正处理异常而是推卸责任。
		//谁调用的就会抛给谁。
		//上面的m1方法如果出现了异常,因为采用的是上抛,给了JVM,JVM遇到这个异常就会退出JVM,下面的代码不会执行
		System.out.println();
	}
	public static void m1() throws FileNotFoundException{
		m2();
	}
	public static void m2() throws FileNotFoundException{   // 由于m3方法上有throws所以上抛,`调用它的m2()也需要用throws后面跟上异常处理机制
		m3();
	}
	public static void m3() throws FileNotFoundException{  //由于FileInputStream有throws,所以													要在m3方法后用throws处理
		new FileInputStream("c:/ab.txt");  //有FileInputStream 但是没有处理机制,所以直接这样写										会报错
	}

}

这是程序后的报错信息
在程序运行过程中发生了FileNotFoundException类型的异常
JVM为我们创建了一个FileNotFoundException类型的对象。
该对象中携带以下的信息:
//JVM负责将该对象的信息打印到控制台
//并且JVM停掉了程序的运行

Exception in thread "main" java.io.FileNotFoundException: c:\ab.txt (系统找不到指定的文件。) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:213) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:110) at 异常机制/运行异常.Test.m3(Test.java:21) at 异常机制/运行异常.Test.m2(Test.java:18) at 异常机制/运行异常.Test.m1(Test.java:15) at 异常机制/运行异常.Test.main(Test.java:8)

处理异常的第二种方式:捕捉… try…catch…
1.catch语句快可以写多个
2.但是从上到下catch,必须从小类型异常到大类型异常进行捕捉。
3.try…catch…中最多执行1个catch语句块。执行结束之后try…catch…就结束了

前面有说到,有异常就会创建对象,catch里面就是把创建的异常对象捕捉赋给了,里面的变量

语法:
	try{
		可能出现异常的代码;
		
	}catch(异常类型 变量){  //该变量内存地址指向堆中的那个对象是“异常类型”的实例化
		
		处理异常的代码;
	
	}
	catch(异常类型 变量){
	
	处理异常代码;
	
	}
	1.catch语句块可以写多个
public class ExceptionTest{

try{
	FileInputStream fis = new FileInputStream("c:/ab.txt");
}catch(ArithmeticException e ) {//这样写是不行的,因为这样捕获是错误的,因为我们希望捕捉的是FileNotFoundException异常,但是这里却捕获的是数学异常,所以我们在选择要捕获的异常的时候,一定要先看try里面可能出现异常的代码会出现哪种异常,再决定捕获哪种异常
}


//以下程序可以通过,捕获的异常和可能出现的异常相同
try{
	FileInputStream fis = new FileInputStream("c:/ab.txt");
}catch(FileNotFoundException e ){
}



try{ 
	FileInputStream fis = new FileInputStream("c:/ab.txt");
	fis.read();   //read()这个方法是FileInputStream继承与他的父类InputStream,然而InputStream 					throws的方法为IOException
}catch(FileNotFoundException e )
{
}catch(IOException e){
}


//以下方法编译也可通过,但是可能处理起来不具体比较模糊

try{

	 FileInputStream fis = new FileInputStream("c:/ab.txt");
	 fis.read();
 } catch(IOException e){
 }




//编译无法通过,
//catch可以写多个,但是必须从上到下,从小到大捕捉
try{

 FileInputStream fis = new FileInputStream("c:/ab.txt");
 fis.read();
 }catch( IOException e){
 
 }catch(FileNotFoundException e){

}

}



//这里要注意的是,当try内部有语句异常,捕捉处理后,try后面的语句将不会再执行,所以这里响应了前面的多个catch语句只执行一个的条件

try{ 
 FileInputStream fis = new FileInputStream("c:/ab.txt"); 
  fis.read(); 
   }catch( IOException e){ 
     System.out.println("读取路径有错误");
    }catch(FileNotFoundException e){
    System.out.println("err!")} 

关于getMessage和printStackTrace方法的应用

public class ExceptionTest{
	public static void main(String[] args)
	{
		try{
			FileInputStream fis = new FilesInputStream("c:/ab.txt");
		
			//JVM为我们执行了以下代码
		//	FileNotFoundException e = new FileNotFoundException("c:/ab.txt 找不到指定文件")
		//这个会继承关系,构造方法不断的往上传,传到Throwable里的getMessage方法里面
		//是由JVM帮我们赋值再不断网上传
		}
		catch(FileNotFoundException e){
			//打印异常堆栈信息
			//一般情况下都会使用该方式去调试程序
			e.printStackTrace();  //如果不加这个方法,不会打印下面的错误信息,系统会直接向下运行,不会给报错信息
		/*
		 * java.io.FileNotFoundException: sd (系统找不到指定的文件。) at
		 * java.base/java.io.FileInputStream.open0(Native Method) at
		 * java.base/java.io.FileInputStream.open(FileInputStream.java:213) at
		 * java.base/java.io.FileInputStream.<init>(FileInputStream.java:155) at
		 * java.base/java.io.FileInputStream.<init>(FileInputStream.java:110) at
		 * 异常机制/运行异常.Test01.main(Test01.java:9)
		 */
			//另外一种方法
			String ms = e.getMessage();  //getMessage这个方法是从throwable那里一路继承过来的
			System.out.println(msg);
			//会有如下的报错信息
			//sd (系统找不到指定的文件。)
		}
		//在catch里面有了具体的处理方式后,后面的代码会继续执行
		System.out.println("ABC");
	}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值