昨天說到例外處理,今天就來說說一些常見的例外吧
就是說當我們訪問到還沒有實體化的物件時會發生的錯誤
// 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;
}
}
是說當一個物件在不允許的狀況下,嘗試被同時修改會發生的錯誤
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);
}
}
將許多同一種資料型態的物件集合在一起,比陣列更彈性更好處理
將物件依序存放,並依序取出,可以存放重複的物件,用起來就像平常的物件一樣簡單
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");
}
}
不依序存放物件,存放物件不可重複
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();
}
}
將物件以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));
}
}
}