Các lỗi cơ bản trong JAVA

Bài viết gốc: https://codelearn.io/sharing/7-loi-thuong-gap-khi-lap-trinh-java

NullPointerException

Một Object (trừ những kiểu dữ liệu nguyên thủy – primitive – như int, long) sau khi khai báo là không có bất cứ một action nào thì giá trị của Object đó sẽ là null. Ví dụ như dòng code dưới đây.

ArrayList mList;

Khi ta khai báo như trên mà không khởi tạo giá trị cho biến thì mList sẽ nhận giá trị là null. Chúng ta cần hiểu rõ rằng null và rỗng là hoàn toàn khác nhau. Bất kỳ Object nào đang có giá trị null mà được gọi tới để sử dụng thì chương trình đều sẽ thông báo lỗi Null Pointer Exception. Vì vậy, chúng ta cần gán giá trị cho Object để Object không bị null nữa. Chúng ta có thể thực hiện bằng dòng code dưới đây.

ArrayList mList = new ArrayList<>(0);

Với dòng lệnh trên thì mList đã được khởi tạo và đang có capacity (dung lượng) là 0, hoặc một cách khác chúng ta có thể gán gá trị của 1 list khác đã tồn tại cho mList, tuy nghiên để chắc chắn thì trước khi sử dụng mList, hãy chắc chắn là mList không bị null như đoạn code dưới đây.

ArrayList mList = mContactList();

if(mList 1= null){

//do something

}

Lỗi java.lang.ClassCastException

Lỗi xảy ra khi chuyển kiểu dữ liệu (Cast) từ Object của một lớp cha về lớp con, hoặc từ 2 lớp không liên quan (không có mối quan hệ cha – con) với nhau. Cách khắc phục đó là chúng ta nên dùng các phương thức chuyển kiểu có sẵn của lớp nguồn, chuyển về lớp đích, cần phải nắm rõ được đối tượng mà function trả ra và biến hứng data có cùng kiểu hay không…

Object x = new Integer(0);
System.out.println((String)x); 

Lỗi is not abstract and does not override abstract method…

Lỗi này xảy ra phổ biến nhất với nguyên nhân là  1 lớp A implement 1 interface B, nhưng A không override tất cả các phương thức của B, trong khi mà A cũng không phải là abstract class(Nếu A là abstract thì điều này được phép).

import java.io.IOException;
abstract class MyClass {
   public abstract void display();
   public abstract void setName(String name);
   public abstract void setAge(int age);
}
public class AbstractClassExample extends MyClass{
   public void display(){
      System.out.println("This is the subclass implementation of the display method ");
   }
   public static void main(String args[]) {
      new AbstractClassExample().display();
   }
}

Lỗi non-static method… cannot be referenced from a static context

Trước hết chúng ta cần phải hiểu về từ khóa static là gì, mìnhkhuyên các bạn nên tìm hiểu trước đã. Sau đó, các bạn cần hiểu được static context là gì? Đó là ngữ cảnh mà 1 phương thức, thuộc tính được gọi mà không có đối tượng cụ thể, hoặc phương thức, lớp non-static được gọi từ 1 phương thức, lớp static. Chúng ta hãy xem ví dụ sau:

FileSystem dFst = FileSystems.getDefault(); //get default file system

Iterable<Path> dirs = FileSystems.getRootDiectories(); //bị lỗi do getRootDiectories() là non-static nhưng đượcgọi kiểu static(không có đối tượng).

Đoạn code trên cần được sửa như dưới đây.

Iterable<Path> dirs = dFst.getRootDirectories();

Lỗi modifier private not allowed here

 Các bạn cần lưu ý những điều sau:

  • Outer class chỉ có thể là public(visible với mọi class) hoặc package private(ngầm định – không có từ khóa public – visible trong package). Điều này tương tự đói với Interface.
  • Ở phạm vi member cũng tương tự, có thêm private – visible trong nội bộ class, protected – visibletrong package và các lớp con(khác package).
  • Interface chủ chứa thành viên public hoặc package private.
class A {
       public static void main(String[] args) {
           System.out.println("hi");
       }
}

private class B {
       int a;
}

Lỗi can not find symbol

Đây là lỗi khá phổ biến do tất cả các biến trong java đều phải được khai báo trước khi chúng được sử dụng. Có rất nhiều lý do khiến chúng ta gặp phải lỗi này. Hãy cùng điểm qua một số lý do cơ bản:

  • Biến chưa được khai báo: Khi chúng ta sử dụng 1 biến, hãy chắc chắn rằng, chúng đã được khai báo bên trên trước khi chúng được sử dụng
  • Nơi gọi biến không nằm trong phạm vi được sử dụng: Hãy chắc chắn rằng, nơi bạn sử dụng biến nằm cùng phạm vi với nơi chúng được khai báo(cùng class, cùng function,..)
for (int i = 0; i < strings.size(); i++) {

    if (strings.get(i).equalsIgnoreCase("fnoord")) {

        break;

    }

}

if (i < strings.size()) {

    ...

}

Lỗi invalid method declaration, return type required

Thông báo lỗi phần mềm Java này có nghĩa là kiểu trả về của một phương thức không chính xác.

public class Circle

{

    private double radius;

    public CircleR(double r)

    {

        radius = r;

    }

    public diameter()

    {

       double d = radius * 2;

       return d;

    }

}

Một vài nguyên nhân xảy ra lỗi:

  • Quên để kiểu trả về
  • Nếu function không có giá trị trả về thì “void” phải là kiểu trả về của function đó

Bài viết chỉ nêu ra các lỗi cơ bản nhất của lập trình java, tuy nhiên các bạn cũng có thể gặp những lỗi này ở các ngôn ngữ khác (C, C++,…). Anyway, có làm mới có sai, chúng ta hãy cứ tiếp tục học hỏi và tích lũy kinh nghiệm. Quan trọng nhất vẫn là Happy Coding phải không các bạn.

Bài viết gốc: https://codelearn.io/sharing/7-loi-thuong-gap-khi-lap-trinh-java

Leave a Reply

Your email address will not be published. Required fields are marked *