自定义类Sanj,其中有成员 x,y,z,作为三边长,构造方法Sanj(a,b,c)分别 给x,y,z赋值,方法求面积getArea和显示三角形信息(三个边长)showInfo,这2个方法中当三条边不能构成一个三角形时要抛出自定义异常NotSanjiaoException,否则显示正确信息。在另外一个类中的主方法中构造一个Sanj对象(三边为命令行输入的三个整数),显示三角形信息和面积,要求捕获异常。
import java.util.Scanner;
public class Sanj {
double x;
double y;
double z;
public Sanj(double a,double b,double c) throws NotSanjiaoException {
x=a;
y=b;
z=c;
try {
if((x>=y+z)||(x<=Math.abs(y-z))||(y>=x+z)||(y<=Math.abs(x-z))||(
z>=y+x)||(z<=Math.abs(y-x))||(x==0)||(y==0)||(z==0))
{
throw new Exception("这三个三角形不能构成三角形");
}
}
catch(Exception e){
System.err.println("Exception handled in the method NotSanjiaoException");
throw new NotSanjiaoException("出现异常",e);
}
}
public double getArea() {
double p;
p=(x+y+z)/2.0;
double s=p*(p-x)*(p-y)*(p-z);
s=Math.sqrt(s);
return s;
}
public void showInfo() {
System.out.println("第一条边的长度:"+x+"第二条边的长度"+y+"第三条边的长度"+z);
}
public static void main(String[] args) {
double a1,a2,a3;
System.out.println("请依次输入三角形边的长度:");
Scanner sc =new Scanner(System.in);
a1=sc.nextDouble();
a2=sc.nextDouble();
a3=sc.nextDouble();
sc.close();
try {
Sanj s = new Sanj(a1,a2,a3);
double x = s.getArea();
System.out.println("三角形的面积为:"+x);
s.showInfo();
}
catch(Exception e ) {
System.err.println("对不起,您输入的边长:"+a1+" "+a2+" "+a3+"不能构成三角形");
}
}
}
class NotSanjiaoException extends Exception{
private static final long serialVersionUID = 1L;
public NotSanjiaoException(String Message,Throwable Cause) {
super(Message,Cause);
}
public NotSanjiaoException(String Message) {
super(Message);
}
public NotSanjiaoException(Throwable cause) {
super(cause);
}
}
toString()方法用来获取异常种类和信息;getCause()用来获取异常的原因;getMessage()用来获取异常的信息;printStackTrace在控制台打印出异常种类,错误信息和出错位置;
同时throws关键字代表可能会有异常,可以在方法的参数括号后面加 throws Exception或者用try catch语句。
在try catch中,可以有多个catch语句,在try语句中写入可能会出现的异常,当程序遇到异常后就会在catch里寻找与之对应的异常,然后进行处理,最后不管程序是否异常,都会执行到finally语句,finally语句为异常的统一出口,finally可以省略,如果不写,在catch语句执行完以后则会继续执行下面的程序。
在处理多个异常的时候需要将捕获范围小的异常放在捕捉范围大前面,否则会出现语法错误