厦门做网站seo的,吉利的广告公司名字,广东快速做网站公司,广告制作安装工Java异常处理机制 一、异常概述与异常体系结构异常概述Error示例代码#xff1a;Exception示例代码#xff1a;异常体系结构Error和Exception的区别:异常分类检查异常非检查异常Why:为什么有非检查异常#xff1f;Where:非检查异常有哪些#xff1f;Exception异常划分运行时… Java异常处理机制 一、异常概述与异常体系结构异常概述Error示例代码Exception示例代码异常体系结构Error和Exception的区别:异常分类检查异常非检查异常Why:为什么有非检查异常Where:非检查异常有哪些Exception异常划分运行时异常编译期异常 二、初识异常与常见异常初识异常 一、异常概述与异常体系结构
异常概述
在使用计算机语言进行项目开发的过程中即使程序员把代码写得尽善尽美在系统的运行过程中仍然会遇到一些问题因为很多问题不是靠代码能够避免的比如客户输入数据的格式读取文件是否存在网络是否始终保持通畅等等。 程序运行时发生的不被期望的事件它阻止了程序按照程序员的预期正常执行这就是异常开发过程中的语法错误和逻辑错误不是异常。 Java程序在执行过程中所发生的异常事件可分为两类 ErrorJava虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况。比如StackOverflowError栈溢出和OOM内存溢出。一般不编写针对性的代码进行处理。 Exception: 其它因编程错误或偶然的外在因素导致的一般性问题可以使用针对性的代码进行处理。例如 空指针访问 试图读取不存在的文件 网络连接中断 数组角标越界
Error示例代码
public class ErrorTest {public static void main(String[] args) {/** 1、栈溢出java.lang.StackOverflowError* 原因 : 函数调用栈太深了,注意代码中是否有了循环调用方法而无法退出的情况* StackOverflowError 是一个java中常出现的错误在jvm运行时的数据区域中有一个java虚拟机栈当执行java方法时会进行压栈弹栈的操作。在栈中会保存局部变量操作数栈方法出口等等。jvm规定了栈的最大深度当执行时栈的深度大于了规定的深度就会抛出StackOverflowError错误。* */main(args);/** 2、堆溢出java.lang.OutOfMemoryError* 原因Java中所有的对象都存储在堆中通常如果JVM无法再分配新的内存内存耗尽垃圾回收无法及时回收内存就会抛出OutOfMemoryError。* */Integer[] arr new Integer[1024 * 1024 * 1024];}
}Exception示例代码
import java.io.FileInputStream;public class ExceptionTest {public static void main(String[] args) {/** 1、运行时异常java.lang.ArithmeticException* 原因ArithmeticException* */int a 10;int b 0;System.out.println(a / b);/** 2、编译期异常java.io.FileNotFoundException* 原因文件找不到异常通常是两种情况1、系统找不到指定的路径 2、拒绝访问指定的是目录时就会报拒绝访问异常* */FileInputStream fis new FileInputStream(a.txt);}
}异常发生时是任程序自生自灭立刻退出终止还是输出错误给用户或者用C语言风格用函数返回值作为执行状态
Java提供了更加优秀的解决办法异常处理机制。异常处理机制能让程序在异常发生时按照代码的预先设定的异常处理逻辑针对性地处理异常让程序尽最大可能恢复正常并继续执行且保持代码的清晰。
Java中的异常可以是函数中的语句执行时引发的也可以是程序员通过throw 语句手动抛出的只要在Java程序中产生了异常就会用一个对应类型的异常对象来封装异常JRE就会试图寻找异常处理程序来处理异常。
Throwable类是Java异常类型的顶层父类一个对象只有是 Throwable 类的直接或者间接实例他才是一个异常对象才能被异常处理机制识别。JDK中内建了一些常用的异常类我们也可以自定义异常。
异常体系结构
Java标准库内建了一些通用的异常这些类以Throwable为顶层父类。 Throwable又派生出Error类和Exception类。
错误Error类以及它的子类的实例代表了JVM本身的错误。错误不能被程序员通过代码处理Error很少出现。因此程序员应该关注Exception为父类的分支下的各种异常类。
异常Exception以及它的子类代表程序运行时发生的各种不期望发生的事件。可以被Java异常处理机制使用是异常处理的核心。
Error和Exception的区别:
Error和Exception都有一个共同的根类是Throwable类。
Error是系统中的错误程序员是不能改变的和处理的一般是指与虚拟机相关的问题如系统崩溃虚拟机错误内存空间不足方法调用栈溢等。对于这类错误的导致的应用程序中断仅靠程序本身无法恢复和和预防遇到这样的错误建议让程序终止。因此我们编写程序时不需要关心这类错误。 Exception也就是我们经常见到的一些异常情况表示程序可以处理的异常可以捕获且可能恢复。遇到这类异常应该尽可能处理异常使程序恢复运行而不应该随意终止异常。
异常分类
总体上我们根据Javac对异常的处理要求将异常类分为2类。
我们常说的异常是狭义上的就是指Exception及其子类但是广义上的异常是包括Exception和Error
Java的异常(包括Exception和Error)从广义上分为检查异常checked exceptions和非检查的异常unchecked exceptions。
其中根据Exception异常进行划分可分为运行时异常和非运行时异常。 需要明确的是检查和非检查是对于javac来说的这样就很好理解和区分了。 检查异常
What:什么是检查异常(checked exception)?
就是编译器要求你必须处置的异常。不知道你编程的时候有没有遇到过你写的某段代码编译器要求你必须要对这段代码try…catch或者throws exception如果你遇见过没错这就是检查异常也就是说你代码还没运行呢编译器就会检查你的代码会不会出现异常要求你对可能出现的异常必须做出相应的处理。
javac强制要求程序员为这样的异常做预备处理工作使用try…catch…finally或者throws。在方法中要么用try-catch语句捕获它并处理要么用throws子句声明抛出它否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下而程序员无法干预用户如何使用他编写的程序于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。
比如:我们调用日期格式化类解析字符串的时候;
How:怎样处理检查异常checked exception?
1、继续抛出消极的方法一直可以抛到java虚拟机来处理就是通过throws Exception抛出。
2、用try…catch捕获
注意对于检查的异常必须处理或者必须捕获或者必须抛出
Where:检查异常有哪些呢
除了RuntimeException与其子类以及错误Error其他的都是检查异常绝对的大家族。
非检查异常
What:什么是非检查异常unchecked exceptions
编译器不要求强制处置的异常虽然你有可能出现错误但是编译器不会在编译的时候检查没必要也不可能。
javac在编译时不会提示和发现这样的异常不要求在程序处理这些异常。所以如果愿意我们可以编写代码处理使用try…catch…finally这样的异常也可以不处理。
对于这些异常我们应该修正代码而不是去通过异常处理器处理。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException错误的强制类型转换错误ClassCastException数组索引越界ArrayIndexOutOfBoundsException使用了空对象NullPointerException等等。
How:对非检查的异常(unchecked exception )怎样处理? 1、用try...catch捕获2、继续抛出3、不处理4、通过代码处理一般我们是通过代码处理的因为你很难判断会出什么问题而且有些异常你也无法运行时处理比如空指针需要人手动的去查找。而且捕捉异常并处理的代价远远大于直接抛出。Why:为什么有非检查异常 你想想非检查异常都有哪些NullPointerExceptionIndexOutOfBoundsExceptionVirtualMachineError等这些异常你编译的时候检查吗再说了明明可以运行时检查都在编译的时候检查你写的代码还能看吗而且有些异常只能在运行时才能检查出来比如空指针堆溢出等。Where:非检查异常有哪些 RuntimeException与其子类以及错误Error。Exception异常划分 Exception异常进行划分它可分为运行时异常和编译期异常。运行时异常
是RuntimeException类及其子类异常如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等这些异常是非检查异常程序中可以选择捕获处理也可以不处理。这些异常一般是由程序逻辑错误引起的程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它也就是说当程序中可能出现这类异常即使没有用try-catch语句捕获它也没有用throws子句声明抛出它也会编译通过。
编译期异常
是RuntimeException以外的异常类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常如果不处理程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常一般情况下不要自定义检查异常。
二、初识异常与常见异常
初识异常
下面的代码会演示2个异常类型ArithmeticException 和 InputMismatchException。 前者由于整数除0引发后者是输入的数据不能被转换为int类型引发。
import java.util.Scanner;public class AllDemo {public static void main(String[] args) {System.out.println(----欢迎使用命令行除法计算器----);CMDCalculate();}public static void CMDCalculate() {Scanner scan new Scanner(System.in);int num1 scan.nextInt();int num2 scan.nextInt();int result devide(num1, num2);System.out.println(result: result);scan.close();}public static int devide(int num1, int num2) {return num1 / num2;}
}/*****************************************
----欢迎使用命令行除法计算器----
2
0
Exception in thread main java.lang.ArithmeticException: / by zeroat AllDemo.devide(AllDemo.java:19)at AllDemo.CMDCalculate(AllDemo.java:13)at AllDemo.main(AllDemo.java:6)
----欢迎使用命令行除法计算器----
----欢迎使用命令行除法计算器----
1
r
Exception in thread main java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at AllDemo.CMDCalculate(AllDemo.java:12)at AllDemo.main(AllDemo.java:6)
*****************************************/异常是在执行某个函数时引发的而函数又是层级调用形成调用栈的因为只要一个函数发生了异常那么他的所有的caller都会被异常影响。当这些被影响的函数以异常信息输出时就形成的了异常追踪栈。
异常最先发生的地方叫做异常抛出点。 从上面的例子可以看出当devide函数发生除0异常时devide函数将抛出ArithmeticException异常因此调用它的CMDCalculate函数也无法正常完成因此也发送异常而CMDCalculate的caller——main 因为CMDCalculate抛出异常也发生了异常这样一直向调用栈的栈底回溯。这种行为叫做异常的冒泡异常的冒泡是为了在当前发生异常的函数或者这个函数的caller中找到最近的异常处理程序。由于这个例子中没有使用任何异常处理机制因此异常最终由main函数抛给JRE导致程序终止。
上面的代码不使用异常处理机制也可以顺利编译因为2个异常都是非检查异常。但是下面的例子就必须使用异常处理机制因为异常是检查异常。
代码中我选择使用throws声明异常让函数的调用者去处理可能发生的异常。但是为什么只throws了IOException呢因为FileNotFoundException是IOException的子类在处理范围内。
import java.io.FileInputStream;
import java.io.IOException;public class ExceptionTest {public void testException() throws IOException {//FileInputStream的构造函数会抛出FileNotFoundExceptionFileInputStream fileIn new FileInputStream(E:\\a.txt);int word;//read方法会抛出IOExceptionwhile ((word fileIn.read()) ! -1) {System.out.print((char) word);}//close方法会抛出IOExceptionfileIn.close();}
}