java 异常

来源:互联网 发布:苏州爱知科技福利待遇 编辑:程序博客网 时间:2024/06/15 12:16

认识java异常

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

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

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

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

这里面有的是用户引起的,有的是程序错误引起的,还有的则是物理错误引起的!

要理解java异常是如何工作的,就必须如下三种异常:

  • 检查性异常
  • 运行时异常
  • 错误

处理异常

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

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

多重捕获块

一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
多重捕获块的语法如下所示:

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

上面的代码段包含了 3 个 catch块。
可以在 try 语句后面添加任意数量的 catch 块。
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。

finally关键字

finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:

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

常见异常

  1. java.lang.NullPointerException(空指针异常)
      调用了未经初始化的对象或者是不存在的对象
     
  2. java.lang.ClassNotFoundException
    指定的类不存在

    这里主要考虑一下类的名称和路径是否正确即可,通常都是程序试图通 过字符串来加载某个类时可能引发 异常

  3. java.lang.ClassCastException
    数据类型转换异常

    当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常。

  4. java.lang.IndexOutOfBoundsException
    数组下标越界异常

  5. java.lang.NumberFormatException
    字符串转换为数字异常

    当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常.如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。
    但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理.

  6. java.lang.ArithmeticException
    数学运算异常

    当算术运算中出现了除以零这样的运算就会出这样的异常。

throws关键字

如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

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

一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

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

自定义异常

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

  • 所有异常都必须是 Throwable 的子类。
  • 如果希望写一个检查性异常类,则需要继承 Exception 类。
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

    可以像下面这样定义自己的异常类:

class MyException extends Exception{}

例子:

package com.lang.exception;import javax.swing.plaf.metal.MetalScrollBarUI;class MyException extends Exception {    public MyException(String msg) {        super(msg);    }}public class ExceptionDemo {    public static void main(String[] args) {        try {            throw new MyException("自定义异常");        } catch (Exception e) {            System.out.println(e); // 输出:com.lang.exception.MyException: 自定义异常        }    }}
原创粉丝点击