JAVA:异常

2020-09-15  本文已影响0人  确认过眼神啊

什么是异常

程序中的异常

异常的分类

  public void method(){
    try{
          // 代码段1
          // 产生异常的代码段2
    }catch(异常类型ex){
        // 对异常进行处理的代码段3
    }finally{
        // 代码段4
    }
}

8.使用try-catch块捕获并且处理异常

  public void method(){
    try{
        // 代码段
    }catch(异常类型ex){
      // 对异常进行处理的代码段
    }
  }

9.多重catch块

  public void method(){
  try{
      // 代码段
      // 产生异常 
  }catch(异常类型1 ex){
    // 对异常进行处理的代码段
  }catch(异常类型2 ex){
    // 对异常进行处理的代码段
  }catch(异常类型3 ex){
    // 对异常进行处理的代码段
  }
// 代码段
}

10.try-catch-finally

public void method(){
  try{
      // 代码段1
      // 产生异常的代码段2
  }catch(异常类型ex){
    // 对异常进行处理的代码段3
    return;
  } finally{
  // 代码段4
  }
}

11.常见的异常类型

常见异常类型.png

12.throw & throws

    public void method()throws Exception1,Exception2,...,ExceptionN {
    // 可能产生异常的代码
}

13.自定义异常

15.Java常见异常类型及原因分析
一.NullPointerException异常
 顾名思义,NullPointerException是空指针异常.但是在Java中没有指针,怎么会有空指针异常呢?
 在C++中,声明的指针需要指向一个实例(通过new方法构造),这个指针可以理解为地址.在Java中,虽然没有指针,但是有引用(通常称为对象引用,一般直接说对象),引用也是需要指向一个实例对象(通过new方法构造)的,从这种意义上说,Java中的引用与C++中的指针没有本质的区别,不同的是,处于安全的目的,在Java中不能对引用进行操作,而在C++中可以直接进行指针的运算,例如book++等.
 所以这里的NullPointerException虽然不是真正的空指针异常,但本质上差不多,是引用没有指向具体的实例,所以当访问这个引用的方法的时候就会产生这种异常.例如下面的代码:

 String  str = "这是衣蛾测试的字符串!";
System.out.println(str.length());
// 这段代码没有问题,如果改成下面的代码:
 String str = null;
 System.out.println(str.length());
// 就会产生NullPointerException异常了:

\color{red}{Exception in thread "main"}\color{blue}{java.lang.NullPointerException } \color{red}{ at com.diandian.test.Test.main(}\color{blue}{Test.java:35}\color{red}{)}
那么这种异常通常是如何产生的呢?比较多见的是下面的两种情况:
a) 把调用某个方法的返回值直接赋值给某个引用,然后调用这个引用的方法.在这种情况下,如果返回的值是null,必然会产生NullPointerException异常.
例如:

// 声明一个People类,并打印出该对象中的Name值.
public static void main(String[] args){
  People p = null;
  p.setName("张三");
  System.out.println(p.getName());
}

说明:这个时候p就会出现空指针异常,因为这里只是声明了这个People类型的对象并没有创建对象,所以它的堆里面没有地址引用,切忌你哟啊用对象调用方法的时候一定要先创建对象.
b) 在方法体中调用参数的方法
 这种情况下,如果调用方法的时候传递进来的值是null,也会产生NullPointerException异常.要解决这种异常,只需要检查异常出现在第几行(通常在集成开发环境中会提示用户错误发生在第几行),然后查看调用了哪个对象的方法,然后检查这个对象为什么没有赋值成功即可.
 要避免程序产生这种异常,比较好的解决方法时在调用某个对象的方法时候判断这个对象是否为空,如果可能,则增加判断语句,例如上面的代码可以写成:

  if(str!=null){
  System.out.println(str.length());
}else{
  System.out.println(0);
}

二.ClassCastException异常
 从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.
这种异常时如何产生的呢?举个例子.

// Animal 表示动物,Dog表示狗,是动物的子类,Cat表示猫,是动物的子类.
Animal a1 = new Dog();
Animal a2 = new Cat();
Dog d1 = (Dog)a1;
Dog d2 = (Dog)a2;

 第三行和第四行代码基本相同,从字面意思看都是动物(Animal)强制转换为狗(dog).但是第四行代码将产生java.lang.ClassCastException.原因是把一个Cat转换成Dog不可以,而第三行中是把Dog转换成Dog,所以可以.
 从上面的例子看,java.lang.ClassCastException是进行强制类型转换的时候产生的异常,
 强制类型转换的前提是父类引用指向的对象的类型是子类的时候才可以进行强制类型转换,如果父类引用指向的对象的类型不是子类的时候将产生java.lang.ClassCastException异常.
 遇到这样的异常的时候如何解决呢?如果你知道要访问的对象的具体类型,直接转换成该类型即可.如果不能确定类型可以通过下面的两种方式进行处理(假设对象为o):

常见异常类

异常 说明
RuntimeException Java.lang包中多数异常的基类
ArithmeticException 算术错误,如除以0
IIIegalArgumentException 方法收到非法参数
SecurityException 试图违反安全性
ClassNotFoundException 不能加载请求的类
AWTException AWT中的异常
IOException I/O异常的根类
FileNotFoundException 不能找到文件
EOFException 文件结束
IIIegalAccessException 对类的访问被拒绝
NoSuchMethodException 请求的方法不存在
InterruptedException 线程中断
上一篇 下一篇

猜你喜欢

热点阅读