1. Java的异常概念
在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等等
异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
例如 :
public static void main(String[] args) {
//Double d = new Double(“123qwe”); 数字转换错误
//int z = 100 / 0 ; 被除数不能为0
String s = null;<br /> if(s != null){<br /> System.out.println(s.toString()); //null 值不能调用方法和属性 <br /> }else {<br /> System.out.println("s 是 null 值");<br /> }
//文件有可能不存在<br /> //InputStream in = new FileInputStream(new File("d:/log/log.log"));<br />}
2 .异常分类
Error :
Exception
异常 程序员能解决的问题 ,必须解决的问题根据异常发生的时间,Exception异常又分为以下两类:(1)、编译时异常虚拟机把Java文件编译成class文件的时候出现的异常 ,叫编译时异常 ,这种异常会提前报出来 要求程序员强制的处理//文件有可能不存在
InputStream in = new FileInputStream(new File(“d:/log/log.log”));
Class.forName(“com.jsbc.mysql.Driver”);(2)、运行时异常Java程序在运行的时候,出现的异常 ,叫运行时异常所有的运行时都在 java.lang.RuntimeExceptiond这个异常的子类下,运行时异常不要求程序员强制的处理Java的异常体系:
异常游戏一个父类 :
API方法:
- 空指针访问
- 试图读取不存在的文件
- 网络连接中断 (网略编程的时候产生)
- 数组下标越界 | API | 方法说明 | | —- | —- | | getMessage() | 返回此throwable的详细消息字符串 | | toString() | 返回此可抛出的简短描述 | | printStackTrace() | 将此throwable和其追溯打印到标准错误流 |
3.Java虚拟机默认处理异常机制
如果程序出了问题,当程序员没有做任何处理时,JVM会自动调用异常处理的线程机制帮助我们强制处理,当发生异常时 ,虚拟机会自动创建一个异常对象进行处理:
- 异常在栈中执行的轨迹帮助我们打印出来
- 异常内容 包含了 : 异常的名称,异常原因及异常出现的位置等信息输出在了控制台
- 程序会在发生异常的位置终止
4.Java异常处理机制
(1)、异常捕获
如何捕获异常 ,异常捕获的语法 :
try {
//代码逻辑 有可能报错的低吗
}catch(XxxxxxException e){
//处理代码
}catch(XxxxxException e){
//处理代码
}catch(XxxxxException e){
//异常处理代码
}…..{
//处理代码
}finally {
//无论如何都会执行的代码 可以写 也可以不写 主要看处理方式
}
我们可以捕获很多异常 ,但是异常捕获是由顺序的,前民捕获的异常不能大于后面捕获的异常
前面捕获的异常 一定是后面捕获的异常的子类
例如 :如果在捕获异常的第一个 就捕获 Exception ,后面就不需要在捕获异常了
public class Testtry {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] nums = {2,3,5,6,78,9,42,31,15};
try{
System.out.println(“请输入一个下标:”);
int index = sc.nextInt();
System.out.println(nums[index]);
//此段代码 有可能出现哪些错误
/
InputMismatchException
ArrayIndexOutOfBoundsException
/
return ;
}catch (InputMismatchException e) {
// TODO: handle exception
System.out.println(“只能输入数字.”);
}catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println(“输入的数字只能是 0—9之间。”);
}catch(Exception e1){
System.out.println(“系统维护,请售后访问”);
}finally {
//无论如何都ui执行的代码 一定在代码的return 之前执行
// 作用 :资源的释放 或者关闭
System.out.println(“我是finally中的代码。。。。”);
}
//异常捕获之后 ,后面的代码是可以正常运行
System.out.println(“程序执行结束 !!!!”);
}
}
在开发的时候 ,异常不能这么直接处理
在开发时 一定要把异常的栈信息打印出来 在异常的处理中 调用 异常对象的 printStackTrace()
如果判断不出来会报什么异常,那就捕获 Exception ,捕获父类异常 。
finally 中代码 一定会执行 ,在return 之前执行
(2)、异常抛出
当程序遇到异常时,不进行解决 ,把异常抛出去,交给调用者解决。
异常的抛出分为两种情况 :
- 在方法内抛出异常在方法内抛出异常 ,使用 throw 关键词 ,在需要抛出异常的地方,把对应的异常信息 抛出去 public void setAge(int age) {
if(age > 200 || age < 0){
//异常抛出 遇到异常 ,代码就不会向下执行
throw new RuntimeException(“年龄不能大于200,也不能小于0”);
}
this.age = age;
}一般在方法内抛出异常 ,都是抛出运行时异常 如果要是抛出编译时异常 :如果不封装自定义信息 :public class TestUser {
public static void main(String[] args) {
User user = new User();
user.setAge(1);
try {
user.parseFile(“E:/log/aooo.txt”);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
//getMessage() 方法 获取抛出的异常信息
System.out.println(e.getMessage());
}
}
} - 在方法的声明上跑异常
- 可以抛出运行时异常 和在方法内部抛出异常没有什么区别
- 抛出编译时异常
- 在方法声明上抛出编译时异常,不能自定义异常信息
- 在方法内抛出编译时异常 ,必须 try —catch 可以抛出自定义新 必须在方法的声明上也抛出异常