---
# System prepended metadata

title: Java study hard˖⁺๑

---

# **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() , break１(),其他屬性自行定義
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;
		}
	}
}
```

