Khắc phục lỗi java.lang.ArithmeticException: / by zero trong Java

beginner Java2026-07-22| Java Development Kit (JDK) / Java Runtime Environment (JRE) - Tất cả các phiên bản

Error Message

java.lang.ArithmeticException: / by zero
#java#xu-ly-ngoai-le#phep-toan#debugging#backend

Tại sao lỗi này xảy ra

Nếu mã nguồn Java của bạn cố gắng chia một số nguyên cho 0, JVM sẽ ngay lập tức dừng thực thi và ném ra lỗi java.lang.ArithmeticException: / by zero. Hãy tưởng tượng thế này: việc cố gắng chia 100 quả táo cho 0 người không chỉ đơn giản là kết quả bằng "không". Trong thế giới toán học số nguyên, đây là một phép toán bất khả thi mà ngôn ngữ lập trình từ chối xử lý.

Lỗi crash này nhắm cụ thể vào các kiểu số nguyên như int, long, short, và byte. Điều thú vị là các số thực dấu phẩy động (doublefloat) lại hoạt động khác. Chúng tuân theo tiêu chuẩn IEEE 754, nghĩa là chúng trả về Infinity hoặc NaN (Not a Number) thay vì ném ra một ngoại lệ và làm dừng chương trình của bạn.

Đoạn mã gây ra lỗi crash:

int totalScore = 500;
int players = 0;
int average = totalScore / players; // Bùm: java.lang.ArithmeticException: / by zero

Quy tắc tương tự cũng áp dụng cho toán tử chia lấy dư (modulo). Nếu bạn cố gắng tìm số dư của một phép chia cho 0, chương trình sẽ thất bại:

int remainder = 10 % 0; // Cũng ném ra java.lang.ArithmeticException

Cách khắc phục

1. Kiểm tra số chia trước

Cách khắc phục đáng tin cậy nhất là kiểm tra các con số trước khi thực hiện phép tính. Đây là bước kiểm tra bắt buộc bất cứ khi nào bạn làm việc với dữ liệu đầu vào từ người dùng, chẳng hạn như giá trị nhập từ web form hoặc số lấy từ cơ sở dữ liệu.

public void calculateShare(int total, int people) {
    if (people != 0) {
        int share = total / people;
        System.out.println("Mỗi người nhận được: " + share);
    } else {
        System.err.println("Bỏ qua tính toán: Bạn không thể chia cho 0 người.");
    }
}

2. Sử dụng khối Try-Catch

Đôi khi bạn kỳ vọng dữ liệu của mình sạch, và số 0 thực sự là một "ngoại lệ" so với quy tắc. Trong những trường hợp này, hãy bao bọc logic trong khối try-catch để xử lý lỗi một cách êm đẹp mà không làm crash toàn bộ ứng dụng.

try {
    int result = 100 / divisor;
} catch (ArithmeticException e) {
    System.out.println("Lỗi: Đã xảy ra phép chia cho 0. Giá trị mặc định là 0.");
    int result = 0; 
}

3. Sử dụng toán tử ba ngôi cho giá trị mặc định

Nếu bạn muốn giữ cho mã nguồn ngắn gọn, hãy sử dụng toán tử ba ngôi. Cách này hoàn hảo để thiết lập giá trị mặc định (như 0 hoặc 1) khi thiếu mẫu số.

// Nếu players bằng 0, đặt average là 0; ngược lại, thực hiện phép chia
int average = (players == 0) ? 0 : (totalScore / players);

4. Chuyển sang toán học số thực dấu phẩy động

Logic của bạn có yêu cầu độ chính xác thập phân không? Nếu bạn ép kiểu các con số sang double, ngoại lệ sẽ biến mất. Thay vì bị crash, bạn sẽ nhận được Infinity, điều này có thể dễ xử lý hơn trong một số tính toán khoa học hoặc tài chính.

double result = (double) 10 / 0; 
System.out.println(result); // In ra 'Infinity'

Kiểm tra giải pháp của bạn

Trước khi triển khai mã nguồn, hãy chạy qua ba kịch bản sau để đảm bảo tính ổn định:

  • Kịch bản tích cực: 10 / 2 vẫn trả về 5 chứ?
  • Kịch bản với số không: Ứng dụng vẫn chạy khi số chia là 0 chứ? Hãy xác nhận rằng thông báo lỗi tùy chỉnh hoặc giá trị mặc định của bạn xuất hiện.
  • Kịch bản số âm: 10 / -2 có trả về đúng -5 không?

Những điểm chính cần lưu ý

  • Làm sạch dữ liệu đầu vào: Đừng bao giờ giả định rằng UI hoặc API sẽ gửi các số khác không. Luôn kiểm tra trước khi tính toán.
  • Ghi nhật ký theo ngữ cảnh: Nếu bạn bắt được ngoại lệ này, hãy ghi nhật ký các biến cụ thể liên quan. Biết được rằng userId: 402 gây ra lỗi chia cho 0 sẽ giúp việc debugging nhanh hơn nhiều.
  • Chọn kiểu dữ liệu phù hợp: Hãy nhớ rằng 1.0 / 0.0 là một trạng thái toán học hợp lệ (Infinity) trong Java, nhưng 1 / 0 là một lỗi nghiêm trọng.

Related Error Notes