什么是异常
异常是指程序可以编译,由于程序内部或外部的原因造成的问题。并不等同于错误。错误是指语法上的错误等导致代码不能编译。
java中所有的异常类都是从Throwable继承来的。Error类是jvm内部出现资源耗尽等问题时报的异常,这类异常往往无法解决。我们这里所讲述的异常都是Exception类中的。
异常可以分为运行时异常(RuntimeException)和已检查异常(IOException等)。
运行时异常往往编译没有问题,在运行时出现错误的异常。例如:数组越界等问题。
运行结果为:
已检查异常是代码本身没有问题,但有可能会出现一些问题,在编写代码时需要主动抛出异常或对异常进行捕获。例如:文件找不到异常。
类型异常详细分类参照:菜鸟教程之异常处理
怎么处理异常
一般对异常进行简单的处理,有两种处理方式,捕获和抛出。
1. 捕获异常:使得异常不被抛到方法之外,也不需要throws规范
try{
//可能发生异常的代码
}
catch(异常的类型声明){
//发生异常时执行的代码
}
finally{
//无论是否发生异常都会执行的代码
}
package com.ar.dgh.tese4;
import java.io.UnsupportedEncodingException;
public class Test{
public static void example()
{
String str = null;
byte[] bytes={122,121,120};
try {
str = new String(bytes,"utf-8");
} catch(UnsupportedEncodingException uee) {
}
System.out.println(str);
}
public static void main(String[] args){
example();
}
}
运行结果为:
zyx
finally可以省略,catch可以有多个,捕获多个不同的异常。也可以只有try代码块。
2. 抛出
throw
抛出的是异常的对象,存在在方法体内,执行一定会抛出异常。
throws
抛出的是异常的类型,声明在方法体外,可能会发生异常。
import java.io.UnsupportedEncodingException;
public class Test{
public static void example() throws UnsupportedEncodingException
{
String str = null;
byte[] bytes={122,121,120};
str = new String(bytes,"utf-8");
System.out.println(str);
}
public static void main(String[] args){
example();//此时的方法是不能够被调用的,显示异常
}
无论是抛出异常还是捕获异常都是消极的处理方式,而要解决异常还需要程序员来解决。
自定义异常
在遇到无法用异常类描述的错误时,可以自己定义异常。
定义一个派生于Exception的类,或者其子类的类
定义的类包含两个构造器:默认的构造器,带有详细描述信息的构造器