20200521,看到Java的爱情我羡慕了...

有一种暖男叫catch,有一种真爱叫try—catch,世上最真情的爱恋就是你在try我在catch,无论你发什么脾气,我都静静的接受,默默地处理,不管你有什么错,我都会原谅你,爱着你。

哈哈,那今天就来说一下下关于java的爱情故事吧
先来了解一些异常的知识,看完你就知道它的爱情了
都知道java是面向对象的语言,同样,它也是运用面向对象的机制来处理异常的,即通过一个个的异常类来分别处理各种各样的异常。
异常的分类如下图所示在这里插入图片描述
可以看到异常分为两大类:Error和Exception,下面从这两个方面分别讨论

Error

Error是指运行时应用程序较严重的问题,程序本身无法恢复的严重错误,不需要处理。
程序设计的再好,也避免不了外界的影响而引发的一些异常,这就不是异常,而是错误了,比如内存不足啦(OutOfMemoryError),虚拟机运行错误啦(VirtualMachineError),线程死锁等等
Error表明了系统JVM已经处于不可恢复的崩溃边缘,我们管也没法管(悄悄的告诉你:一般情况下遇见不到这些错误的,我们也不用太担心哈,有时重启一下就好喽!)

Exception

指java程序本身可以处理的异常事件,例如ClassCastException:数据类型转换异常;ArithmeticException(除数为0的异常);ArrayIndexOutOfBoundsException(数组下标出界异常);NullPointerException(空指针异常);ClassNotFoundException(指定类不存在);InputMismatchExceptionException(输入类型不匹配)等等这些的异常
异常分为RuntimeException和CheckedException

注意一点就是咱们现在所说的比如RuntimeException,CheckedException这种是一类异常,它下面可以派生出来好多的异常,是一类,这可不是一个异常,记好啊,下面分别说明一下这两种异常

RuntimeException

运行时异常,例如数组下标越界,空指针异常,除数为0异常,对象转换异常等,这些异常在编译器那是检查不出来的,编译器有点笨,它只能检查一些基本的语法错误,像这种的逻辑错误它是检查不出的。
这类异常一般不必要用异常机制来处理,我们通常会采用增加逻辑处理来避免这些异常的产生。eg:对于除数为0的异常,我们可以在除数那加上一个if判断语句,判断除数是否为0,不为0才让它执行语句块中的内容。
不废话,上代码

public class Test01 {
	public static void main(String[] args) {
		//分母为0异常
		int b=0;
		if(b!=0){   //避免出现java.lang.ArithmeticException异常,给它加个if判断语句就可以了
			System.out.println(1/b);
		}
		
		//空指针异常
		String str=null;
		if(str!=null){
			System.out.println(str.charAt(0));  //charAt是提取下标为0的字符,避免出现空指针异常:java.lang.NullPointerException,加一个非空判断
		}
		
		//数组下标越界异常
		int i[]=new int[5];
		int a=5;
		if(a<i.length){   //避免java.lang.ArrayIndexOutOfBoundsException下标越界异常,增加关于边界的判断
			System.out.println(i[a]);
		}
		
		//类型转换错误
		Animal dog=new Dog();   //强制类型转换易出现的错误(编译看左,运行看右)
		if(dog instanceof Cat){   //避免java.lang.ClassCastException类型转换错误,可以用instanceof二元运算符,注意:左边对象,右边类
			Cat cat=(Cat)dog;
		}
	}
}
class Animal{
	
}
class Dog extends Animal{
	
}
class Cat extends Animal{
	
}

CheckedException

我们把所以不是RuntimeException的异常都成为可检查异常,也就是编译器异常。
这类异常在编译时就必须做出处理,否则无法通过编译
处理这类异常有两种方式:使用try—catch捕获异常(java的神仙cp出场啦),使用throws声明异常

try—catch—finally

我们可以先想一下地铁的安保机制,是不是乘地铁的人进去是不是要过一下安检,假如小王的身上带了把枪去乘坐地铁,过安检的时候机器检测到他身上有危险物品是不是会发出报警声,然后地铁的相关安保人员过来处理这个异常
java的异常处理机制跟地铁的安保机制也很相似:
try用来检查异常的语句,如果出现异常,则把异常抛给catch,catch通过异常的类型来捕获处理它,最后一步是通过finally为异常处理提供一个统一的出口。
要点:
1.try语句指定了一段代码,该代码就是异常捕获并处理的范围,在执行过程中,当任意条语句发生异常,则会跳过后面的代码跳到该异常所对应的catch语句块中,语句块执行后不会再返回去执行没执行的代码
2.一个try语句至少带有一个catch语句或一个finaly语句
3.一个try可有多条catch语句,用于处理可能产生不同类型的异常对象
4.catch中异常对象的常用方法
e.toString():显示异常的类名与产生异常的原因
e.getMessage():只显示产生异常的原因
e.printStactTrance():用来跟踪异常事件发生时堆栈的内容
5.catch捕获异常应遵循子类异常在前,父类异常在后的原则
6.finally所指定的代码不管是否发生了异常都要被执行,代码通常是关闭程序块中已打开的资源,eg:关闭文件流,释放资源,关闭文件,关闭数据库等
7.finally最多只能由一条,根据自己的需要可有可无
8.即使try和catch中存在return语句,finally也会执行,是执行完finally语句后再通过return退出
上代码

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test08 {
	 public static void main(String[] args){
		  int a,b;
		  System.out.println("请输入两个数:");
		  Scanner myin=new Scanner(System.in);
		  try{//检测是否有错误
		      a=myin.nextInt();//1.如果输入的不是int类型,程序出错。提出问题
		      b=myin.nextInt();
		      System.out.println(a/b);//2.除数可能为零
		      int arr[]={1,2,3,4,5}; 
		      System.out.println(arr[5]); //3.数组下标越界  
		      System.out.println("try中的语句");  
		    }catch(InputMismatchException e){
		      e.printStackTrace();;
		    }catch(ArithmeticException e){
		      e.printStackTrace();
		    }catch(ArrayIndexOutOfBoundsException e){
		      e.printStackTrace();
		    }
		    System.out.println("程序继续向下执行:");
		  }
}

代码中有三处可出现异常提示,可以发现,如果你输入一个字母的话,它就会在第一个异常处报错,即InputMismatchException(输入数据类型错误),try中后面的它就不会再去执行了;同样如何我们输入12,0的话,就会引发第二处异常错误,即ArithmeticException(除数为0错误),同样后面语句也不在执行;同样如果我们前两处没有错误,就会到第三个地方报错,即ArrayIndexOutOfBoundsException(数组元素下标越界错误);

throws

有一种懒汉员工叫throws,甭管有啥事都往外抛,做错事了就交给上级擦屁股,上级不会再给上级,给到老板为止,老板要是也不会,公司就over了

当CheckedException发生时,我们也可以不立即处理它,也可以把这个异常给throws抛出去,也就是“它有异常,谁调它谁来处理”
如果一个方法中产生了某种异常,但是我们不确定如何来处理这种异常,就可以在方法的开头就声明出该方法可能抛出的异常
如果一个方法抛出多个异常,就必须在方法的开头列出所有的异常,用逗号分隔
(我感觉throws往上抛异常挺爽的哈哈)
上代码

import java.util.Scanner;

public class Test08 {
	 public static void main(String[] args) throws Exception{//我再把异常往上抛,抛给main方法,main方法再抛就要抛给虚拟机,让虚拟机给你处理
		myTest();
		  }
	 public static void myTest() throws Exception{//我太懒了,就直接用个Exception给全部异常包含住了哈哈
		 int a,b;
		  System.out.println("请输入两个数:");
		  Scanner myin=new Scanner(System.in);
		      a=myin.nextInt();//1.如果输入的不是int类型,程序出错。提出问题
		      b=myin.nextInt();
		      System.out.println(a/b);//2.除数可能为零
		      int arr[]={1,2,3,4,5}; 
		      System.out.println(arr[5]); //3.数组下标越界  
		      System.out.println("try中的语句");  
		    System.out.println("程序继续向下执行:");
	 }
}

今天你get到java的专属小爱情了吗
终于要结束啦啦,我好困啊,发布过就睡觉去,晚安喽,早点睡
看懂了可以点个赞哈
咱们一起加油
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_47630931/article/details/106266954
今日推荐