Java - Một số lỗi cơ bản

1. Lỗi
unchecked unchecked call to addelement(e) as a member of the raw type java.util.vector
Nguyên do:
 Compiler không có đủ thông tin về data type để kiểm tra (type check) để thực hiện type-safe:
- 1 raw type gọi generic method
- Gán 1 đối tượng raw type vào đối tượng của generic type (parameterized type)
Ví dụ:
Khi tạo vector.
Khắc phục
thêm <Object> như sau:
Vector<Object> v = new Vector<Object>();
Hoặc thêm @SuppressWarnings("unchecked") vào đầu các method bị lỗi

2. Lỗi
null pointer exceptions
Do biến tham chiếu không biết trỏ vào đâu. Ví dụ:
Integer in;
in = new Integer(4);
thì OK, nhưng nếu biến in được sử dụng trước câu lệnh thứ 2 thì bị lỗi. Tương tư
public void functionA(Integer i)
{
...
}
Khắc phục:
Luôn luôn gán cho biến tham chiếu 1 cái gì đó trước khi dùng, hoặc kiểm tra nếu nó bị null. Ví dụ
public void functionA(Integer i)
{
if (i == null)
...
}

 3. Lỗi
java.lang.ClassCastException
Khi chuyển kiểu (Cast) từ đối tượng của 1 lớp cha về lớp con, hoặc từ 2 lớp không liên quan (không cha-con) với nhau.
Khắc phục:
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

4. Lỗi:
is not abstract and does not override abstract method ...
Có nhiều nguyên nhân, sau đây ta nói 1 vài trường hợp:
a. 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ì được phép)

5. Lỗi:
unreported exception ...; must be caught or declared to be thrown
Khắc phục
Không tìm thấy handler cho checked exception. Xem thêm tại:
http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

6. Lỗi
modifier static not allowed here
Khắc phục
Chú ý cách khai báo biến với modifier là static:
- Chỉ được khai báo trong phạm vi lớp, và phải là lớp static, không khai báo trong thân hàm,
- Với 1 lớp dạng top-level (không là inner của class nào) có thể được coi là static class ngầm định. Nhưng với lớp con,có 2 loại static và non-static, non-static thì không cho phép có thành phần static. Xem thêm:
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

7. Lỗi
 cannot find symbol
Khắc phục:
Nhiều nguyên nhân:
- Do sai chính tả
- Chưa import đúng lớp cần thiết
- Có import nhưng các phương thức tĩnh/ field tĩnh cần được gọi kèm với tên lớp
- Lớp dạng Enum type, để gọi các constant cần dùng import dạng static, ví dụ:
import static java.nio.file.StandardOpenOption.*;
hoặc nếu không, phải chỉ định rõ khi dùng constant, ví dụ:
StandardOpenOption.APPEND
- Đã import đúng, có kèm tên lớp (nếu cần), nhưng cách dùng sai (chú ý: new [Contruction method] và [other method])

8. Lỗi
non-static method ... cannot be referenced from a static context
Khắc phục:
Trước hết chúng ta phải hiểu về từ khóa static là gì, bạn hãy tra cứu trước đã. Sau đấy chúng ta hiểu 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. Hãy xét ví dụ sau:
        FileSystem dfFst = FileSystems.getDefault();    // get default File system
        Iterable<Path> dirs = FileSystem.getRootDirectories();  // bị lỗi, do getRootDirectories() là non-static nhưng được gọi kiểu static (không có đối tượng).
 Sửa --> Iterable<Path> dirs = dfFst.getRootDirectories();

9. Lỗi:
modifier private not allowed here
Một số chú ý:
- Outer class chỉ có thể là public hoặc package private (ngầm định)
- Interface cũng chỉ có thể là public hay package, không thể private hay protected
- Interface chỉ chứa public hoặc package private method
- Outer class hoạt động gần giống static, trong khi đó inner class thì không.

 10. Lỗi:
constructor A in class A cannot be applied to given types
Nguyên do:
Nhiều nguyên nhân, ví dụ:
- constructor của class A không được subclass của nó "thừa kế", ví dụ:
class TestClass {
    public int myTest;
    TestClass(int aMyTest) {
        myTest = aMyTest;
    }
    public int getMyTest() {
        return myTest;
    }
}
class SubTestClass extends TestClass {
    private int myTest2;
    SubTestClass(int aMyTest2) {
        myTest2 = aMyTest2;
    }
    public int getMyTest2() {
        return myTest2;
    }
}
--> Ở đây phải sửa lại constructor SubTestClass là:
SubTestClass(int aMyTest, int aMyTest2) {
        super(aMyTest);
        myTest2 = aMyTest2;
    }

- Nếu subclass không có constructor, compiler gọi 1 constructor mặc định, đồng thời gọi luôn constructor không đối số của lớp cha, nếu lúc này, lớp cha không có consruction không đối số, thì sẽ gây lỗi, ví dụ:
class TestClass {
    public int myTest;
    TestClass(int aMyTest) {
        myTest = aMyTest;
    }
    public int getMyTest() {
        return myTest;
    }
}
class SubTestClass extends TestClass {
    private int myTest2;
    public int getMyTest2() {
        return myTest2;
    }
}
--> Cách khắc phục: hoặc bỏ luôn constructor có đối số của lớp cha (vì lúc này compiler sẽ cho lớp cha 1 constructor mặc định không đối số), còn không, lớp con phải có constructor.

- Lệnh khởi tạo đối tương không tương ứng với constructor, ví dụ:
class TestClass {
    public int myTest;
    TestClass(int aMyTest) {
        myTest = aMyTest;
    }
    public int getMyTest() {
        return myTest;
    }
}

class SomeClass {
    TestClass a = new TestClass(); // không đối số --> lỗi
}

11. Lỗi:
modifier private not allowed here
Chú ý đ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 tương tự với Interface.
+ Ở phạm vị member cũng tương tự, có thêm private - visible trong nội bộ class, protected - visible trong package và các lớp con (khác package).
+ Interface chỉ chứa thành viên public hoặc package private

12. Lỗi:
Contains file with error trên NetBean
Khắc phục:
Rà soát các file trong thư mục làm việc. Ví dụ, sau khi edit, copy/paste từ file bên ngoài vào thường bị lỗi này:
--> rà soát:
- java.util.logging.Logger.getLogger(<file name>.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); với <file name> là file name .java

Nhận xét

Đăng nhận xét