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

    2017-10-16 19:39:57

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

    比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

    异常发生的原因有很多,通常包含以下几大类:

    • 用户输入了非法数据。
    • 要打开的文件不存在。
    • 网络通信时连接中断,或者JVM内存溢出。

    一、程序的问题:Throwable

    ~ 错误:ERROR,不处理,这种问题一般比较严重,比如内存溢出等,需要进一步解决;

    ~ 异常:Exception

         * 编译期的异常:不是RuntimeException的异常都需要也是必须被处理的,如果不处理编译器不能通过。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。

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

    如果程序出现问题,但是程序员没有作出任何处理,最终JVM会作出默认的处理。

    也就是把异常的名称,原因以及出现的行号等信息输出在控制台上。

    同时会结束程序。

    二、解决方法

    • try...catch...finally...
    try
    {
          可能出现问题的代码; 
          尽可能少;      
    }
    catch(异常名 变量1)
    {
          针对问题的处理;
    }
    catch(异常名 变量2)
    {
          针对问题的处理;
    }
    finally
    {
          无论有无异常都会执行,一般只在文件关闭,断开网络连接时使用;
    }
    

    * 产生异常对象并中断当前执行的代码,抛出异常对象。

    * 自动按程序中的catch的编写顺序查找“最接近的”异常匹配,一旦找到就认为当前的异常已经得到控制,不再进一步搜索。另外,catch中必须对相应的异常作出处理,否则便失去了意义。

    * 若有匹配则执行相应的处理代码,然后继续执行try块之后的代码,否则的话,这个没有被捕获的异常将进行默认的异常处理,由JVM进行处理,在控制台输出相关信息,并退出程序的运行。

    * 无论什么情况都不会返回出错的地方继续执行。

    * 能明确的异常尽量明确,不要只用大的Exception来处理

    * 目前也可以使用catch(异常1 | 异常2 |... 异常名),来进行多种异常的处理。但是,处理方式是一致的,并且多个异常间必须是平级关系。

    * 异常的常用方法:e.getMessage():返回异常的消息字符串

              e.toString():返回异常的简单信息描述,“包括类的全路径名:错误名 时间”

              e.printStackTrace():获取异常的简单信息描述,相当与调用toString方法,并且还会输出行号的信息

    * finally前退出JVM的话,则不会执行finally;如果前面有return ,则依然会执行finally语句,在执行完后在回去进行返回,且不会改变原返回路径中的返回值。

    • throws/throw

    如果一个方法没有捕获一个编译期异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。会将方法中的异常抛给调用者处理。

    也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

    import java.io.*;
    public class className
    {
      public void deposit(double amount) throws RemoteException
      {
        // Method implementation
        throw new RemoteException();
      }
      //Remainder of class definition
    }
    

    三、自定义的异常

    在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。

    • 所有异常都必须是 Throwable 的子类。
    • 如果希望写一个编译时异常类,则需要继承 Exception 类。
    • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
    • 构造方法有两个一个无参,一个有参,主要用来把异常信息打印到控制台上。
    public class MyException extends Exception
    {
    public MyException(){};
    public MyException(String message) { super(message); }
    }

    四、异常在继承中的注意事项

    • 子类重写父类方法的时候,子类必须抛出与父类一致的异常或者父类异常的子类(父亲坏,子类能更坏)
    • 如果父类方法没有异常抛出,那么子类中覆盖的方法也不可以将异常抛出,可以使用try块进行处理
  • 相关阅读:
    JavaWeb图片显示与存储
    sql将日期按照年月分组并统计数量
    response的作用
    TCP/IP学习笔记(1)-----基本概念
    TCP/IP学习笔记(2)---数据链路层
    TCP/IP学习笔记(3)----IP,ARP,RARP协议
    TCP/IP学习笔记(4)------ICMP,ping,traceroute
    TCP/IP学习笔记(5)------IP选路
    如何运行简单的scrapy
    difference among String,StringBuilder,StringBuffer
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/7678863.html
Copyright © 2011-2022 走看看