Các lỗi thời gian chạy Java phổ biến nhất

Feb 27 2023
Lỗi thời gian chạy xảy ra khi một chương trình không chứa bất kỳ lỗi cú pháp nào nhưng lại yêu cầu máy tính thực hiện điều gì đó mà máy tính không thể thực hiện một cách đáng tin cậy. Trong quá trình biên dịch, trình biên dịch không có kỹ thuật để phát hiện các loại lỗi này.

Lỗi thời gian chạy xảy ra khi một chương trình không chứa bất kỳ lỗi cú pháp nào nhưng lại yêu cầu máy tính thực hiện điều gì đó mà máy tính không thể thực hiện một cách đáng tin cậy . Trong quá trình biên dịch, trình biên dịch không có kỹ thuật để phát hiện các loại lỗi này. Đó là JVM (Máy ảo Java) phát hiện ra nó trong khi chương trình đang chạy.

· StackOverflowError Exception
· OutOfMemoryError Exception
· NegativeArraySizeException
· ArithmeticException
· ArrayIndexOutOfBoundsException
· ArrayStoreException
· UnsupportedOperationException
· NoSuchElementException
· ClassCastException
· DateTimeException
· ConcurrentModificationException
· InputMismatchException
· IllegalFormatConversionException
· NumberFormatException
· InvalidParameterException
· NullPulumException

StackOverflowError ngoại lệ

StackOverflowError là một lỗi mà Java không cho phép phát hiện, chẳng hạn như ngăn xếp hết dung lượng, vì đây là một trong những lỗi thời gian chạy phổ biến nhất mà người ta có thể gặp phải.

Nguyên nhân chính của StackOverflowError là chúng ta chưa cung cấp điều kiện kết thúc thích hợp cho hàm hoặc mẫu đệ quy của mình, điều đó có nghĩa là nó sẽ biến thành một vòng lặp vô hạn . Vì vậy, lỗi này được đưa ra khi Java hết bộ nhớ khả dụng.

// Java program to demonstrate
// infinite recursion error
public class StackOverflowErrorClass {
 static int i = 0;
 // Method to print numbers
 public static int printNumber(int x)
 {
  i = i + 2;
  System.out.println(i);
  return i + printNumber(i + 2);
 }
 public static void main(String[] args)
 {
  // Recursive call without any
  // terminating condition
  StackOverflowErrorClass.printNumber(i);
 }
}

RunTime Error in java code :- Exception in thread “main” java.lang.StackOverflowError
at java.io.PrintStream.write(PrintStream.java:526)
at java.io.PrintStream.print(PrintStream.java:597)
at java.io.PrintStream.println(PrintStream.java:736)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:13)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:14)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:14)
.
.
.

Ngoại lệ OutOfMemoryError

Không đủ dung lượng/lỗi bộ nhớ (java.lang.OutOfMemoryError) trong chủ đề

Java.lang.OutOfMemoryError là một lỗi thời gian chạy trong Java xảy ra khi Máy ảo Java ( JVM ) không thể phân bổ đối tượng do không đủ dung lượng trong vùng heap Java. Java Garbage Collector ( GC ) không thể giải phóng không gian cần thiết cho một đối tượng mới, điều này gây ra java.lang.OutOfMemoryError . Lỗi này cũng có thể xảy ra khi bộ nhớ riêng không đủ để hỗ trợ tải lớp Java.

Dưới đây là một ví dụ về việc ném do không đủ dung lượng heap Java:

public class OutOfMemoryErrorExample {
    public static void main(String[] args) {
        Integer[] myArray = new Integer[1000 * 1000 * 1000];
    }
}

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at OutOfMemoryErrorExample.main(OutOfMemoryErrorExample.java:8)

Phủ địnhArraySizeException

NegativeArraySizeException là một ngoại lệ thời gian chạy trong Java xảy ra khi một ứng dụng cố gắng tạo một mảng có kích thước âm . Vì NegativeArraySizeException là một ngoại lệ không được kiểm tra (kéo dài RuntimeException ), nên nó không cần được khai báo trong mệnh đề ném của một phương thức hoặc hàm tạo.

Các nhà phát triển phải đặt kích thước mảng thành một số nguyên dương. Nếu dấu trừ lọt vào phần khai báo kích thước mảng, điều này sẽ đưa ra Ngoại lệ Phủ địnhArraySize.

class JavaError {
public static void main(String[] args) {
    int[] arr = new int[-5]; // Negative size of the array
    arr[8] = 89;
    System.out.println("Something went wrong!");
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.NegativeArraySizeException: -5
at JavaError.main(JavaError.java:4)

Số họcException

bán tại. chia cho lỗi không

Thao tác dữ liệu là một chức năng chính của hầu hết các ứng dụng Java. Khi thao tác dữ liệu bao gồm phép chia, các nhà phát triển phải cảnh giác với phép chia cho 0 . Nếu số 0 từng trở thành mẫu số trong một phép tính, Java sẽ đưa ra một ArithmeticException. Vì vậy, chúng tôi không thể chia bất cứ thứ gì từ 0, vì vậy khi chúng tôi cố gắng làm điều đó, chúng tôi sẽ nhận được một ngoại lệ số học khi chạy.

class JavaError {
public static void main(String[] args) {
    int a = 23;
    int b = 0;
    System.out.println(a / b);
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.ArithmeticException: / by zeroat JavaError.main(JavaError.java:7)

ArrayIndexOutOfBoundsException

khi một phần tử không tồn tại trong một mảng được truy cập

Một mảng trong Java yêu cầu kích thước đã đặt. Nếu bạn cố gắng thêm nhiều phần tử hơn số lượng mà mảng có thể chứa, điều này sẽ dẫn đến ArrayIndexOutOfBoundsException . Đoạn mã sau cố gắng thêm một phần tử vào chỉ số tám của một mảng được xây dựng để chỉ chứa năm phần tử:

Truy cập chỉ mục mảng không tồn tại:

class JavaError {
public static void main(String[] args) {
    String[] arr = new String[5];
    arr[6] = "Hi"; // Accessing array index that does not exsist
    System.out.println("Something went wrong!");
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 5
at JavaError.main(JavaError.java:6)

Java áp dụng cách đếm dựa trên số 0 cho các phần tử trong một mảng, vì vậy chỉ mục 6 của một mảng sẽ đề cập đến phần tử thứ bảy. Ngay cả đoạn mã sau cũng sẽ kích hoạt ngoại lệ ArrayIndexOutOfBoundsException trong Java, vì chỉ mục 4 là tham chiếu đến phần tử thứ năm của mảng:

String[] arr = new String[5];
arr[5] = "Hi"; // Accessing array index that does not exsist

ArrayStoreException

ArrayStoreException có những điểm tương đồng với ClassCastException. Ngoại lệ thời gian chạy Java này xảy ra khi loại đối tượng sai được đặt vào một mảng.

Trong ví dụ bên dưới, một mảng BigInteger được tạo, theo sau là nỗ lực thêm một Double. Double không chia sẻ mối quan hệ với BigInteger, vì vậy điều này sẽ kích hoạt ArrayStoreException khi chạy.

Number[] bigInt = new BigInteger[5];
bigInt[0] = Double.valueOf(12345);

BigInteger[] bigInt = new BigInteger[5];
bigInt[0] = Double.valueOf(12345); // Java compile error

Hoạt động ngoại lệ không được hỗ trợ

Các lập trình viên Java thường sử dụng lớp Arrays để biến một mảng Java thành một Danh sách thân thiện với người dùng hơn. Tuy nhiên, Danh sách mà Java trả về là chỉ đọc. Các nhà phát triển không biết về thực tế này và cố gắng thêm các phần tử mới sẽ gặp phải Ngoại lệ UnsupportedOperationException. Ví dụ này cho thấy điều này xảy ra như thế nào:

Integer[] data = {1,2,3,5,8,13,21};
List<Integer> list = Arrays.asList(data);
list.add(new Integer(0));

NoSuchElementException

Bạn không thể lặp qua một trình vòng lặp trống. Đoạn mã sau, cố gắng lấy phần tử tiếp theo trong một HashSet trống, sẽ đưa ra một NoSuchElementException.

Set set = new HashSet();
set.iterator().next(); // Java runtime exception thrown

if (!set.isEmpty()) {
  set.iterator().next();
}

đối với lỗi chuyển đổi kiểu dữ liệu

Java là một ngôn ngữ gõ mạnh. Nó thực thi nghiêm ngặt hệ thống phân cấp kiểu và sẽ không chuyển đối tượng này sang đối tượng khác trừ khi chúng có chung mối quan hệ đa hình. Vì vậy , ClassCastException xảy ra khi bạn cố gắng chuyển sai một đối tượng sang một lớp cụ thể. Điều này có nghĩa là đối tượng của bạn không phải là một thể hiện hay một lớp con của lớp này.

Trong đoạn mã sau, nỗ lực truyền đối tượng Ngày vào Dấu thời gian sẽ gây ra lỗi ClassCastException khi chạy.

Date today = new Date();Timestamp time = (Timestamp)today;

long seconds = System.currentTimeMillis();
Timestamp time = new Timestamp(seconds);
Date today = (Date)time; // this cast works

DateTimeException

Thao tác dữ liệu là một nỗ lực khó khăn. Múi giờ, đường dữ liệu và định dạng ngày không nhất quán có thể khiến Java đưa ra nhiều DateTimeException khác nhau khi chạy.

Ví dụ: mã sau biên dịch, nhưng trường HourOfDay của lớp LocalDate sẽ khiến nỗ lực định dạng ngày không thành công.

LocalDate now = LocalDate.now();
DateTimeFormatter.RFC_1123_DATE_TIME.format(now);

LocalDate now = LocalDate.now();
DateTimeFormatter.ISO_DATE.format(now);

cho các tính toán song song được triển khai không chính xác

Phương thức asList của lớp Arrays không phải là lần duy nhất một bộ sưu tập yêu cầu xử lý chỉ đọc.

Khi bạn lặp lại một danh sách, bộ sưu tập cơ bản phải được sửa và không được cập nhật. Do đó, phương thức add trong đoạn mã sau sẽ đưa ra một ConcurrentModificationException.

List servers = new ArrayList();
servers.add("Tomcat");
                   
Iterator<String> iterator = servers.iterator();
while (iterator.hasNext()) {
  String server = iterator.next();
  servers.add("Jetty");  // throws a Runtime Exception
}

Đầu vàoMismatchException

InputMismatchException thường xảy ra khi làm việc với các chương trình Java nhắc người dùng nhập liệu bằng lớp Scanner . Ngoại lệ này thường xảy ra trong quá trình nhập của người dùng khi bạn mong đợi một loại đầu vào nhất định và người dùng nhập một loại đầu vào khác. Nói cách khác, ngoại lệ này có thể xảy ra khi đầu vào không hợp lệ đối với loại dự kiến. Đầu vào không khớp với mẫu cho loại dự kiến ​​hoặc nằm ngoài phạm vi.

Giống như chuyển dữ liệu không hợp lệ, ví dụ: chuyển một giá trị số sang trường không phải là số. Ví dụ: nếu một chương trình mong đợi một giá trị Số nguyên cho một đầu vào nhưng thay vào đó, người dùng nhập một giá trị Chuỗi , thì một InputMismatchException sẽ được đưa ra.

Giải pháp : Quấn mã yêu cầu người dùng nhập vào trong một vòng lặp while sẽ liên tục nhắc người dùng nhập chính xác.

IllegalFormatConversionException

Giải thích : Điều này được liên kết với printf() và String.format() . Điều đó có nghĩa là có một trình giữ chỗ không được liên kết (quá nhiều trình giữ chỗ, không đủ đối số) hoặc đó là trình giữ chỗ sai cho loại trong các đối số. Ví dụ: %s là phần giữ chỗ cho một số nguyên sẽ gây ra lỗi này.

Giải pháp : Đảm bảo số lượng chỗ dành sẵn khớp với số lượng đối số và đảm bảo rằng chỗ dành sẵn là đúng loại.

NumberFormatException

Đang cố chuyển đổi một chuỗi không hợp lệ thành một số

NumberFormatException xảy ra khi một nỗ lực được thực hiện để chuyển đổi một chuỗi có định dạng không đúng thành một giá trị số . Điều đó có nghĩa là khi không thể chuyển đổi một chuỗi thành bất kỳ loại số nào (float, int, v.v.), thì ngoại lệ này sẽ được đưa ra. Đó là Ngoại lệ thời gian chạy (Unchecked Exception) trong Java. Nó là một lớp con của lớp IllegalArgumentException .

Tham số không hợp lệNgoại lệ

Truyền tham số/đối số không hợp lệ cho một phương thức

Ngoại lệ này, là một lớp con của IllegalArgumentException được thiết kế để sử dụng bởi các lớp công cụ JCA/JCE, được ném ra khi một tham số không hợp lệ được truyền cho một phương thức .

NullPulumException

NullPulumException là một RuntimeException rất phổ biến mà các ứng dụng Java gặp phải. ngoại lệ này được đưa ra khi Java gặp một tham chiếu null khi nó không mong đợi. và một nhà phát triển java viết mã gọi một phương thức trên tham chiếu này (đối tượng chưa được khởi tạo).

String data = null;
System.out.println( data.length() ); // throws NullPointerException

Để tránh RuntimeException này trong các chương trình Java của bạn, hãy khởi tạo mọi đối tượng bạn tạo trước khi sử dụng và thực hiện kiểm tra null đối với bất kỳ đối tượng nào mà thư viện bên ngoài chuyển vào chương trình của bạn.

Hãy ủng hộ ấn phẩm của chúng tôi bằng cách theo dõi nó

Xem xét các lỗi thời gian chạy Java Tối đa hóa tiềm năng của nhóm của bạn: Cách giữ cho nhóm phân phối phần mềm của bạn bận rộn Câu hỏi phỏng vấn dựa trên luồng Java8 thường gặp nhất — Phần cuối cùng Cách tạo một dự án Quarkus đơn giản với tích hợp cơ sở dữ liệu Chuỗi ngoại lệ trong Java là gì | Xử lý ngoại lệ Tôi kiếm được 300 đô la bằng cách viết một cuốn sách trong 2 ngày — Đây là cách 10 cách đơn giản nhưng hiệu quả để cải thiện chất lượng cuộc sống của bạn Bắt đầu với Spring Boot: Hướng dẫn toàn diện cho người mới bắt đầu