> For the complete documentation index, see [llms.txt](https://java.4-x.tw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://java.4-x.tw/java-14/java-14-8.md).

# 自定義例外類別

## 複習

![](/files/-MPaKml_nWpGgZ5bc9N3)

所有能夠處理的例外都是繼承 Exception 類別，因此我們自行設計的例外類別不外乎就是以下格式：

```
class 例外類別名稱 extends Exception
{
   //自行定義
}
```

## 範例

首先自行設計一圓形例外，因為內建的 Exception 擁有極豐富的函數，因此甚至我們能不撰寫敘述也能使用

```
class CircleException extends Exception
{
}
```

在圓形類別當中，指定函數拋出例外（觀念複習 throws , new）

```
class CCircle
{
   private double radius;
   public void setRadius(double r) throws CCircleException
   {
      if(r<0)
      {
         throw new CircleException();
      }
      else
         radius=r;
   }

   public void show()
   {
      System.out.println("面積="+3.14*radius*radius);
   }
}
```

並在main() 中撰寫 try-catch-finally 區塊（觀念複習 不同類別拋出例外）

```
try
{
   CCircle.setRadius(-100.0);
}
catch(CircleException e)
{
   System.out.println(e+" 被拋出");
}
```

## 完整程式碼範例

```
class CircleException extends Exception
{
}
class CCircle
{
   private double radius;
   public void setRadius(double r) throws CircleException
   {
      if(r<0)
      {
         throw new CircleException();
      }
      else
         radius=r;
   }

   public void show()
   {
      System.out.println("面積="+3.14*radius*radius);
   }
}

public class exception_ex
{
   public static void main(String args[])
   {
      CCircle cir=new CCircle();
      try
      {
         cir.setRadius(-100.0);
      }
      catch(CircleException e)
      {
         System.out.println(e+" 被拋出");
      }
      cir.show();
   }
}
```

1. 自行撰寫例外類別。
2. CCircle 類別為一個有判斷半徑的setRadius函數以及計算圓面積的函數\
   在判斷半徑的setRadius函數，我們指定之拋出例外；因此若半徑小於0時 將會拋出例外。
3. 在main() 函數中，撰寫了 try-catch-finally 區塊 用來接收例外。\
   （從不同類別的函數拋出例外）

在此範例，呼叫CCircle 中的setRadius 函數，傳入-100 的值\
因此會拋出例外。\
這時 catch 捕捉後會印出CircleException 被拋出，再執行最後的 cir.show();

此範例的輸出：\
CCircleException 被拋出\
area=0.0

## 整理

> Ｑ：為什麼面積會是零呢？
>
> Ａ：因為例外拋出後，就沒有再做後續的處理；因此面積沒有被計算到 所以就為0
