public class TestSystemException1{
public static void main(String args[]){
int a=0,b=5;
try{
System.out.println(b/a);
}//以零为除数,引发系统定义的算术异常
catch(Exception e){ //catch块捕获异常
System.out.println(e.toString()); //输出异常的具体信息
}
System.out.println("a+b="+(a+b)); //出现异常后,正常语句能被执行
}
}
public class TestSystemException1{
public static void main(String args[]){
int a=0,b=5;
System.out.println(b/a);//以零为除数,引发系统定义的算术异常
System.out.println("a+b="+(a+b)); //出现异常后,正常语句不能被执行
}
}
比较上面两种代码 可以看到有try-catch的代码较好,因为出现异常时,它仍然可以执行try-catch模块后的代码
try-catch就是java中的异常处理,要用此处理机制,首先要有异常抛出,所谓种萝卜,坑挖好了,没萝卜种子,这不是坑人吗
不过以上代码中的异常是系统异常,系统定义好的异常出现异常时会自动抛出,所以不需要我们管了。
像这样常见的系统异常还有
ArithmeticException:算数运算异常
ArrayIndexOutOfBoundsException:数组越界异常
ClassCastException:类型转换异常
NullPointerException:空指针异常
NumberFormatException:数据格式异常
FileNotFoundException:文件未找到异常
ClassNotFoundException:类未找到异常
NoSuchElementException:没有这个元素异常(迭代器中到了末尾,还继续访问)
更多系统异常查阅 :https://wenku.baidu.com/view/7486aed409a1284ac850ad02de80d4d8d15a0135.html
下面自定义一个异常类,然后抛出,处理
/* 定义一个输入图形边长为负数的异常处理类SizeException
和三条边长无法组成三角形的异常处理类IllegalSizeException.java */
class SizeException extends Exception{
String s;
public SizeException(){
s="所输数值不能为负数!";
}
public String toString(){ //输出出错信息
return s;
}
}
class IllegalSizeException extends Exception{
String s;
public IllegalSizeException(){
s="三角形的3条边长度不合理,请重新输入!";
}
public String toString(){ //输出出错信息
return s;
}
}
class TriangleLast{
int a;
int b;
int c;
public TriangleLast(int a,int b,int c){
this.a=a;
this.b=b;
this.c=c;
}
public void yiChang() throws IllegalSizeException,SizeException{
if(((a+b)<c)||((a+c)<b)||((c+b)<a))
throw (new IllegalSizeException());
if(a<0||b<0||c<0)
throw (new SizeException());
}
}
public class TestTriangleLast{
public static void main(String args[]){ //throws SizeException,IllegalSizeException
TriangleLast t; //声明一个三角形对象
try{
//t= new TriangleLast(80,100,50); //(1)测试给定3条边长的三角形
t= new TriangleLast(80,-100,50); //(2)测试负数异常 SizeException
t.yiChang();
// t= new TriangleLast(80,10,50); //(3)测试 IllegalSizeException
}
catch(SizeException e1){ //捕获异常1:边长为负数
System.out.println(e1.toString()+"\n ");
}
catch(IllegalSizeException e2){ //捕获异常2:3条边长不合理
System.out.println(e2.toString()+"\n ");
}
System.out.println("Good good study,day day up");
}
}
一.用户自定义异常类的作用:用来处理程序中特定的逻辑运行错误
创建方法:
1)声明一个新的异常类,使之以Exception类或其他某个已经存在的系统异常类或用户异常类为父类;
2)为新的异常类定义属性和方法,或重写父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。
定义足够多的异常类是构建一个稳定完善的应用系统的重要基础之一。
二.自定义异常的抛出的作用:为了下一步的捕捉异常及处理
抛出方法:
1)当一个方法要抛出可查异常时,必须在方法头使用throws子句声明
2)用户自定义的异常,系统不能自动抛出,需要编程者在程序中的合适位置创建自定义异常的对象,并利用throw语句将这个新异常对象抛出
方法抛出异常的语法:
[修饰符] 返回类型 方法名 (参数列表) throws 异常类名列表{
if(条件语句)
throw(new 异常类名());
}
对可能出现异常的方法,用throws语句列出可能出现异常类名,中间用逗号分隔,这样当发生异常时,系统就调用异常处理程序。
抛出异常的语句应该被定义为满足一定条件时执行,这个条件便是错误的信息。
三.捕捉异常
语法:异常被抛出时,用专门的语句来接收异常对象,格式如下:
catch(异常类名 异常形式参数名){
异常处理语句;
}
每个catch语句都应该与一个try语句块相对应,这个try语句块用来启动Java的异常处理机制,可能抛出异常的语句(包括throw语句,调用可能抛出异常方法的方法调用语句)都应该包含在这个try语句快中。
四.多异常处理方式:
通过一个try块后面定义若干个catch块来实现,每个catch块用来接收和处理一种特定的异常对象
每个catch块中的与应根据异常的不同执行不同的操作。
处理多异常时应注意设计各catch块的排列顺序,一般处理较具体和常见的异常应放在前,可以与多种异常相匹配的应放在后,否则可能造成它后面的catch块将永远不被使用。
此时在看看上面的源代码,就一目了然了。