@[异常处理]
异常的原因
- 数组下标越界
- 访问不存在文件
异常处理机制
-
Throwable是所有异常类的父类(也是Object的子类),Java中只有Throwable类及其子类的对象才能由异常处理机制处理。
-
Error - 很难恢复的严重错误,一般不由程序处理
-
RuntimeException - 程序设计或实现的问题,处理方法是纠正错误,重新设计程序
-
其他Exception通常由环境因素引起,通常由用户误操作引起
try catch()
异常处理方式
1.程序块中捕获并处理
try-catch-finally
代码
try
fianlly可有可无
代码
- catch 先具体后抽象-父异常放于子异常后,否则可能报错(若有情况,最先捕获父类异常,子类对象被永远屏蔽)
- 若没有继承关系,先后次序任意
throws
出现异常不加处理,直接上抛,若未处理椅子上抛,如果到main还未被处理,则非正常终止
例:输入三角形面积海伦公式
public class TestException
{
public static double calculateArea(double a, double b, double c)
{
double p = (a+b+c)/2;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
public static void main(String[] args)
{
/*if (args.length < 3)
{
System.out.println("输入的参数个数应至 少为3个,请重新执行本程序");
}*/
//try{
double a = Double.parseDouble(args[0]);
double b = Double.parseDouble(args[1]);
double c = Double.parseDouble(args[2]);
double s = calculateArea(a, b, c);
System.out.println("边长为"+a+","+b+","+c+"的三角形面积是"+s);
//}catch(ArrayIndexOutOfBoundsException e){
//System.out.println("数组访问越界,请至少输入3个参数");
// }
}
}
NumberFormatException
自定义异常
例:三角形三边关系
import java.util.*;
public class TestAllException
{
public static double calculateArea(double a, double b, double c) throws TriangleMinusLengthException, TriangleUnequationException
{
if (a<0 || b<0 || c<0)
throw new TriangleMinusLengthException("负边长异常");
if (a+b<c || a+c<b || b+c<a)
throw new TriangleUnequationException("不满足三角不等式异常");
double p = (a+b+c)/2;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
public static void main(String[] args)
{
try{
Scanner reader=new Scanner(System.in);
System.out.println("请输入三角形的边长:");
double a = reader.nextDouble();
double b = reader.nextDouble();
double c = reader.nextDouble();
double s = calculateArea(a, b, c);
System.out.println("边长为" + a + ","+ b + "," + c + "的三角形面积是" + s);
reader.close();
} catch(InputMismatchException e2){
System.out.println("输入的参数必须是数字!");
} catch(TriangleMinusLengthException e3){
System.out.println("边长不能是负数");
} catch(TriangleUnequationException e4){
System.out.println("边长必须满足三角不等式");
}
}
}
2.可能产生的异常抛出,调用方法的程序块处理