# 自定義例外類別

## 複習

![](/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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://java.4-x.tw/java-14/java-14-8.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
