# **Java study hard˖⁺๑** ## 字串 ```java import java.lang.*; public class ex11_04//主類別 { public static void main(String args[]) { String str1=new String("abcabcabcabcabcbbcbbc"); int counter=0,k=0; while(str1.indexOf("bc",k)!=-1) { counter++; k=str1.indexOf("bc",k)+2;//str1.length(); } System.out.println("bc出現在"+str1+"共"+counter+"次"); } } ``` >![](https://i.imgur.com/ykYDNuD.png) ## **類別與物件** ## **繼承extends** ### **HW1** ```java= import java.lang.*; public class ex_07 { public static void main (String[] args) { CTriangle objArr[]new CTraingle[10]; int x[]=new int[3]; for(int i=0;i<10;i++) { x=makeTreeeNum(); objArr[i]=new CTraingle(x[0],x[1],x[2]); } for(int i=0;i<10;i++) { System.out.print("3邊為\t"+objArr[i].edge1+"\t"+objArr[i].edge2+"\t"+bjArr[i].edge3+"\t"); if(objArr[i].isRightAngle()) System.out.println("是直角三角形"); else System.out.println("不是直角三角形"); } } static iint[] makeTreeNum() { int x[]=new int[3]; x[0]=(int)(Math.random()*25+5);//5~29 x[1]=(int)(Math.random()*41+9);//9~49 x[2]=(int)(Math.random()*61+29);//29~89 return x; } } class CTriangle { public int edge1; public int edge2; public int edge3; public CTriangle() { edge1=3; edge2=4; edge3=5; } public CTriangle(int a,int b,int c) { if(isLegal(a,b,c)==true) { edge1=a; edge2=b; edge3=c; } else { edge1=3; edge2=4; edge3=5; } } private static boolean isLegal(int a,int b,int c) { if(a+b>c&&a+c>b&&b+c>a) return true; else return false; } public boolean isRightAngled() { if(edge3*edge3==edge1*edge1+edge2*edge2) return true; return false; } } ``` ## **介面** ## **例外Exception** ```java try { } catch() { } final { } Exception has already been caught catch(ArithmeticException e) { ^ //必須更改例外物件捕捉的順序將,Exception例外物件的捕捉撰寫在最後,以便捕捉到所有尚未考慮到的例外 ``` ### **HW1** **題目說明** 1) 設計一個自定的例外類別CmyException,在主類別中提供一個方法規格為int powerXY(int x,int y),功能為計算x的y次方,請為其撰寫例外處理機制,使得程式能繼續運作,以解決下列狀況的例外: a:x與y同時為0。(此類錯誤產生CmyException類別的例外物件) b:y為負值,而導致x的y次方不為整數。 ```java= import java.lang.*; public class HW901 { public static void main(String args[]) { System.out.println("2的 5次方="+powerXY(2,5)); System.out.println("2的 0次方="+powerXY(2,0)); System.out.println("0的 0次方="+powerXY(0,0)); System.out.println("2的 -2次方="+powerXY(2,-2)); } public static int powerXY(int x,int y) { int sum=1; for(int i=0;i<y;i++) sum*=x; try { if(x==0&&y==0) throw new CmyException("0的0次方無定義,回傳值將錯誤"); else if(y<0) throw new CmyException("次方為負值,結果不為整數,回傳值將錯誤"); } catch(CmyException e) { return -1; } return sum; } } class CmyException extends Exception { public CmyException() { super(); } public CmyException(String msg) { super(); System.out.print(msg); } } ``` >![](https://i.imgur.com/JEwgEQz.png) 2) 延續上題,將x,y改為使用者由鍵盤輸入,故必須額外考慮使用者輸入錯誤所引發的各種例外。 ```java= import java.lang.*; import java.util.Scanner; public class HW902 { public static void main(String args[]) { int a[]=new int [2]; int x=1; Scanner sc = new Scanner(System.in); while(x==1) //true { try { System.out.print("請輸入x:"); a[0]=sc.nextInt(); System.out.print("請輸入y:"); a[1]=sc.nextInt(); x=-1; //break; } catch(Exception e) { System.out.println("x,y請輸入整數"); sc.next(); } } System.out.println(a[0]+"的"+a[1]+"次方="+powerXY(a[0],a[1])); } public static int powerXY(int x,int y) { int sum=1; for(int i=0;i<y;i++) sum*=x; try { if(x==0&&y==0) throw new CmyException("0的0次方無定義,回傳值將錯誤 "); else if(y<0) throw new CmyException("次方為負值,結果不為整數,回傳值將錯誤 "); } catch(CmyException e) { return -1; } return sum; } } class CmyException extends Exception { public CmyException() { super(); } public CmyException(String msg) { super(); System.out.print(msg); } } ``` >![](https://i.imgur.com/lVibwYZ.png) ### **HW2** **題目說明** 1. 請撰寫一個程式輸入二個命令列參數(數字),並將二個數字做相除 2. 請使用try和catch敘述抓取 3. ArrayIndexOutOfBoundsException 處理使用者輸入參數個數不符合之例外情況 4. ArithmeticException 處理當除以零時的例外情況 ``` java= public class lab10_1 { public static void main(String args[]) { int a,b; /*try { if(args.length!=2) throw new ArrayIndexOutOfBoundsException(); a=Integer.parseInt(args[0]); b=Integer.parseInt(args[1]); if(b==0) //if(args[1]=="0")出現錯誤, throw new ArithmeticException(); else { System.out.println("答案:"+a+"/"+b+"="+a/b); } }*/ try { if(args.length!=2) throw new ArrayIndexOutOfBoundsException(); else if(args[1].equals("0")) throw new ArithmeticException(); else { a=Integer.parseInt(args[0]); b=Integer.parseInt(args[1]); System.out.println("答案:"+a+"/"+b+"="+a/b); } } catch(ArithmeticException e) { System.out.println("分母不可為零"); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("輸入不足2個參數"); } } } ``` >![](https://i.imgur.com/MC46jbj.png) <font color="#006CD4"> ```==``` **比較的是兩個字串的地址是否相等。** </font> <font color="#006CD4"> ```equals()``` **比較兩字串內容是否相符,若相等return true,否則return false。** </font> ><font color="3B454E">當定義並初始化兩個字符串類型的變量,String s = “abc” ; String s2 = s ; 實際上是只創建了一個String類型的對象,該對象的值為abc,而s 和s2 都引用這一個對象。</font> **題目說明** 1. 試著自訂一個例外類別(AmountException),然後再撰寫一個類別(Amount)提供一個 check 的方法,會檢查傳入的整數是否大於 300 2. 若 X > 300,印出“檢查成功,傳入整數為 X 大於 300“ 3. 否則,丟出自訂的例外類別物件,填入錯誤訊息:"不行!傳入整數小於 300 ! ```java= import java.lang.*; import java.util.Scanner; public class lab10_2 { public static void main(String args[]) { int a; Scanner sc = new Scanner(System.in); Amount ch = new Amount(); ystem.out.print("輸入 x: "); a=sc.nextInt(); try { if(ch.check(a)) System.out.println("檢查成功,傳入整數為"+a+"大於300"); else throw new AmountException(); } catch(AmountException e) { System.out.println("不行!傳入整數小於300!"); } } } class Amount { public boolean check(int a) { if(a>300) return true; else return false; } } ``` >![](https://i.imgur.com/EjYMr6K.png) <font color="#03468F">**深藍色**</font> <font color="#886C5A">**咖啡色**</font> <font color="#006CD4">**藍色**</font> <font color="#9075AA">**芋頭色**</font> <font color="#007355">**墨綠色**</font> <font color="#3B454E">**炭色**</font> <font color="#0045F3">**亮藍色**</font> <font color="#003947">**深綠色**</font> <font color="#FF5B59">**桃紅色**</font> <font color="#D287FF">**紫色**</font> <font color="#71C636">**草綠色**</font> <font color="#FFDD50">**鵝黃色**</font> ## **Package** 宣告package做類別的分類管理 分割檔案 ``` javac -d c:\workspace filename.java ``` >在c:\workspace下建立好對應package階層的資料夾,並將.class放進去。 ### **HW** **題目說明** 1. 建立一類別 Vehicle,屬於 pkga 類別庫, 具有方法 start() , break1(),其他屬性自行定義 1. 建立一類別RV, 繼承 Vehicle 類別,屬於 pkgb 類別庫 1. 建立一類別Jeep, 繼承 Vehicle 類別,屬於 pkgc 類別庫 1. 建立主程式,屬於pkgd類別庫,並將RV與Jeep產生出物件 >呼叫RV的start方法時會列印 “休旅車發動中..” 呼叫RV的break方法時會列印 “休旅車煞車中..” 呼叫Jeep的start方法時會列印 “吉普車發動中..” 呼叫Jeep的break方法時會列印 “吉普車發動中..” ```java package pkga; public class Vehicle { public static void start() { } public static void break1() { } } ``` ```java package pkgb; public class RV extends pkga.Vehicle { public static void start() { System.out.println("休旅車發動中.."); } public static void break1() { System.out.println("休旅車煞車中.."); } } ``` ```java package pkgc; public class Jeep extends pkga.Vehicle { public static void start() { System.out.println("吉普車發動中.."); } public static void break1() { System.out.println("吉普車煞車中.."); } } ``` ```java package pkgd; public class HW10_2 { public static void main(String args[]) { pkgb.RV rv = new pkgb.RV(); pkgc.Jeep jeep = new pkgc.Jeep(); rv.start(); rv.break1(); jeep.start(); jeep.break1(); } } ``` >![](https://i.imgur.com/K5uFlRG.png) >![](https://i.imgur.com/ZtJICi4.png) ## **Thread** ## **第一類** 1. 題目說明: 請開啟C:\ANS.CSF\JP01資料夾中的JPD01.java進行編寫。依下列題意進行作答:將偶數值相加,使輸出值符合題意要求。檔案名稱請另存新檔為JPA01.java,儲存於C:\ANS.CSF\JP01資料夾,再進行評分。 2. 設計說明: (1) 請撰寫程式,接收輸入的兩個數字,若兩個數字皆是整數且為偶數,輸出相加結果;若輸入的數字不符合要求,請轉換為數字0。 3. 輸入輸出: 輸入說明 兩個數字 輸出說明 依輸入值判斷輸出結果(輸出最後一行後不自動換行) ![](https://i.imgur.com/7bBp0wI.png) ```java import java.util.Scanner; public class JPA01 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n1, n2; try { n1 = sc.nextInt(); } catch (Exception ex) { n1 = 0; sc.next(); } try { n2 = sc.nextInt(); } catch (Exception ex) { n2 = 0; } sc.close(); if (n1 % 2 == 0 && n2 % 2 == 0) { System.out.print(n1 + n2); } else { System.out.print(0); return; } } } ```