Rumah  >  Artikel  >  Java  >  Apakah kesilapan biasa dengan kelas dalaman tanpa nama di Jawa?

Apakah kesilapan biasa dengan kelas dalaman tanpa nama di Jawa?

PHPz
PHPzasal
2024-05-02 09:03:01781semak imbas

Ralat penggunaan kelas dalaman tanpa nama: Mengakses pembolehubah di luar skop menggunakan menangkap pengecualian yang tidak diisytiharkan dalam persekitaran yang tidak selamat untuk benang

Java 匿名内部类有哪些常见错误?

Kelas dalaman Java Anonymous: Ralat biasa

kelas Java inner ialah Anonymous class, Ia tidak mempunyai nama dan ditakrifkan secara langsung dalam blok kod yang menciptanya. Ia digunakan secara meluas di Java, terutamanya dalam pengendalian acara dan fungsi panggil balik. Walaupun kelas dalaman tanpa nama adalah mudah, terdapat beberapa kesilapan biasa yang perlu dielakkan. . Jika anda menggunakan kelas dalaman tanpa nama dalam persekitaran berbilang benang, ini boleh membawa kepada perlumbaan data dan tingkah laku yang tidak dapat diramalkan.

// 非线程安全的示例:

public class NonThreadSafe {
    private int count;

    public void increment() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                count++; // 可能导致数据竞争
            }
        };
        new Thread(runnable).start();
    }
}

2. Menangkap pengecualian yang tidak diisytiharkan

Kelas dalaman tanpa nama boleh menangkap pengecualian yang dilemparkan dalam blok percubaan luar. Walau bagaimanapun, berbuat demikian boleh mengaburkan maklumat kritikal atau menyebabkan tingkah laku yang tidak dijangka. Amalan terbaik adalah dengan hanya menangkap pengecualian yang diisytiharkan secara eksplisit dalam blok percubaan kelas dalam.

// 捕获未声明的异常的示例:

public class UncaughtException {
    public void doSomething() {
        try {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    throw new RuntimeException(); // 异常未捕获
                }
            };
            new Thread(runnable).start();
        } catch (Exception e) {
            // 此处无法捕获 RuntimeException
        }
    }
}

3. Mengakses pembolehubah luar sempadan

Kelas dalaman tanpa nama boleh merujuk pembolehubah tempatan dalam kelas yang disertakan. Walau bagaimanapun, pembolehubah ini mesti kekal aktif sepanjang hayat kelas dalaman tanpa nama. Jika pembolehubah tempatan ditimpa atau keluar daripada skop semasa pelaksanaan kelas dalaman tanpa nama, NullPointerException atau pengecualian lain mungkin terhasil.

// 访问越界变量的示例:

public class VariableOutOfScope {
    public void doSomething() {
        int count = 10;
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // count 可能被覆盖
                System.out.println(count); // 可能导致 NullPointerException
            }
        };
        count = 20;
        new Thread(runnable).start();
    }
}

Kes praktikal:

Gunakan kelas dalaman tanpa nama untuk mengendalikan acara klik butang:

public class ButtonHandler {

    public void handleButtonClick() {
        Button button = new Button();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 处理按钮点击事件
            }
        });
    }
}

Gunakan kelas dalaman tanpa nama untuk mencipta benang:

rree

Atas ialah kandungan terperinci Apakah kesilapan biasa dengan kelas dalaman tanpa nama di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn