iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
Software Development

大學耍廢的我要學Java翻身系列 第 14

Day14: 常見例外和集合

  • 分享至 

  • xImage
  •  

常見例外

昨天說到例外處理,今天就來說說一些常見的例外吧

NullPointerException => 空指針

就是說當我們訪問到還沒有實體化的物件時會發生的錯誤

// Main.java
public class Main {
    public static void main(String[] args){
        Dog jack = new Dog("Jack", 5);

        jack.bark();
    }
}
// Dog.java
public class Dog extends Person{
    public String name;
    private int age;
    private Person owner;
    public void bark(){
        System.out.println("My name is " + name + " and my owner is " + owner.getName());
    }
    public Dog(String name, int age){
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setOwner(Person owner){
        this.owner = owner;
    }
    public String getName(){
        return this.name;
    }

}
// Person.java
public class Person {
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String name;
    private int age;
    public Person(){

    }
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

}

上列程式會產生NullPointerException,因為這時我們的owner的name是空的,所以在Dog.java中的owner.getName()抓不到資料
可以改為下列狀況

// Main.java
public class Main {
    public static void main(String[] args){
        Dog jack = new Dog("Jack", 5);
        Person max = new Person("Max", 20); // 建立Person物件
        jack.setOwner(max);  // 設定owner,使owner不為空
        jack.bark();
    }
}
// Dog.java
public class Dog extends Person{
    public String name;
    private int age;
    private Person owner;
    public void bark(){ // 設定如果owner為null的另一條方案
        if (owner != null){
            System.out.println("My name is " + name + " and my owner is " + owner.getName());
        } else {
            System.out.println("I have no owner...");
        }
    }
    public Dog(String name, int age){
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setOwner(Person owner){
        this.owner = owner;
    }
    public String getName(){
        return this.name;
    }

}
// Person.java
public class Person {
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String name;
    private int age;
    public Person(){

    }
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

}

ConcurrentModificationException

是說當一個物件在不允許的狀況下,嘗試被同時修改會發生的錯誤

import java.util.ArrayList;

// Main.java
public class Main {
    public static void main(String[] args){
        ArrayList<Integer> arr = new ArrayList<>();
        for (int i=0; i<=10; i++){
            arr.add(i);
        }
        for(int i: arr){  // 訪問我們的arr
            if (i == 5){
                arr.remove(i);  // 同時又修改我們的arr
            }
        }
    }
}

解決辦法就是不要同時訪問又同時修改
分成兩個階段: 先找到我們要修改的值把它存起來,等訪問完我們再去修改

import java.util.ArrayList;

// Main.java
public class Main {
    public static void main(String[] args){
        ArrayList<Integer> arr = new ArrayList<>();
        for (int i=0; i<=10; i++){
            arr.add(i);
        }
        // 把我們要remove的東西存起來
        int remov = -1;
        for(int i: arr){
            if (i == 5){
                remov = i;
            }
        }
        arr.remove(remov);
    }
}

集合

將許多同一種資料型態的物件集合在一起,比陣列更彈性更好處理

List => 像是Python的list

將物件依序存放,並依序取出,可以存放重複的物件,用起來就像平常的物件一樣簡單

import java.util.ArrayList;
import java.util.List;

// Main.java
public class Main {
    public static void main(String[] args){
        String str1 = "test1";
        String str2 = "test2";
        String str3 = "test3";

        List<String> li = new ArrayList<String>();
        li.add(str1);
        li.add(str2);
        li.add(str1);   // 可重複
        li.add(str2);
        li.add(str3);

        System.out.println(li.get(2));
        li.remove("test1"); // 移除第一個出現的test1
        System.out.println();
        for (String s: li){
            System.out.println(s);  // 照順序排列
        }
        System.out.println();
        System.out.println(li.get(2));
        li.remove("test1");
    }
}

Set => 像是Python的set

不依序存放物件,存放物件不可重複

import java.util.HashSet;
import java.util.Set;
// Main.java
public class Main {
    public static void main(String[] args){
        String str1 = "test1";
        String str2 = "test2";
        String str3 = "test3";

        Set<String> set = new HashSet<String>();
        set.add(str1);
        set.add(str2);
        set.add(str1);   // 不可重複: 重複的元素只會顯示出一個
        set.add(str2);
        set.add(str3);
        set.remove("test2");
        for (String s: set){
            System.out.println(s);  // 不照順序排列
        }
        System.out.println();
    }
}

Map => 像是python的Dict

將物件以key.value的儲存方式放置於Map物件中
使用key取得存放的物件,Map(key, value)

import java.util.HashMap;
import java.util.Map;

// Main.java
public class Main {
    public static void main(String[] args){
        String str1 = "test1";
        String str2 = "test2";
        String str3 = "test3";

        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put(str1, 1);
        map.put(str2, 2);   // 不可重複: 重複的元素只會顯示出一個
        map.put(str3, 3);
//        System.out.println(map.get("test2"));
//        map.remove("test2");
//        System.out.println(map.get("test2"));
        for(String key: map.keySet()) {     // keySet()把map的key都撈出來
            System.out.println(map.get(key));
        }
    }
}

上一篇
Day13: Java的封裝和例外處理
下一篇
Day15: Java的多main宇宙(上)
系列文
大學耍廢的我要學Java翻身30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言