Lab:
Exception
假如 Exception
的架構如下
Exception
← AException ← BException ←CException
AException.java
package
mod12;
public
class AException extends Exception {
public
AException() {
}
public
AException(String msg) {
super(msg);
}
}
BException.java
//
BException 繼承AException
public
class BException extends AException {
}
CException.java
package
mod12;
//
public
class CException extends BException {
}
Parent.java
package
mod12;
public
class Parent {
public
void work() throws BException{
boolean
sucess = false;
if(!sucess){
//Can
throw BException or child excpetion
throw
new BException();
}
}
public
void work2() throws BException{
//
(new
Staffing()).doStaff();
}
}
Staffing.java
package
mod12;
public
class Staffing {
public
void doStaff() throws BException{}
}
*方法Overriding
及 Exception
Overriding
方法
Child.java
package
mod12;
public
class Child extends Parent {
//public
void work() throws SQLException{ } //這個不行,
不可宣告未被宣告的Excepton
//public
void work() throws AException{ } //這個不行,
宣告Exception的父類別
public
void work() throws BException{ } // OK,
宣告子類別BException
public
void work2() throws CException{ } // OK,
宣告子類別CException
}
修改
Parent.java
import
java.io.IOException;
public
class Parent {
public
void work() throws BException{
boolean
sucess = false;
if(!sucess){
//Can
throw BException or child excpetion
throw
new BException();
}
}
public
void work2() throws BException{
//
(new
Staffing()).doStaff();
}
//父類別有丟兩個類別
public
void work3() throws BException,IOException{
}
}
修改 Child.java
package
mod12;
import
java.io.FileNotFoundException;
public
class Child extends Parent {
//public
void work() throws SQLException{ } //這個不行,
不可宣告未被宣告的Excepton
//public
void work() throws AException{ } //這個不行,
宣告Exception的父類別
public
void work() throws BException{
//No
need to announce RuntimeException
}
// OK, 宣告子類別BException
public
void work2() throws CException{ } // OK,
宣告子類別CException
public
void work3() throws BException, FileNotFoundException{
//Can
throws BException or IOException or IOException's child Exception
//Can
throws one or more Exceptions
}
}
*Assertion
概論
*Assertion
機制的建議用法
int
a = ( new Staffing()).doStaff();
if
( a > 0 ){
}
else {
//內部執行的不變性(internal
invariants)
assert(
a == 0 );
}
switch
( XXX ) {
case
SPRING:
case
SUMMER:
case
FAIL:
case
WINTER:
default:
//流程控制的不變性(control
flow invariants)
assert(false);
}
*不適當的Assertion使用時機
Lab:
assert
TestAssertions.java
public
class TestAssertions {
public
static void main(String[] args) {
int
testFlag = 100;
//設定
assert
,但是預設是關閉的如果沒有在
VM
option設定 -ea
就不會啟動
assert(
testFlag > 100);
//也可以在後面加上訊息
//assert(
testFlag > 100 ):"This is an error Message";
System.out.println("Done!");
}
}
*Chapter
15 Java I/O
*I/O基礎概論:
I/O stream (輸出入串流)
byte
stream
一次只能讀取1個byte
透過
InputStream讀資料
透過OutputStream寫資料
char
stream
InputStreamReader
轉換的API,
將InputStream
轉成 Reader
OutputStreamWriter
轉換的API,
將OutputStream
轉成 Writer
*輸出入串流(I/O
stream)
Notes:
Notes:
*Console
I/O
System.out變數可以將資料輸出到系統的標準輸出端(standard
output), 他是一個PrintStream型別物件
System.in變數可以從系統的標準輸入端(standard
input)輸入資料,
他是一個InputStream型別物件
System.err變數可以將錯誤資訊輸出到系統的標準錯誤輸出端(standard
error), 他是一個PrintStream型別物件
Notes:
Scanner
API 提供格式化輸入的功能,
可以套用於console
以及檔案或是網路的串流.
Notes:
useDelimiter 設定切割符號
關閉串流的動作是釋放系統的資源
*格式化輸出
IllegalFormatconversionException
為指定的資料與型別不符(例如應該給整數卻給浮點數)
Mod15.java
import
java.util.Date;
public
class Mod15 {
public
static void main(String[] args) {
int
a = 100;
double
b = 12.345;
String
c = "Hello";
Date
d = new Date();
//%30s
--> output 30 characters
System.out.printf("%s%n",
a);
System.out.printf("%s%n",
b);
System.out.printf("%s%n",
c);
System.out.printf("%s%n",
d);
System.out.printf("%20.5f%n",
b);
//
使用%b的時候,
如果值為null
輸出false,
如果是大小寫Boolean就看是true
或是 false來輸出,
如果是其他的型別但是值又不是null就會輸出true
String
e = null;
Date
f = null;
boolean
g = true;
Boolean
h = false;
int
i = 100;
String
j = "Hello";
Date
k = new Date();
System.out.printf("%b%n",
e);
System.out.printf("%b%n",
f);
System.out.println();
System.out.printf("%b%n",
g);
System.out.printf("%b%n",
h);
System.out.println();
System.out.printf("%b%n",
i);
System.out.printf("%b%n",
j);
System.out.printf("%b%n",
k);
}
}
*檔案和檔案I/O
建立File物件
操作File物件(對檔案本身進行操作,
例如重新命名或是刪除,
不對內容操作)
讀取或是寫入檔案的串流(File
streams)
何謂可序列化的資料(物件)?