异常

java中,有两个类用于处理错误:ErrorException.

Error处理的是java 运行环境中的内部错误或者硬件问题,比如内存资源不足、系统崩溃等。对于这种错误,程序一般无能为力,除了退出运行外别无选择。

而对于Exception,他处理的是因为程序设计的瑕疵而引起的问题或者外在的输入等引起的一般性问题。例如在除法中,除数为零以及网络不稳定引起的读取网络问题等,都可以通过Exception来处理。

对于异常的分类我们用一个图来讲述。请看下图。

213406585.png

异常主要分为两类:ErrorException类其都是Throwable类的子类

Error主要有以上四个子类。见上图。

Exception类主要分为RuntimeExceptionIOException、其他异常。

这里主要介绍一下RuntimeExceptionIOException

RuntimeException异常的原因主要包括以下几种:

(1)错误类型转换。

(2)数组越界访问。

(3)数学计算错误。

(4)试图访问一个空对象。

引起IOException异常的原因包括:

(1)指定文件未找到异常

(2)试图从文件结尾处读取信息。

(3)试图打开一个不存在或者格式错误的URL

下面一一进行举例说明。

(1)错误类型转换(ClassCastException 

package Practice;
public class TestClassCastException {
public static void main(String[] args) {
//定义一个包装类Integer的对象
Object x = new Integer(0);
//当试图将对象强制转换为不是实例的子类时,即下面转换成String类型则抛出该异常。
System.out.println((String)x);
}
}

报异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer

at Practice.TestClassCastException.main(TestClassCastException.java:7)

(2)数组越界访问(ArrayIndexOutOfBoundsException)

package Practice;
public class TestArrayIndexOutOfBoundsException {
public static void main(String[] args) {
//定义一个长度是3的一位数组,并且从下标0到3给其赋值,在输出赋值结果
int[] niArr = new int[3];
for(int i = 0;i<4;i++){
//数组长度为3,下标从0到2但是我们给其赋值是从0到3
niArr[i] = i;
System.out.println(niArr[i]);
}
}
}

报异常:

0

1

2

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

at Practice.TestClassCastException.main(TestClassCastException.java:6)

(3)数学计算异常(ArithmeticException )

package Practice;
public class TestArithmeticException {
public static void main(String[] args) {
//我们设计一个输出为零的除法运算,输出结果
int a = 4;
int b = 0;
int c = a/b;
System.out.println("c:"+c);
}
}

报异常:

Exception in thread "main" java.lang.ArithmeticException: / by zero

at Practice.TestArrayIndexOutOfBoundsException.main(TestArrayIndexOutOfBoundsException.java:7)

(4)试图访问一个空对象(NullPointerException)

package Practice;
import java.util.*;
public class TesNullPointerException {
public static void main(String[] args) {
//定义一个Date类型数据
Date date = null;
//调用该对象的getTime()方法并输出结果
System.out.println(date.getTime());
}
}

报异常:

Exception in thread "main" java.lang.NullPointerException

at Practice.TestArithmeticException.main(TestArithmeticException.java:6)

(5)指定文件未找到异常(FileNotFoundException )

package Practice;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
public class TestFileNotFoundException {
public static void main(String[] args) throws IOException {
//定义一个文件
File file = new File("f:/b.txt");
//创建一个文件输入流对象
FileInputStream fis = new FileInputStream(file);
//输出出入流读到的内容
System.out.println(fis.read());
}
}

报异常:

Exception in thread "main" java.io.FileNotFoundException: f:\b.txt (系统找不到指定的文件。)

at java.io.FileInputStream.open(Native Method)

at java.io.FileInputStream.<init>(Unknown Source)

at Practice.TestFileNotFoundException.main(TestFileNotFoundException.java:10)

其实异常还有很多我就不一一举例了。

于异常的划分还可以大致分为三类:

(1)运行时异常

(2)编译时异常

(3)其他异常

(1)对于运行时异常,就是我们所说的RuntimeException,在程序运行时才会报错。

(2)对于编译异常,在程序编写时,编译器就会报错,在编译时就得处理掉,否则程序都无法到运行阶段。例如上面一个程序,就有一个编译异常,我们在main的参数后面抛出了了一个IOException 异常。如果去掉,程序会报错。有关异常的处理有待后文。