Java 异常处理是使用 Java 语言进行软件开发和测试脚本开发时不容忽视的问题之一,是否进行异常处理直接关系到开发出的软件的稳定性和健壮性。那么我们来具体了解一下JAVA异常方面的内容。
一、什么是异常。
导致程序非正常结束,或导致程序可能出错(中断运行的原因)可谓异常。比如说我们常用的qq有时候会因为某种原因自动关闭了,这可以理解是一种异常。
二、异常的种类
我们常见的异常可以分为两大类
1.运行时异常
比如:
(1)空指针异常
当一个对象没有实例化拿过来用时会出现这样的异常,这种异常在运行时会抛出“java.lang.NullPointerException”这样的异常。
如下代码:
package net.java.t;
/*
* 测试类
*/
public class Test {
//声明Test对象属性
private static Test t;
/**
*
主函数
*/
public static void main(String[] args) {
t.play();
}
public void play(){}
}
便会产生这样的异常。
(2)数组下标越界
这种异常是我们做练习中经常遇到的,因为当你定义了一个数组后,这个数组的大小就是固定的。
比如我们定义了这样一个数组int array[]=new int [8];
那么这个数组下边大小就只能从0到7当下标不在这个范围之内便产生异常。
如上面我们创建的数组当我们再输入这样的代码array[8]=89;时,便会抛出“java.lang.ArrayIndexOutOfBoundsException: 8”并指出下标8出现越界错误。
(3)栈溢出
当程序陷入死递归,死循环都会出现栈溢出,这也是一种常见的运行时异常,该异常会抛出“java.lang.StackOverflowError”这样的异常。
(4)类型转化错误
我们知道当两个类有继承关系,当要实例化父类对象时,可以用子类来new 一个,这种便是类型的自动转化,当子类要转化成父类类型时就必须强制转化。
如下:
public class A extends B{
}
B b=new A();
这样是正确的,但是当我们用两个没有任何关系的类这样做时,假设上面所得A类和B类没有继承关系,当程序运行时便会抛出“java.lang.ClassCastException: net.java.t.B cannot be cast to net.java.t.A”这样的异常。
从上面几个例子中,抛出的异常前面是异常的类型如java.lang.StackOverflowError
java.lang.ClassCastException等等,而后面的是异常根据你代码的一些提示,这个能让你更好的去发现出现的异常在什么地方,如上面例子中的“8”和“B cannot be cast to net.java.t.A”。
2.强制异常
强制异常便涉及到了try{}catch(){}异常处理机制。
所谓强制异常,便是出现异常,强制要你去处理这个异常,比如调用的方法中有未处理的异常(即方法中使用了throws异常类名),就要求我们必须去捕获这个异常并处理或者将这个异常再抛出,这也可以理解是对异常处理的一种方法。
比如我们实例化一个文件类对象f并调用创建新文件的方法如下:
File f=new File();
f.createNewFile();
第二句代码便是一个可能产生异常的语句(只是可能),因为当我们去创建一个新文件时要去指定它的路径,要是该路径不存在或者另外的原因使新文件不能产生,那么这样就会出现错误,所以在定义createNewFile()方法时便考虑到了这一点,所以在定义这个方法时用了throws异常类名下面是该方法定义代码:
public boolean createNewFile() throws IOException {
SecurityManager security = System.getSecurityManager();
if (security != null) security.checkWrite(path);
return fs.createFileExclusively(path);
}
可能我们会想这个异常从哪里来呢?在这里我们就很容易想到这也是自定义的一个东西果然在createNewFile()方法的返回值fs.createFileExclusively(path)调用的方法定义中我们可以看到这样的语句;
下面是这个方法的定义:
public abstract boolean createFileExclusively(String pathname)
throws IOException;
该方法继续抛出异常,我们可以找到后面一个自定义异常对象。
即throw 实例化的一个异常对象
throws是将异常抛出。
比如我们去定义这样一个方法:
public void test() throws Exception{
int index = 8;
int array[]=new int [8];
array[index]=10;
if(index>=8||index<0){
throw new Exception(“数组越界”);
}
当你去调用这个方法时便会提醒你是要用try{}catch(){}去捕获异常并处理还是把异常再抛出即add throws declaration or surround with try/catch
现在知道异常怎么来了吧。
3.关于try{}catch(){}finally{}的运用
这个语句用来发现异常并处理异常
try{}大括号中用来放可能出现的代码语句,若有异常catch(){}会去铺货该异常,并在{}中去处理
那要是try{}中有多个可能的异常存在呢?
catch(){}中的小括号有带异常类对象参数当有多个异常时我们可以用多个catch(){}并给catch小括号参数分别设置可能的对应的异常类对象参数。或者将该参数设置成Exception e 该异常类是所有异常类的父类,这这边会实现父类子类对象间的自动转型。
注意点:try()catch(){}语句,他只会执行捕获的第一个出现异常的代码语句,当第一个语句出现异常,它会去发现并捕获和处理,第二句代码就不会去执行。
而finally{}是都会去执行的代码语句块,不管是否出现了异常在finally中的代码都会被执行。
三.异常信息分析和程序调式
上面讲了java中的异常种类举了不少例子,也可以看出java中出现异常都会给我们一些提示信息,这会大大方便了我们去寻找错误。
一般异常信息分析和程序调式步骤可以如下:
1.根据异常类,来确定异常的类型(JDK的API)
2.异常的提示信息
3.找到出错的行(位置)【第一个类名是否是你定义的,如果不是,则再看下一行】
4.分析问题(System.out.println();)
5.修改代码
System.out.println();输出语句功能非常强大,是我们去调式程序的第一选择,比如上面例子的数组下标出现越界问题时,我们根据异常类java.lang.ArrayIndexOutOfBoundsException
知道它是数组下标越界异常,利用输出语句将数组长度输出并根据异常提示信息数字8,知道是下标8出现了错误,在去找到改行代码,分析为什么会出现这样的错误,发现了原来我们定义的这个数组长为8但数组下标从0开始所以最大只能到7,这样我们就很快很改正这个错误了。。
转载于:https://my.oschina.net/u/2367675/blog/425702
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109427.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...