本文实例讲述了Java抛出异常与自定义异常类。分享给大家供大家参考,具体如下:
异常处理常用方法:
常用的异常处理方法有:
用途:
众所周知,当程序运行过程中,如果遇到了错误(比如数组下标越界,空指针等)程序就会自动终止,但这种错误一般是偶然的,可能是用户输入不呵呵程序编写者的意图导致,而不是程序本身问题,这是我们要做的,是让操作者知道发生了什么事情,而不是直截了当的结束程序,这时我们就用到了异常处理(语句发生错误时,只抛出异常,而不结束程序)。
这里一源码为例 详细介绍一下:
一、try()catch() 语句:
原理剖析:
将可能发生异常的语句放在 tr() 中,运行到try这一行时,如果无异常,则正常执行 try() 中语句,执行完 try() 内语句之后,程序自动跳过 catch() 语句,去执行 catch() 之后的语句。
反之,如果在执行 try() 内语句时,出现异常情况,则执行跳转到catch()语句中,进行异常处理,一处处以之后不再回到try的()内,而是结束try()catch()内的所有操作,去运行后面的catch语句后面的语句。
举个例子就明白了:
public class ClassText { public static void main(String[] args) { int textArray[] = new int[3];//用于测试数组越界异常的数组 int j;//用来使数组月结的下标 try { for ( j = 0; j < (textArray.length + 1); j++) {//有+1可见 该测试一定越界 textArray[j] = (int) Math.random()*10 ; } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } System.out.println("但是上面抛出异常后\n程序并没有直接结束\n" + "而是跳出try()catch()语句\n正常执行本条输出语句"); } }
输出如下:
可以看到,发生异常后依然执行了后面的输出语句。
二、throw / throws 语句
很多出初学者一直把throw / throws 语句,看作两种不同的异常处理方法,其实他们可以看作一个整体,throw语句可以看作异常的处理语句,而throws我们则可以将其类比为‘extends' 它的主要作用是声明该方法(体内存在throw语句的方法,需要throws或者说我们可以看作需要‘继承/链接',该异常类型的原型),举个例子大家就明白了:
private static void textThrow_Throws(int radius) throws Exception { if ( radius < 0 ) {//如果半径小于0 则不符合常理进行异常处理 throw new Exception(); } }
这样一来throw/throws 的用法就显而易见了。
但是在写完throw/throws 语句后,异常处理并没有结束,因为这里只是简单声明了,我的这个成员方法中的可能会抛出异常,并没有写具体该如何处理这个异常,所以这是在主函数中,就要用try()catch()将他们包围。描述好具体的处理异常方法:完整测试代码如下:
public class ClassText { public static void main(String[] args) { int radius ;//定义一个叫做搬进的变量作为测试 radius = -5;//常理可知半径使正数 try { textThrow_Throws(radius); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("程序正常结束~"); } private static void textThrow_Throws(int radius) throws Exception { if ( radius < 0 ) {//如果半径小于0 则不符合常理进行异常处理 throw new Exception(); } } }
我们再看看输出范例:
三、自定义异常类
自定义异常类是逃不开,也是新手接触最少的,其实它的基本使用方法还是很简单的,自定义异常处理类,只包括两部分:(1)、类的构造方法,构造方法的建立则非常简单,其实只要继承父类(比如 Exception类 )的构造方法即可。(2)、重写toString()函数,这是最重要的一点,再toString函数中,描述具体发生了什么错误导致了异常的抛出。这样一来用户才知道究竟是发生了什么错误
这里结合throw/throws 举个例子就很好明白了:
1.首先自定义一个异常类:
public class ArrayIndexException extends Exception{ public ArrayIndexException() { // TODO Auto-generated constructor stub super(); } @Override public String toString() { // TODO Auto-generated method stub return"程序发生了越界异常! 请检查下标变化!"; } }
如上所示就是一个最基本的自定义异常类 ,它继承了Exception 并且重写了构造方法以及toString方法
2.现在我们尝试再主函数中调用它
public class ClassText { public static void main(String[] args) { int textArray[] = new int[3];//用于测试数组越界异常的数组 try { textSetArray(textArray);//调用下方数组赋值方法 } catch (ArrayIndexException e) { // TODO: handle exception e.printStackTrace();//如果发生了异常 则抛出自定义数组越界异常 } System.out.println("go on !"); for(int j = 0 ; j < textArray.length ; j++ ) System.out.print(textArray[j] + "\t");//再越界之前的数成功赋值 } private static void textSetArray(int[] textArray) throws ArrayIndexException{ for ( int j = 0; j < (textArray.length + 1); j++) {//有+1可见 该测试一定越界 textArray[j] = 5 ;//给数组原属赋值 } } }
如上所示,如果发生了异常,这才catch()语句中声称自定义的异常对象,并输出具体信息:
java异常的处理大概就这些类型,如果有疑问可以给我留言我再完善。
更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因
"CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误
问题内容: 我试图在Netbeans中重构一个大型程序,但我有点迷茫。我从来没有非常模块化,但是现在通过实际学习如何做到这一点来尝试纠正这种情况,并在将来纠正这种情况。不幸的是,我在将某些教程翻译成我的程序时遇到了麻烦。所以我希望这里有人可以帮忙。目前,我正在尝试分解一部分采用特定格式的文件并制成表格的代码。我知道我需要创建一个类并使用它来创建表对象,但是我不确定如何做。我有一个主文件,用于获取文
问题内容: 我目前正在使用play2框架。 我有几个正在抛出的类,但是play2s全局处理程序使用throwable而不是异常。 例如我的一门课是抛出一个。我是否可以检查可抛物体(如果是)? 问题答案: 您可以使用它来检查它是否存在。 例: 假设是参考。
如果 Java 提供的内置异常类型不能满足程序设计的需求,这时我们可以自己设计 Java 类库或框架,其中包括异常类型。实现自定义异常类需要继承 Exception 类或其子类,如果自定义运行时异常类需继承 RuntimeException 类或其子类。 自定义异常的语法形式为: 在编码规范上,一般将自定义异常类的类名命名为 XXXException,其中 XXX 用来代表该异常的作用。 自定义异
我是一名Java编程新手(实际上已经在学习),我对如何处理不同的消息有些怀疑。 我的目标是将这些不同的消息包含在同一个类(CustomExcpse类)中,以避免在从其他类抛出新CustomExceptions的每个方法上一遍又一遍地编写相同的字符串。 到目前为止,我编码: > 一个自定义异常类,它从异常扩展而来,具有不同的消息(在示例中只有两个,但还有更多)作为Strings包含,当然还有构造函数