課程名稱:程式設計II472205

指導老師:蔡佳麟

學生:陳妗珮

學號: 40207026

組別:T7

週次:第01-05[回首頁]

 

Part I指定作業:

作業題目

1.何謂方法(Method)

JAVA的方法有哪些類型?

2.何謂例外處理(Exceptions)

Java將例外分成哪幾種類型?

回答內容

何謂方法(Method)

根據參考來源1:『

System.out.println()是我們在前面經常使用的。那麼它是什麼呢?
println()
是一個方法(Method),而System是系統類(Class)out是標準輸出對象(Object)。這句話的用法是調用系統類System中的標準輸出對象out中的方法println()
那麼什麼是方法呢?
方法是解決一類問題的步驟的有序組合
方法包含於類或對象中
方法在程序中被創建,在其他地方被引用
創建與調用
方法被創建在類中,方法創建方式:
修饰 返回值类型 方法名 (参数类型 参数名){

...
方法体
...
return 
返回值;
}

如:
public static int age(int birthday){...}
參數可以有多個:
static float interest(float principal, int year){...}
方法可以沒有返回值,也可以沒有參數,甚至可以沒有內容:
public static void drawBox(double size){...}
public static void printBookName(){...}
調用時,有返回值方法作為數據傳遞,而無返回值方法直接作為一個語句。如:
...
myAge = age( 1991 );
...
myMoney = interest( 1000, 3 );
...
printBookName();
...
 

----------------------------------------------------------------------------

JAVA的方法有哪些類型?

根據參考來源2:『

非物件導向
我們已經知道Java是物件導向的,但Java也可以使用面向過程的用法。
Java
的方法也可以像C語言的函數一樣使用。這樣做的目的僅僅是減少重複代碼,讓程序結構更加清晰。
package wikibooks;
public class Exercise {
//main
也是一个方法,是所有程序的入口
public static void main(String args[]){
int time;
for( time = 2000; time < 2013; time++ ){
System.out.println( time + "
" );
if( bissextile( time ) ) //
调用bissextile方法
System.out.println( "
是闰年" );
else
System.out.println( "
不是闰年" );

}
}
//
判断闰年的方法
static boolean bissextile(int year){
boolean res = true;
if( year % 4 != 0 ) //
不能被4整除的年份不是闰年
res = false;
else if( (year % 100 == 0)&&( year % 400 != 0)) //
能被100整除但不能被400整除的年份不是闰年
res = false;
//
剩下的年份都是闰年
return res;

}
}
輸出結果:
2000
年是闰年
2001
年不是闰年
2002
年不是闰年
2003
年不是闰年
2004
年是闰年
2005
年不是闰年
2006
年不是闰年
2007
年不是闰年
2008
年是闰年
2009
年不是闰年
2010
年不是闰年
2011
年不是闰年
2012
年是闰年

 

 何謂例外處理(Exceptions)

根據參考來源3:『

所謂例外(Exception),指的是程式發生不正常的錯誤,而導致無法繼續執行的情形。例外處理(Exception Handling)顧名思義,就是當例外發生時的處理機制。

C語言裡並沒有例外處理的機制,使用函數庫時,可能會發生無法處理的狀況,此時必須由呼叫者小心檢查傳回值才行。如果不檢查,就會發生無法預期的結果

#include <stdio.h>  main() {      int data;      FILE* f = fopen("sample.txt", "r"); // sample.txt may not exist, fopen returns NULL      fscanf(f, "%d", &data); // may result segmentation fault;  }  

上述例子裡,如果檔案sample.txt不存在,則無法開啟該檔案,因此fopen傳回NULL。如果不檢查傳回值,則會產生segmentation fault。比較好的寫法是:

#include <stdio.h>  main() {      int data;      FILE* f = fopen("sample.txt", "r"); // sample.txt may not exist, fopen returns NULL      if (f == NULL) {          printf("Can't open file sample.txt. Please check if it exists and you have privilege to access.\n");          return;      }      fscanf(f, "%d", &data); // may result segmentation fault;  }  

又例如sqrt()可以用來求平方根,但如果我們給他負數,sqrt該如何處理?根據手冊,sqrt遇到負數參數,會傳回NaN(Not a Number,是浮點數裡的一個特別數值)。使用sqrt的函數必須特別檢查該值,否則計算出來的東西都變成了NaN。又例如除法運算時分母是0的情況,嚴格說起來也是一種錯誤,某些系統也會產生floating exception (core dumped)。

沒有提供例外處理機制的語言,程式的正確性必須靠極端小心的設計者才行。為了減少程式錯誤的機會,讓軟體很強固(robust),Java提供了例外處理的機制。

相關語法

在Java裡,Exception是一個Class。Exception extends Throwable, Throwable extends Object。Exception,Throwable這兩個類別均定義於java.lang這個package內。設計者也可以自訂自己的Exception類別。相關的Exception語法如下:

  • 自訂Exception類別
    public class MyException extends Exception {  }  
  • 宣告某method會產生例外
    import java.io.*;  public class ExceptionExample {      public void someMethod() throws Exception { // 請注意throws最後面是s          // some code may fail          FileInputStream f;          try {              f = new FileInputStream("abc.txt"); // if abc.txt does not exist, FileNotFoundException will be caught          } catch(FileNotFoundException fnf) {              System.out.println("File not found. Generate an exception and throw it");              throw fnf; // 注意throw後面沒有s              // throw new Exception(); // or you can throw a new Exception object          }      }      public static void main(String[] argv) {          ExceptionExample s = new ExceptionExample();          try {              s.someMethod();          } catch(Exception epp) {              System.out.println("An Exception has been caught.");          }      }  }  
  • 攔截exception的語法
    try {  } catch (TypeOneException e1) {  } catch (TypeTwoException e2) {  } catch (TypeThreeException e3) {  } finally {  }  
try {} catch{}類似像if then else if的結構。當try {}裡面某一行指令產生Exception時,try區塊會立刻中斷執行,然後到第一個catch判斷抓到的Exception是否instanceof TypeOneException,如果是則執行該catch區塊;如果不是,則進一步比較instanceof TypeTwoException。也就是說雖然可以寫很多個catch區塊,但執行時最多只有一塊會執行到。離開try或catch區塊以前,如果有finally區塊,則finally區塊一定會被執行到。一般來說finally區塊裡面的程式碼大多用來作資源回收,或清理資料結構的工作,以確保不論有無發生狀況,程式都能繼續正常執行。
try {      System.out.println("Opening FileInputStream");      FileInputStream f = new FileInputStream("abc.txt"); // assume this operation generate FileNotFoundException      System.out.println("File Opened");  } catch (FileNotFoundException e1) {      System.out.println("FileNotFoundException caught");  } catch (Exception e2) {      System.out.println("Exception caught");  } finally {      System.out.println("Execute finally block");  }  

上述的範例會印出

Opening FileInputStream  FileNotFoundException caught  Execute finally block  

如果把上面例子稍微改一下:

try {      System.out.println("Opening FileInputStream");      FileInputStream f = new FileInputStream("abc.txt"); // assume this operation generate FileNotFoundException      System.out.println("File Opened");  } catch (Exception e2) {      System.out.println("Exception caught");  } catch (FileNotFoundException e1) {      System.out.println("FileNotFoundException caught");  } finally {      System.out.println("Execute finally block");  }  

則聰明一點的Compiler會抱怨FileNotFoundException的區塊unreachable(執行不到)。這是因為FileNotFoundException是Exception的子類別,因此如果產生的例外是instanceof Exception,則FileNotFoundException就不會執行了;若產生的例外不是instanceof Exception,那就更不會執行到FileNotFoundException區塊了。

是否所有的Exception都要處理?

原則上是的。只要用到的method有宣告throws SomeException,則呼叫該method的地方,就要使用try {} catch(SomeException)的語法。當然像是try {} catch(SuperClassOfSomeException)的用法也行。唯一的例外是java.lang.RuntimeException及其子類別可以不必處理。

哪些屬於RuntimeException呢?像是ArrayIndexOutOfBoundException就是其中之一,它發生在陣列索引不合法的情況下:

public class Test {      public static void main(String[] argv) {          int[] x = new int[10];          x[100] = 0; // will generate ArrayIndexOutOfBoundException      }  }  

exception產生時,JVM會由堆疊追蹤此錯誤點的呼叫資訊,並一一向外檢查,直到有try catch區塊攔截此exception為止。在上述的例子中,沒有任何try catch的宣告,則JVM會終止該執行緒

類別Exception的相關方法

抓到例外後,可透過該例外物件,得到有趣的資訊

  • toString()以簡單的字串描述該例外
  • getMessage()列出細節訊息
  • printStackTrace()將堆疊資訊印在螢幕上,可幫助設計者快速找到錯誤點

Error

前面提到Exception是Throwable的子類別。另一個Throwable的子類別是java.lang.Error。所謂Error指的是嚴重的錯誤情況。當Error產生時,其行為和Exceptio類似,但是try catch區塊沒有辦法攔下它們,最後會由JVM來處理Error,並中斷執行緒的執行。像OutOfMemoryError,StackOverflowError都是Error的子類別。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Java將例外分成哪幾種類型?

根據參考來源4:『

 

從程式設計者的角度而言,例外可以區分為兩大類:「Checked Exception」和「Unchecked Exception」,而「Unchecked Exception」又可分再區分為:「RuntimeException」和「Error」兩種情況,參考下圖:

 

參考來源

  參考來源 1 • 2: JAVA 方法

  參考來源 3 : 例外處理

 

參考來源4: 9-1例外的種類

 

Part II 01-05週學習心得彙整

週別

1

2

3

4

5

截圖

ex1.教學投影片

ex2.通知信

ex3.ftp架設

ex4.網站佈署

ex5.社團建立

 

EX1-將變數加1

 EX1.將變數加1方法化(mYadd)

EX2.變數加1方法化

  EX1.顯示基本資料方法化

EX2.顯示資料方法化

 

EX1-顯示基本資料方法化(呼叫類別s40207026_showInfo_3)[有參數加多重定義]

EX2-第5週簡答選定的類別--車(類別car)

EX3-實作四則運算計算器類別(類別s40207041_caculator)

課後心得

  上學期有學過 所以這週比較輕鬆

 上學期也學過 所以不太困難

  這週有教新的 不過不算困難

  程式變多了 加上教方法化 有點難度了

  程式太多 整個抵累到