要求:
自定義類Sanj,其中有成員 x,y,z,作為三邊長,構造方法Sanj(a,b,c)分別 給x,y,z賦值,方法求面積getArea和顯示三角形信息(三個邊長)showInfo,這2個方法中當三條邊不能構成一個三角形時要拋出自定義異常NotSanjiaoException,否則顯示正確信息。在另外一個類中的主方法中構造一個Sanj對象(三邊為命令行輸入的三個整數),顯示三角形信息和面積,要求捕獲異常。
代碼如下:
1 package Test; 2 3 import java.util.Scanner; 4 5 class NotSanjiaoException extends Exception{ 6 /** 7 * 8 */ 9 private static final long serialVersionUID = 1L; 10 11 public NotSanjiaoException(String Message,Throwable Cause) { 12 super(Message,Cause); 13 } 14 15 public NotSanjiaoException(String Message) { 16 super(Message); 17 } 18 19 public NotSanjiaoException(Throwable cause) { 20 super(cause); 21 } 22 } 23 24 class Sanj{ 25 double x; 26 double y; 27 double z; 28 public Sanj(double a,double b,double c) throws NotSanjiaoException { 29 x=a; 30 y=b; 31 z=c; 32 try { 33 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))34 throw new Exception("這三個三角形不能構成三角形"); 35 36 } 37 catch(Exception e){ 38 System.err.println("Exception handled in the method NotSanjiaoException"); 39 throw new NotSanjiaoException("出現異常",e); 40 41 } 42 } 43 44 public double getArea() { 45 double p; 46 p=(x+y+z)/2.0; 47 double s=p*(p-x)*(p-y)*(p-z); 48 s=Math.sqrt(s); 49 return s; 50 51 } 52 53 public void showInfo() { 54 System.out.println("第一條邊的長度:"+x+"第二條邊的長度"+y+"第三條邊的長度"+z); 55 } 56 } 57 public class Test { 58 public static void main(String[] args) { 59 double a1,a2,a3; 60 System.out.println("請依次輸入三角形邊的長度:"); 61 Scanner sc =new Scanner(System.in); 62 a1=sc.nextDouble(); 63 a2=sc.nextDouble(); 64 a3=sc.nextDouble(); 65 sc.close(); 66 try { 67 Sanj s = new Sanj(a1,a2,a3); 68 double x = s.getArea(); 69 System.out.println("三角形的面積為:"+x); 70 s.showInfo(); 71 } 72 catch(Exception e ) { 73 System.err.println("對不起,您輸入的邊長:"+a1+" "+a2+" "+a3+"不能構成三角形"); 74 75 76 } 77 78 } 79 }
該題一共包含三個類,其中Sanj類,用來聲明三個邊,以及構造函數,面積函數,顯示三邊大小的函數,其中構造函數里面有異常語句,try catch。其中判斷是否為三角形的條件尤為重要,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)),尤其是中間的||要通過特殊方法來想。
第二個類,自定義異常類繼承於Exception類,有三個構造方法,參數分別為錯誤信息message,錯誤原因cause。兩個參數,共有三種構造方法。
第三個類主類,輸入邊長,然后構造新對象,包含異常語句。
運行結果:



toString()方法用來獲取異常種類和信息;getCause()用來獲取異常的原因;getMessage()用來獲取異常的信息;printStackTrace在控制台打印出異常種類,錯誤信息和出錯位置;
同時throws關鍵字代表可能會有異常,可以在方法的參數括號后面加 throws Exception或者用try catch語句。
在try catch中,可以有多個catch語句,在try語句中寫入可能會出現的異常,當程序遇到異常后就會在catch里尋找與之對應的異常,然后進行處理,最后不管程序是否異常,都會執行到finally語句,finally語句為異常的統一出口,finally可以省略,如果不寫,在catch語句執行完以后則會繼續執行下面的程序。
在處理多個異常的時候需要將捕獲范圍小的異常放在捕捉范圍大前面,否則會出現語法錯誤
異常語句的處理流程:

異常處理流程

