zoukankan      html  css  js  c++  java
  • java异常处理

    2020/4/21--Java异常处理

    • java的异常处理机制
    • 使用try、catch、finally处理异常
    • 使用throw和throws应发异常
    • getMessage、printStackTrace方法
    • 自定义异常类

    异常概述

    是java语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时才能被throw语句跑出,才可以是catch子句中的参数类型。两个子类:Error、Exception用于指示发生了异常情况。

    这些实例是在异常情况下的上下文中新近创建的,因此包含了堆栈跟踪数据

    Error类是指严重的系统错误,一般是与JVM相关的问题,如系统崩溃、虚拟机出错、动态链接失败等,这一类错误无法恢复或不能捕获,程序将终端。

    Exception类是指一些可以捕获并恢复异常的情况,如数组下标越界ArrayIndexOutBoundException、数组被除0产生异常ArithmeticException、输入输出异常I/OException

    异常分为以下几种:

    1. 非受检异常

      unchecked异常是指编译器不要求强制处理的异常。一般是指编程的逻辑错误。java.lang.RuntimeException类及其子类

      • 错误的类型转换异常:java.lang.ClassCastException
      • 数组下标越界异常:java.lang.ArrayIndexOutOfBoundException
      • 空指针访问异常:java.lang.NullPointerException
      • 除零溢出错误:java.lang.ArithmeticException
    2. 受检异常

      checked异常是指编译器必须处理的异常,程序在运行时由于外界因素造成的一般性异常。

      • s没有找到指定名称的类异常:java.lang.ClassNotFoundException
      • 访问不存在的文件:java.io.FileNotFoundException
      • 操作文件时发生的异常: java.io.IOException
      • 操作数据库发生的异常:java.sql.SQLException

    try和catch捕获异常

    出现异常时,会自动生成一个异常对象,该异常对象被自动交给JVM,JVM接受到后,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获异常。找不到捕获异常的方法,系统将终止,程序也退出

    异常发生时要执行catch后面括号中的语句,并且catch之后的语句也会整形;没有异常发生,不会执行catch后面括号中的语句。

    throw和throws引发异常

    1. throw

      必须throw出一个对象,throw完成后,程序立即停止

      try {
          number = Integer.parseInt(args[0]);
      } catch(Exception e) {
          throw new ArrayIndexOfBoundException("数组越界");
      }
      
    2. throws

      一个方法a可以引发异常,而它自己并不对该异常进行处理,那么a方法必须将这个异常抛给调用以使程序能够继续运行下去。这时候就要用到throws语句。

      try {
          createThrow(tmp);
      } catch(Exception e) {
          System.out.println("来自createThrow方法的异常");
      }
      
      public static void createThrow(String[] tmp) throws Exception {
          int number = 0;
          number = Integer.parseInt(tmp[0]);
          System.out.println("你输入的数字为:"+number);
      }
      
    3. throw、throws语句组合应用

      捕获异常后,跑出一个明确的异常给调用者

      // 调用有异常的方法
      public static void testThrow(String[] tmp) {
          try {
              createThrow(cmp);
          } catch(Exception e) {
              System.out.println("捕获来自createThrow方法的异常");
          }
      }
      
      //抛出一个具体的异常
      public statci void createThrow(String[] tmp) throws Exception {
          int number = 0;
          try {
              number = Integer.parseInt(tem[0]);
          } catch(Exception e) {
              throw new ArrayIndexOfBoundException("数组越界");
          }
          System.out.println("你输入的数字为:" + number);
      }
      

      throw语句写在方法中,throws语句是在方法前面之后的,throws抛出的类型的范围要比throw抛出的对象范围大才可以用。

    finally关键字

    无论异常总要被执行的代码。

    finally语句在return之前执行。

    getMessage 和 printStackTrace方法

    getMessage用法:ex.getMessage()

    printStackTrace用法:ex.printStackTrace();

    多重catch

    类似switch,挨个去检查与异常类型匹配的catch语句块,执行其中之一后,其他catch语句忽略

    Java异常处理的几个原则:

    1. 不要丢弃异常
    2. catch语句应该制定具体的异常类型
    3. finally里面释放资源
    4. 分离各个可能出现异常的语句并分别捕获异常
    5. 对于数据不完整,需要用户做出相应处理,至少提示数据的不完整

    自定义异常类

    定义一个直接间接继承Throwable类的类。一般选择Exception作为父类。

    public class MyException extends Exception {
    	public MyException(){ super();}
        public MyException(String msg) {
            super(msg);
        }
        public MyException(String msg, Throwable cause) {
            super(msg, cause);
        }
        public MyException(Throwable cause) {
            super(cause);
        }
        
    }
    

    使用:

    public String[] createArray(int length) throws MyException {
        if (lenght < 0) {
            throw new MyException("数组长度小于0,不合法");
        }
        return new String[length];
          
    }
    
  • 相关阅读:
    说一下AOP和IOC的实现原理
    sql 2005 express版本如果安装vs 2010则被sql 2008 express升级代替
    北京热死了
    Webservices,remoting,WCF比较一下
    CGI(拾遗)
    士农工商
    外网无法访问iis服务器
    好好整理了一下胡子
    用IIS在本机虚拟一个域名发布站点(小技巧)
    给目前自己开发的分布式系统做个定义
  • 原文地址:https://www.cnblogs.com/DengSchoo/p/12746132.html
Copyright © 2011-2022 走看看