iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
自我挑戰組

Java 程式設計與實作:30 天打造個人記帳系統系列 第 30 篇

30 天 Java 挑戰完成!我的個人記帳系統最終成果

  • 分享至 

  • xImage
  •  

終於來到 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 天完成的內容整理起來,也替這次的挑戰做一個完整的紀錄。

最終完成的個人記帳系統

目前系統的主選單:

===== 個人記帳系統 =====

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 分類支出統計
  5. 刪除消費紀錄
  6. 修改消費紀錄
  7. 設定預算
  8. 查看預算狀況
  9. 依日期查詢
  10. 關鍵字搜尋
  11. 消費分析
  12. 月支出統計
  13. 離開

從最開始只能:

Hello, Java!

到現在已經變成:

Java 個人記帳系統
│
├── 新增消費
├── 查看紀錄
├── 修改紀錄
├── 刪除紀錄
│
├── 總支出統計
├── 分類支出統計
├── 月支出統計
│
├── 預算設定
├── 預算提醒
│
├── 日期查詢
├── 關鍵字搜尋
│
├── 最高支出分析
├── 最低支出分析
│
├── 自動儲存
├── 檔案讀取
└── 錯誤處理

這就是這 30 天最後完成的成果。

功能一:新增消費

使用者可以輸入:

請輸入消費項目:午餐
請輸入消費金額:150
請選擇消費分類:

  1. 飲食
  2. 交通
  3. 購物
  4. 娛樂
    請輸入選項:1

程式會自動取得今天日期:

LocalDate today =
LocalDate.now();

最後建立:

2026-10-02|午餐|150 元|飲食

並自動儲存到檔案。

功能二:查看所有消費紀錄

例如:

===== 消費紀錄 =====

  1. 2026-09-30|晚餐|180 元|飲食
  2. 2026-10-01|早餐|60 元|飲食
  3. 2026-10-01|捷運|30 元|交通
  4. 2026-10-02|午餐|150 元|飲食
  5. 2026-10-02|電影|300 元|娛樂

這裡使用:

ArrayList

保存所有 Expense Object。

再透過:

for

逐筆顯示。

功能三:修改與刪除

如果資料輸入錯誤,不需要重新建立所有資料。

可以選擇:

  1. 修改消費紀錄

例如把:

午餐|120 元

修改成:

午餐|150 元

也可以選擇:

  1. 刪除消費紀錄

刪掉不需要的資料。

這裡主要使用到:

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,甚至可以把現在這個文字選單:

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出

變成真正有:

按鈕
輸入框
表格
視窗

的應用程式。

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:

===== 個人記帳系統 =====

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 分類支出統計
  5. 刪除消費紀錄
  6. 修改消費紀錄
  7. 設定預算
  8. 查看預算狀況
  9. 依日期查詢
  10. 關鍵字搜尋
  11. 消費分析
  12. 月支出統計
  13. 離開

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 天挑戰,完成!


上一篇
系統測試與錯誤修正:完成記帳系統最後檢查
系列文
Java 程式設計與實作:30 天打造個人記帳系統 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言