---
# System prepended metadata

title: assert的用法
tags: [ocpjp]

---

# assert的用法
## assert關鍵字語法很簡單，有兩種用法：
:::info
- assert <boolean表示式>
如果<boolean表示式>為true，則程式繼續執行。
如果為false，則程式丟擲AssertionError，並終止執行。

- assert <boolean表示式> : <錯誤資訊表示式>
如果<boolean表示式>為true，則程式繼續執行。
如果為false，則程式丟擲java.lang.AssertionError，並輸入<錯誤資訊表示式>。

- [參考網站](https://www.itread01.com/content/1547018948.html)
:::

java執行時 assert預設為關閉，必須要加-ea ，才會開啟

```java=
public class Test {
	public double applyDiscount(double price) {
		assert (price>0);
		return price * 0.50;
	}
	public static void main(String[] args) {
		Test t = new Test();
		double newPrice = t.applyDiscount(Double.parseDouble(args[0]));
		System.out.println("New Price : "+newPrice);
	}
}
```

**在cmd執行下面指令，會得到下面結果**
![](https://i.imgur.com/74WTGxA.jpg)

**可以看到雖然 0並不大於0，但是因為沒有加-ea 參數，沒有開啟assert的情況下，程式依然可以正常運行**

**當加了-ea 參數，開啟assert時，就會跳出AssertionError**

---
**Question:**
```java=
class Engine{
    double fueLevel;
    Engine(int fueLevel){
        this.fueLevel = fueLevel;
    }
    public void strat() {
        //line n1
        System.out.println("Started");
    }
    public void stop() {
        System.out.println("Stopped");
    }
}
```
Your design requires that:
- fuelLevel of Engine must be greater than zero when the start() method is invoked.
- The code must terminate if fuelLevel of Engine is less than or equal to zero.

## Which code fragment should be added at line n1 to express this invariant condition?
A. assert (fuelLevel) : "Terminating...";
B. assert (fuelLevel > 0) : System.out.println ("Impossible fuel");
**C. assert fuelLevel < 0: System.exit(0);**
D. assert fuelLevel > 0: "Impossible fuel" ;
- [x] **Answer: C**

:::warning
- 在一個if-else判斷中，如果我們程式是按照我們預想的執行，到最後我們需要停止程式，那麼我們使用System.exit(0)
- 而System.exit(1)一般放在catch塊中，當捕獲到異常，需要停止程式，我們使用System.exit(1)。這個status=1是用來表示這個程式是非正常退出。
:::
###### tags: `ocpjp`
