zoukankan      html  css  js  c++  java
  • Java 异常+try catch finally+throw与throws+自定义异常

    一.异常概述

    1 异常的概述
    开发程序,在运行时,就不可能避免会出错,此时jvm会将这个出错问题反馈给你
    假定jvm使用一些特殊数字来反馈异常,这种措施存在很多问题
    -1 = 空引用异常
    2- = 下标越界异常
    -3 hhhhhhh
    -4

    public int send(){
    return -5;
    }

    public String send(){
    return "网络中断";
    }

    不足:
    1 方法本身要返回处理的结果,这样不没办法区别返回的值是代表出错还是处理的正常结果
    2 反馈的信息不够

    java语言采用另一种机制来反馈出错的问题,这就是异常机制.
    异常机制,是将程序运行过程中遇到的所有问题都封装成一个异常对象,每个对象都属于某种异常类型,知道异常类型你就知道程序出了什么。

    二.异常的分类


    异常的分类
    1) Error:错误,是非常严重的问题,没办法处理,不要试图去解决这些问题,例如内存溢出
    2)Exception: 已检查异常,程序已经经过检查,但是由于外界因素导致仍然不可避免的问题,要求开发者必须未雨绸缪的处理这些异常
    3) RuntimeException:未检查异常,是由于程序员没有细致检查程序导致的异常,这种异常编译器把所有责任推给程序员,即编译器不会帮你检查,也不要求你必须处理

     

     

    三.try与catch

    try -- 试着去做
    catch -- 捕获

    import java.io.*;
    import javax.swing.*;
    /**
    演示异常的定义
    */
    public class TestTryCatch{
    
    public static void main(String[] args){
    try{
    FileReader f = new FileReader("C:\a.txt");//去读取一个不存在的文件的内容
    int i = 10;
    System.out.println(i);
    }catch(Exception e){
    //出了问题处理代码
    e.printStackTrace();//打印方法栈中执行方法的整个过程的踪迹
    
    //System.out.println("没有该文件");
    JOptionPane.showMessageDialog(null,"没有该文件");
    }
    
    
    }
    
    }

     

    四.finally

    最终执行的,不管程序有没有错,最终都执行的代码
    finlly{}里面的代码最终得到执行,经常在里面做一些释放资源的操作,例如文件流的关闭,数据库连接的关闭
    最好不要在finally进行返回值

    try{
    turnOn();
    cooking();//异常对象被抛出
    System.out.println("上菜,开饭了");
    }catch(Exception e){
    e.printStackTrace();
    JOptionPane.showMessageDialog(null,"吃泡面");
    }finally{
    turnOff();//不管有没有异常,最终都会执行这个代码
    }

     


    五.多异常处理

    在try内部执行的语句可能会抛出多个异常,这些我们可以用多个catch并排一起处理
    1) 分开处理的方式适用于,2句代码无关

    try{
    Class.forName("Person");//手动加载一个类
    }catch(ClassNotFoundException e){
    e.printStackTrace();
    }
    
    try{
    FileReader fr = new FileReader("C:\a.txt");
    }catch(FileNotFoundException e){
    e.printStackTrace();
    }
    
    2)有关联的多异常处理
    try{
    FileReader fr = new FileReader("C:\a.txt");
    char c = (char)(fr.read());
    }catch(FileNotFoundException e){
    e.printStackTrace();
    }catch(IOException e){
    e.printStackTrace();
    }

     

    六.异常多态

    1 多个catch,每个catch的异常如果有父子类关系,则可以只捕获父类异常就可以
    2 不要试图把所有子类异常提升为父类异常去处理,例如提升为Exception,这样子就没办法具体问题具体处理,以下是一个不好的示例

    try{
    Class.forName("Person");
    FileReader fr = new FileReader("C:\a.txt");
    char c = (char)(fr.read());
    }catch(Exception e){
    e.printStackTrace();
    //处理类找不到的异常
    //处理文件找不到的异常
    //异常读写时IO异常
    }

     


    3 子类异常不能放在父类异常后面,以下代码不能编译通过

    try{
    Class.forName("Person");
    
    FileReader fr = new FileReader("C:\a.txt");
    char c = (char)(fr.read());
    }catch(ClassNotFoundException e){
    e.printStackTrace();
    }catch(IOException e){
    e.printStackTrace();
    }catch(FileNotFoundException e){
    e.printStackTrace();
    }

     

    七.throws与throw

    当前程序如果没有能力或职责处理异常,就不进行try..catch,而是往上抛给调用者
    throws - 用来声明一个方法有可能有风险(异常),会将风险抛给调用者,调用者需要对这个异常负责
    throw - 用来真正的抛出异常对象,真正的动词,一般和throws合在一起使用

    八.重写时异常抛出的特点

    1 子类重写父类的方法,可以不抛异常,或者抛出同样的异常
    2 子类重写父类的方法,不能抛出比父类方法更宽泛的异常
    3 子类重写父类的方法,不能抛出比父类方法更多的不相关的异常

    九.自定义异常

    在做项目的过程中,要实现很业务功能,实现这些功能的时候,可能有一些问题,例如用户名不正确,这种问题需要提示系统使用者,此时我们可以封装一个自己的自定义的异常,然后抛出去

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

     

    十.异常的使用建议

    1)不要过分的细化处理
    2)利用异常的层次结构处理(多态)
    3)不要压制异常(不要空处理)
    4) 报告不正常情况时,抛异常比返回数值或返回null好
    5) 不要怕抛出异常(不能处理的就抛出,尽量让最外围调用者来处理通知用户出错)

  • 相关阅读:
    [jdk] JDK1.5新特性
    [maven] maven介绍
    [Ant] bulid.xml配置详解
    [spring] spring面试题
    .net(C#)时间相减、C#计算时间间隔
    如何记录应用程序日志
    交换机、集线器、路由器区别和使用浅谈
    ASP.NET 在域控制器上使用默认 ASPNET 帐户不能正常运行
    .NET 4中Entity Framework简介
    WCF传输性能测试
  • 原文地址:https://www.cnblogs.com/Transkai/p/10351117.html
Copyright © 2011-2022 走看看