終於來到 Day 30。
30 天前開始這個挑戰時,我的目標是:
透過每天學習一個 Java 觀念,最後完成一套可以實際操作的個人記帳系統。
Day 1 的程式其實只有:
public class Main {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
當時只是重新認識 Java 程式的基本結構。
沒想到一路從變數、Scanner、if / else、迴圈、ArrayList、Method、Class、Object 慢慢學習,到今天已經可以完成一套具有新增、修改、刪除、搜尋、統計、預算管理與檔案儲存功能的記帳系統。
所以最後一天,我想把這 30 天完成的內容整理起來,也替這次的挑戰做一個完整的紀錄。
最終完成的個人記帳系統
目前系統的主選單:
===== 個人記帳系統 =====
從最開始只能:
Hello, Java!
到現在已經變成:
Java 個人記帳系統
│
├── 新增消費
├── 查看紀錄
├── 修改紀錄
├── 刪除紀錄
│
├── 總支出統計
├── 分類支出統計
├── 月支出統計
│
├── 預算設定
├── 預算提醒
│
├── 日期查詢
├── 關鍵字搜尋
│
├── 最高支出分析
├── 最低支出分析
│
├── 自動儲存
├── 檔案讀取
└── 錯誤處理
這就是這 30 天最後完成的成果。
功能一:新增消費
使用者可以輸入:
請輸入消費項目:午餐
請輸入消費金額:150
請選擇消費分類:
程式會自動取得今天日期:
LocalDate today =
LocalDate.now();
最後建立:
2026-10-02|午餐|150 元|飲食
並自動儲存到檔案。
功能二:查看所有消費紀錄
例如:
===== 消費紀錄 =====
這裡使用:
ArrayList
保存所有 Expense Object。
再透過:
for
逐筆顯示。
功能三:修改與刪除
如果資料輸入錯誤,不需要重新建立所有資料。
可以選擇:
例如把:
午餐|120 元
修改成:
午餐|150 元
也可以選擇:
刪掉不需要的資料。
這裡主要使用到:
expenses.get()
expenses.remove()
以及 Expense 的:
setItem()
setAmount()
setCategory()
功能四:總支出統計
程式會把所有金額加起來:
total += expense.getAmount();
例如:
===== 支出統計 =====
目前共有 5 筆消費
總支出:720 元
這是前面學習 for 迴圈之後,第一次真正把迴圈應用到資料統計。
功能五:分類支出統計
除了總金額,也可以看到不同分類:
===== 分類支出統計 =====
飲食:390 元
交通:30 元
購物:0 元
娛樂:300 元
這裡把之前學過的:
switch
重新運用在實際功能中。
功能六:預算管理
使用者可以設定:
請輸入預算金額:5000
如果目前花了:
3800
程式會顯示:
目前預算:5000 元
目前支出:3800 元
剩餘預算:1200 元
如果支出變成:
5300
則顯示:
已超出預算 300 元!
Day 29 測試時還發現預算重新啟動後會消失,因此最後又加入:
budget.txt
保存預算。
這也是這次實作中真的透過測試發現並修正的一個問題。
功能七:依日期查詢
可以輸入:
2026-10-02
得到:
===== 2026-10-02 消費紀錄 =====
午餐|150 元|飲食
電影|300 元|娛樂
當日共有 2 筆消費
當日總支出:450 元
這裡使用到:
LocalDate.parse()
以及:
equals()
來比較日期。
功能八:關鍵字搜尋
輸入:
咖啡
系統可以找出:
===== 搜尋結果 =====
2026-09-29|星巴克咖啡|80 元|飲食
2026-10-02|便利商店咖啡|65 元|飲食
找到 2 筆紀錄
合計支出:145 元
這裡學到了:
contains()
讓程式可以做簡單的文字搜尋。
功能九:最高與最低支出
系統也可以分析:
===== 消費分析 =====
最高支出:
2026-10-01|電影|300 元|娛樂
最低支出:
2026-10-01|捷運|30 元|交通
這裡最重要的觀念是:
Expense maxExpense =
expenses.get(0);
Expense minExpense =
expenses.get(0);
先把第一筆當成最大和最小,再逐筆比較。
功能十:月支出統計
Day 28 完成的功能可以輸入:
請輸入年份:2026
請輸入月份:10
程式顯示:
===== 2026 年 10 月支出統計 =====
消費筆數:5 筆
飲食:210 元
交通:30 元
購物:500 元
娛樂:300 元
本月總支出:1040 元
這裡使用:
getYear()
getMonthValue()
從 LocalDate 取得年份和月份。
功能十一:檔案儲存
如果資料只存在:
ArrayList
程式一關閉,資料就會消失。
所以後面加入:
FileWriter
把資料存進:
expenses.txt
例如:
2026-10-01,早餐,60,飲食
2026-10-01,捷運,30,交通
2026-10-02,午餐,150,飲食
重新啟動程式後,再透過:
File
Scanner
把資料重新讀回 ArrayList。
到這一步,我才真正感覺這個程式比較像一個可以持續使用的記帳系統。
功能十二:Exception Handling
使用者不一定永遠輸入正確資料。
例如程式要求:
請輸入消費金額:
卻輸入:
abc
如果沒有處理,程式可能直接發生錯誤。
所以後來加入:
try {
// 執行程式
} catch (Exception e) {
// 處理錯誤
}
讓程式遇到錯誤輸入時,可以顯示提示,而不是直接停止。
30 天到底學了什麼?
回頭看這 30 天,其實不是一開始就直接寫完整的記帳系統。
而是一點一點累積。
Java 基礎
↓
變數與資料型態
↓
Scanner
↓
if / else
↓
switch
↓
for / while
↓
Array
↓
ArrayList
↓
Method
↓
Class / Object
↓
Constructor
↓
Encapsulation
↓
Inheritance
↓
Exception Handling
↓
File I/O
↓
LocalDate
↓
搜尋與統計
↓
Testing / Debugging
↓
完整個人記帳系統
以前看到這些 Java 語法時,很容易覺得它們都是分開的知識。
但是實際做完一個作品後,才發現它們最後都會組合在一起。
我印象最深的是 ArrayList
一開始使用:
String[] items =
new String[10];
最大的問題就是:
只能先設定固定大小
後來學到:
ArrayList
才慢慢變成:
static ArrayList expenses =
new ArrayList<>();
之後新增:
expenses.add(expense);
取得:
expenses.get(i);
刪除:
expenses.remove(index);
取得數量:
expenses.size();
幾乎後面所有功能都建立在 ArrayList 上。
我也更理解物件導向
以前看到:
Class
Object
Constructor
Encapsulation
Inheritance
會覺得這些都是很抽象的名詞。
但是這次建立:
class Expense
之後,每一筆消費都可以變成:
Expense expense =
new Expense(
date,
item,
amount,
category
);
一筆 Expense 裡面就包含:
日期
項目
金額
分類
這讓我比較能理解 Class 和 Object 為什麼存在。
最終系統的資料流程
整個系統現在可以簡單整理成:
使用者輸入資料
↓
Scanner
↓
建立 Expense Object
↓
加入 ArrayList
↓
saveExpenses()
↓
expenses.txt
↓
重新啟動程式
↓
loadExpenses()
↓
重新建立 Expense
↓
放回 ArrayList
↓
查詢 / 修改 / 刪除 / 統計 / 分析
這也是這 30 天最後組合出來的完整流程。
如果繼續開發,我還想增加什麼?
雖然 30 天挑戰結束了,但目前的程式其實還有很多可以繼續改善的地方。
例如未來可以加入:
收入紀錄
每月收入與支出比較
不同月份比較
更多消費分類
自訂分類
圖表分析
CSV 匯出
資料庫
登入功能
GUI 圖形化介面
現在的版本主要還是:
Console Application
未來如果繼續學習 Java GUI,甚至可以把現在這個文字選單:
變成真正有:
按鈕
輸入框
表格
視窗
的應用程式。
Day 1 VS Day 30
Day 1:
public class Main {
public static void main(String[] args) {
System.out.println(
"Java 30 天挑戰開始!"
);
System.out.println(
"我的目標是完成一個個人記帳系統!"
);
}
}
Day 30:
===== 個人記帳系統 =====
30 天前寫下:
我的目標是完成一個個人記帳系統!
到今天,這個目標真的完成了。
Day 30 學習心得
終於完成 30 天的 Java 學習挑戰。
一開始決定做「Java 程式設計與實作:30 天打造個人記帳系統」時,我其實不知道最後能把程式做到什麼程度,所以最開始只是從 Java 的基本語法重新學起。
這 30 天從變數、Scanner、條件判斷、迴圈和陣列開始,後來慢慢接觸 ArrayList、Method、Class、Object、Constructor、Encapsulation、Inheritance、Exception Handling、File I/O 和 LocalDate。前面學習每個觀念時,有些內容看起來很零散,但當功能越做越多之後,才發現這些東西其實會一直重複出現在程式裡。
我覺得這次最大的收穫不是記住多少 Java 語法,而是第一次比較完整地體驗「把一個程式慢慢做出來」的過程。從最開始只能顯示文字,到後來可以新增資料,再慢慢加入修改、刪除、搜尋、統計、檔案儲存和錯誤處理,每一天其實都只比前一天多完成一點,但累積 30 天之後,真的變成了一個完整很多的程式。
Day 29 在測試時還發現預算重新啟動後會消失,也讓我發現寫完程式並不是結束,實際測試、找到問題再修正也是程式開發很重要的一部分。
這次 30 天挑戰結束後,我對 Java 還有很多需要繼續學習的地方,但至少現在看到一段 Java 程式碼時,不會像以前一樣只看到很多陌生的符號,而是開始能理解變數存了什麼、迴圈在做什麼、Method 為什麼要拆開,以及 Object 如何保存資料。
從 Day 1 的:
Hello, Java!
到 Day 30 完成自己的:
Java 個人記帳系統
這就是我這次 30 天挑戰最完整的成果。
Java 30 天挑戰,完成!