• java基础学习笔记四(异常)


    Java中的异常 Exception

    如图可以看出所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象。

    从大体来分异常为两块:

    1、error---错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。

    2、Exception --- 异常 :异常可分为运行时异常跟编译异常

    1)运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。

     2)编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。

    捕获异常

    使用try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

    try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:

    try
    {
       // 程序代码
    }catch(ExceptionName e1)
    {
       //Catch 块
    }

    Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。

    如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

    实例

    下面的例子中声明有两个元素的一个数组,当代码试图访问数组的第三个元素的时候就会抛出一个异常

    // 文件名 : ExcepTest.java
    import java.io.*;
    public class ExcepTest{
     
       public static void main(String args[]){
          try{
             int a[] = new int[2];
             System.out.println("Access element three :" + a[3]);
          }catch(ArrayIndexOutOfBoundsException e){
             System.out.println("Exception thrown  :" + e);
          }
          System.out.println("Out of the block");
       }
    }

    以上代码编译运行输出结果如下:

    Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
    Out of the block

    多重捕获块

    一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。

    多重捕获块的语法如下所示:

    try{
       // 程序代码
    }catch(异常类型1 异常的变量名1){
      // 程序代码
    }catch(异常类型2 异常的变量名2){
      // 程序代码
    }catch(异常类型2 异常的变量名2){
      // 程序代码
    }

    上面的代码段包含了 3 个 catch块。

    可以在 try 语句后面添加任意数量的 catch 块。

    如果保护代码中发生异常,异常被抛给第一个 catch 块。

    如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。

    如果不匹配,它会被传递给第二个 catch 块。

    如此,直到异常被捕获或者通过所有的 catch 块。

    实例

    该实例展示了怎么使用多重 try/catch。

    try {
        file = new FileInputStream(fileName);
        x = (byte) file.read();
    } catch(FileNotFoundException f) { // Not valid!
        f.printStackTrace();
        return -1;
    } catch(IOException i) {
        i.printStackTrace();
        return -1;
    }

    throws/throw 关键字

    将异常抛出
    
    public class ExceptionTest2
    {
        public void method() throws Exception // 将异常抛出,由调用这个方法的方法去处理这个异常,如果main方法也将异常抛出,则交给Java虚拟机来处理
        {
            System.out.println("Hello World");
    
            // 抛出异常
            throw new Exception();
        }
    
        public static void main(String[] args) throws Exception // main方法选择将异常继续抛出
        {
            ExceptionTest2 test = new ExceptionTest2();
    
            test.method(); // main方法需要对异常进行处理
    
            // 执行结果:
            // Hello World
            // Exception in thread "main" java.lang.Exception
            // at com.learnjava.exception.ExceptionTest2.method(ExceptionTest2.java:10)
            // at com.learnjava.exception.ExceptionTest2.main(ExceptionTest2.java:17)
        }
    
    }

    对于运行时异常(runtime exception),可以对其进行处理,也可以不处理。推荐不对运行时异常进行处理。

    自定义异常

    所谓自定义异常,通常就是定义一个类,去继承Exception类或者它的子类。因为异常必须直接或者间接地继承自Exception类。

      通常情况下,会直接继承自Exception类,一般不会继承某个运行时的异常类。

      自定义异常可以用于处理用户登录错误,用户输入错误提示等。

      自定义异常的例子:

      自定义一个异常类型

    public class MyException extends Exception
    {
        public MyException()
        {
            super();
        }    
        public MyException(String message)
        {
            super(message);
        }
    }

    一种异常处理方式:

    public class ExceptionTest4
    {
    
        public void method(String str) throws MyException
        {
            if(null == str)
            {
                throw new MyException("传入的字符串参数不能为null!");
            }
            else
            {
                System.out.println(str);
            }
        }
        
        public static void main(String[] args) throws MyException //异常处理方式1,不断向外抛出
        {
            ExceptionTest4 test = new ExceptionTest4();
            test.method(null);
        }
    }

    另一种异常处理方式:

    public class ExceptionTest4
    {
    
        public void method(String str) throws MyException
        {
            if (null == str)
            {
                throw new MyException("传入的字符串参数不能为null!");
            }
            else
            {
                System.out.println(str);
            }
        }
    
        public static void main(String[] args)
        {
            //异常处理方式2,采用try...catch语句
            try
            {
                ExceptionTest4 test = new ExceptionTest4();
                test.method(null);
    
            }
            catch (MyException e)
            {
                e.printStackTrace();
            }    
            finally
            {
                System.out.println("程序处理完毕");
            }
    
        }
    }

    finally关键字

    finally 关键字用来创建在 try 代码块后面执行的代码块。

    无论是否发生异常,finally 代码块中的代码总会被执行。

    在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

    finally 代码块出现在 catch 代码块最后

    实例

    public class ExcepTest{
      public static void main(String args[]){
        int a[] = new int[2];
        try{
           System.out.println("Access element three :" + a[3]);
        }catch(ArrayIndexOutOfBoundsException e){
           System.out.println("Exception thrown  :" + e);
        }
        finally{
           a[0] = 6;
           System.out.println("First element value: " +a[0]);
           System.out.println("The finally statement is executed");
        }
      }
    }
    
    //运行结果如下
    //Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
    //First element value: 6
    //The finally statement is executed
  • 相关阅读:
    Vmware 6.5:vmware vm高可用-vSphere HA & Fault Tlerance
    Redis 3.2.3: 集群3哨兵模式
    Mysql 5.7.18:主从复制,io优化
    Centos 7 x64 系统初始化
    javascript小实例,阻止浏览器默认行为,真的能阻止吗?支持IE和标准浏览器的阻止默认行为的方法
    javascript小实例,移动端页面中的拖拽
    javascript小实例,PC网页里的拖拽
    javascript小实例,在页面中输出当前客户端时间
    javascript小实例,编写一个方法,实现从n-m个数中随机选出一个整数
    javascript小实例,多种方法实现数组去重问题
  • 原文地址:https://www.cnblogs.com/humiao-0626/p/10840287.html
Copyright © 2020-2023  润新知