# **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+"次");
}
}
```
>
## **類別與物件**
## **繼承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);
}
}
```
>
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);
}
}
```
>
### **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個參數");
}
}
}
```
>
<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;
}
}
```
>
<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();
}
}
```
>
>
## **Thread**
## **第一類**
1. 題目說明:
請開啟C:\ANS.CSF\JP01資料夾中的JPD01.java進行編寫。依下列題意進行作答:將偶數值相加,使輸出值符合題意要求。檔案名稱請另存新檔為JPA01.java,儲存於C:\ANS.CSF\JP01資料夾,再進行評分。
2. 設計說明:
(1) 請撰寫程式,接收輸入的兩個數字,若兩個數字皆是整數且為偶數,輸出相加結果;若輸入的數字不符合要求,請轉換為數字0。
3. 輸入輸出:
輸入說明
兩個數字
輸出說明
依輸入值判斷輸出結果(輸出最後一行後不自動換行)

```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;
}
}
}
```