• Java中的异常处理


           在Java这种纯面向对象编程语言中,有着“一切皆对象”的说法。所以,java也是通过类来描述程序出现的异常现象。在编译的时候,一些严重的错误,比如说语法错误,会被虚拟机检测出来。而异常指的是程序运行过程中,受到了一些阻碍,无法继续进行下去。这个时候就会抛出异常,从当前位置向上级一层一层地抛出。

    1、先看一个简单例子:

     1 package myException;
     2 
     3 public class Demo_1 {
     4 
     5     public static void main(String[]args) {
     6         Test test1=new Test();
     7         int num = test1.div(2,0);
     8         System.out.println(num);
     9         System.out.println("over......");
    10     }
    11 }
    12 
    13 class Test
    14 {
    15     public int div(int a, int b){16         return a / b;
    17     }
    18}

    如果程序在进行整除运算时,不小心除了0,会发生什么现象?

     

    抛出了算术异常,程序立刻终止,因为最后一句“over......”也没有打印出来。

    2、try catch语句

    既然有了异常,我们就要对其进行处理。

     

     1 package myException;
     2 
     3 public class Demo_1 {
     4 
     5     public static void main(String[]args) {
     6         Test test1=new Test();
     7         try {
     8               int num = test1.div(2,0);
     9               System.out.println(num);
    10               System.out.println("exception......");
    11         }catch(ArithmeticException e) {
    12             e.printStackTrace();
    13         }
    14         System.out.println("over......");
    15     }
    16 }
    17 
    18 class Test
    19 {
    20     public int div(int a, int b){
    21         return a / b;
    22     }
    23 }

     

           发现:如果没有使用try catch语句,出现问题时,后面的代码都无法执行。如果加上try catch语句,那么语句块以外的还能够继续执行,但是语句块内部的代码,从出现问题的地方开始,都不能执行。

           那么普通的代码块可以屏蔽这个错误,使得代码块外面的继续执行吗,见下面代码:

    package myException;
    
    public class Demo_1 {
    
        public static void main(String[]args) throws ArithmeticException{
            Test test1=new Test();
            {
            int num = test1.div(2,0);
            System.out.println(num);
            System.out.println("over......");
            }
            System.out.println("happy");
            
        }
    }
    
    class Test
    {
        public int div(int a, int b) {
            return a / b;
        }
    }

    结果是不可以,看来只有 try catch语句块可以。

     

    3、throw和throws

     1 package myException;
     2 
     3 public class Demo_1 {
     4 
     5     public static void main(String[]args) throws ArithmeticException{
     6         Test test1=new Test();
     7         int num = test1.div(2,0);
     8         System.out.println(num);
     9         System.out.println("over......");
    10     }
    11 }
    12 
    13 class Test
    14 {
    15     public int div(int a, int b) throws ArithmeticException{
    16         if(b == 0)
    17             throw new ArithmeticException();
    18         return a / b;
    19     }
    20 }

     

    基本的用法就是这样的,但是有几个注意点:

    (1)throw方法体的内部,后面必须加切切实实new出来的对象,而throws用在方法名之后,不进入函数体,并且后面可以跟一个或多个类名(异常类),逗号隔开。

    (2)如果一直向上抛出,而不catch,则会把异常抛给java处理机。

    4、RuntimeException的特殊性

            RuntimeException的子类有很多,比如上面的ArithmeticException,还有一些常见的比如IndexOutOfBoundsException(数组下标越界),NullPointerException(空指针异常)。为什么说它特殊呢?这种类型的异常通常都是由代码不当引起的,所以出现该异常时,希望程序停止,让维护人员进行代码的修改。所以在函数体内抛出的异常,函数名上是不需要申明的:

    1 class Test
    2 {
    3     public int div(int a, int b) {
    4         if(b == 0)
    5             throw new ArithmeticException();
    6         return a / b;
    7     }
    8 }

    所以这样写也是合法的。当然,函数名后面加上“throws ArithmeticException”也是可以的。

    如果是非RuntimeException或者其子类的,必须处理,或者逐层抛出再处理。比如进行文件操作,或者连接数据库的时候:

    进行某些操作时,必须抛出异常,或者处理异常。比如上述代码如果这样写,编译都不会通过,eclipse报错“Unhandle Exception type ClassNotFoundException”。

    5、Throwable类

    在学习自定义异常类之前,先学习一下Throwable类。从字面上理解,“可以抛”的类,Throwable是所有异常类的基类,他的直接子类有Error类,Exception类。Throwable中的类主要是一些可以打印异常信息的方法,比如说 getMessage(), printStackTrace().他的子类可以根据具体情况覆盖重写这些方法。

    6、自定义异常类

    1 class DefineException extends Exception{
    2     public DefineException() {
    3         
    4     }
    5     public DefineException(String str) {
    6         super(str);
    7     }
    8 }

    一般的格式就是这样,细节可以修改修改,可以根据实际情况覆盖重写Exception或者Throwable类的方法。当然,自定义的异常类必须要继承Throwable或者Exception。因为要想和throw、throws关键字搭配使用,必须是Throwable及其子类。

    7、finally

    finally一般和try catch相配合,在finally里处理一些必须要做、特别重要的信息,即使异常发生,finally里面的函数还是会被执行。特别是读写文件后的关闭、连接数据库的断开,比如下面的代码:

     1 package com.ph;
     2 import java.sql.Connection;
     3 import java.sql.DriverManager;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 public class Test1 {
     7 
     8     public static void main(String[]args) {
     9         PreparedStatement ps=null;
    10         Connection ct=null;
    11         ResultSet rs=null;
    12         try {
    13             //1.加载驱动
    14             Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    15             //2.得到链接 127.0.0.1:1433
    16             ct=DriverManager.getConnection
    17                     ("jdbc:sqlserver://127.0.0.1:1433;databaseName=Mytest","sa","123456");
    18         
    19             ps=ct.prepareStatement("select * from course");
    20             rs=ps.executeQuery();
    21             while(rs.next()) {
    22                 String cno=rs.getString(1);
    23                 String cname=rs.getString(2);
    24                 String tno=rs.getString(3);
    25                 System.out.println("cno "+cno+" cname "+cname+" tno "+tno);
    26             }
    27         }catch(Exception e) {
    28             e.printStackTrace();
    29         }finally {
    30             try {
    31                 if(rs != null) rs.close();
    32                 if(ps != null) ps.close();
    33                 if(ct != null) ct.close();
    34             }catch(Exception e) {
    35                 e.printStackTrace();
    36             }
    37         }
    38     }
    39 }

    即使程序出错,也可以保证断开数据库连接,释放所占用的数据库资源,防止资源浪费。

    仅作为学习笔记,如有错误,欢迎批评指正。

  • 相关阅读:
    KALI LINUX 核心概念讲解,持续更新
    KALI LINUX 工具大全之密码破解 --- BruteSpray ( 暴力喷雾 )
    android studio的 gradle 依赖同步错误解决方法
    安卓逆向的初步研究--从某恋app入手
    nc浏览器的十宗罪
    手机重要文件目录(换新机可能要用到)
    国产手机的谷X服务
    安卓手机设置的那些琐事
    办公中遇见的那些问题
    装系统遇到的那些问题
  • 原文地址:https://www.cnblogs.com/phdeblog/p/9153991.html
Copyright © 2020-2023  润新知