文章目錄
執行順序,優先級
finally
demo1 : try catch finally
- 求以下代碼打印結果 :
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String tag = "onCreate"; Log.e(tag, getNum(0) + ""); Log.e(tag, getNum(1) + ""); Log.e(tag, getNum(2) + ""); Log.e(tag, getNum(4) + ""); } private int getNum(int num) { String tag = "getNum"; try { Log.e(tag, "執行 try ---"); int result = 2 / num; return result; } catch (Exception e) { Log.e(tag, "執行 catch, e :" + e.getMessage()); return 0; } finally { Log.e(tag, "執行 finally ---"); if (num == 0) { return -1; } if (num == 1) { return 1; } } } }
- 控制檯打印 :
2019-09-04 16:53:33.267 10963-10963/com.example.demo0904 E/getNum: 執行 try --- 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/getNum: 執行 catch, e :divide by zero 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/getNum: 執行 finally --- 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/onCreate: -1 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/getNum: 執行 try --- 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/getNum: 執行 finally --- 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/onCreate: 1 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/getNum: 執行 try --- 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/getNum: 執行 finally --- 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/onCreate: 1 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/getNum: 執行 try --- 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/getNum: 執行 finally --- 2019-09-04 16:53:33.268 10963-10963/com.example.demo0904 E/onCreate: 0
- 上題中需要注意:當傳入的 num 爲 0 時,會報錯除數不能爲 0。
demo2 : try throw catch finally
- 求以下代碼打印結果 :
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String tag = "onCreate"; try { Log.e(tag, "執行 try --- "); throw new Exception(); } catch (Exception e) { Log.e(tag, "執行 catch, e :" + e.getMessage()); } finally { Log.e(tag, "執行 finally --- "); } } }
- 控制檯打印:
2019-09-04 17:11:50.290 11194-11194/? E/onCreate: 執行 try --- 2019-09-04 17:11:50.290 11194-11194/? E/onCreate: 執行 catch, e :null 2019-09-04 17:11:50.290 11194-11194/? E/onCreate: 執行 finally ---
finally 總結:
- finally 一定會在 return 之前執行,但是如果 finally 是用了 return 或者 throw 語句,將會使 try-catch 中的 return 或者 throw 失效。(demo1)。
throw 總結
- throws:(demo2)
- 寫在方法聲明之後,表示方法可能拋出異常;
- 寫在方法體中,表示方法一定會拋出一個異常,要麼 try-catch 處理,要麼 throws 拋出。
運算
三目運算
demo1 : 三目運算,“==”
- 求打印結果
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); boolean b = true ? false : true == true ? false : true; System.out.println(b); } }
- 打印結果爲:
false
三目運算 總結
- == 優先級高於三目運算符
- 所以 demo1 中的 true ? false : ++true == true++ ? false : true,
- 先判斷 true==true,爲 true,這時表達式爲:true ? false : ++true ? false : true++,
- 然後三目運算++從右往左++執行,變爲 true ? false : true,
- 返回false
- 所以 demo1 中的 true ? false : ++true == true++ ? false : true,
繼承
父類子類 執行順序
- 父類靜態域
- 子類靜態域
- 父類成員初始化
- 父類構造塊
- 父類構造方法
- 子類成員初始化
- 子類構造塊
- 子類構造方法