1. Java的异常概念

在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等等
异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
例如 :
public static void main(String[] args) {
//Double d = new Double(“123qwe”); 数字转换错误

  1. //int z = 100 / 0 ; 被除数不能为0
  2. String s = null;<br /> if(s != null){<br /> System.out.println(s.toString()); //null 值不能调用方法和属性 <br /> }else {<br /> System.out.println("s 是 null 值");<br /> }
  3. //文件有可能不存在<br /> //InputStream in = new FileInputStream(new File("d:/log/log.log"));<br />}

2 .异常分类

Java程序在执行过程中所发生的异常事件可分为两类:

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的异常处理 - 图1Java的异常处理 - 图2Java的异常处理 - 图3Java的异常体系:Java的异常处理 - 图4异常游戏一个父类 :Java的异常处理 - 图5API方法:

  • 空指针访问
  • 试图读取不存在的文件
  • 网络连接中断 (网略编程的时候产生)
  • 数组下标越界 | API | 方法说明 | | —- | —- | | getMessage() | 返回此throwable的详细消息字符串 | | toString() | 返回此可抛出的简短描述 | | printStackTrace() | 将此throwable和其追溯打印到标准错误流 |

3.Java虚拟机默认处理异常机制

如果程序出了问题,当程序员没有做任何处理时,JVM会自动调用异常处理的线程机制帮助我们强制处理,当发生异常时 ,虚拟机会自动创建一个异常对象进行处理:

  • 异常在栈中执行的轨迹帮助我们打印出来
  • 异常内容 包含了 : 异常的名称,异常原因及异常出现的位置等信息输出在了控制台
  • 程序会在发生异常的位置终止

Java的异常处理 - 图6
Java的异常处理 - 图7

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)、异常抛出

当程序遇到异常时,不进行解决 ,把异常抛出去,交给调用者解决。
异常的抛出分为两种情况 :

  1. 在方法内抛出异常在方法内抛出异常 ,使用 throw 关键词 ,在需要抛出异常的地方,把对应的异常信息 抛出去 public void setAge(int age) {
    if(age > 200 || age < 0){
    //异常抛出 遇到异常 ,代码就不会向下执行
    throw new RuntimeException(“年龄不能大于200,也不能小于0”);
    }
    this.age = age;
    }一般在方法内抛出异常 ,都是抛出运行时异常 如果要是抛出编译时异常 :Java的异常处理 - 图8如果不封装自定义信息 :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());
    }
    }
    }
  2. 在方法的声明上跑异常
    • 可以抛出运行时异常 和在方法内部抛出异常没有什么区别
    • 抛出编译时异常
      • 在方法声明上抛出编译时异常,不能自定义异常信息
      • 在方法内抛出编译时异常 ,必须 try —catch 可以抛出自定义新 必须在方法的声明上也抛出异常

Java的异常处理 - 图9