首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 代碼找錯實戰(六):12 道隱蔽編譯/邏輯錯誤深度解析

     編輯:Java 相關知識

本文精選 12 道極具迷惑性的 Java 代碼片段,涵蓋抽象方法語法、局部變數修飾符、final 語義、介面變數隱含屬性、靜態上下文限制等核心語言規則。每題附帶錯誤定位、原因分析與修正方案。

題目 1:抽象方法不能有方法體


abstract class Name {
    private String name;
    public abstract boolean isStupidName(String name) {} // 錯誤:花括號
}

錯誤:abstract 方法以分號結尾,不可有花括號。修正:public abstract boolean isStupidName(String name);

題目 2:局部變數不可使用存取修飾符


void doSomething() {
    private String s = ""; // 錯誤:private 修飾局部變數
    int l = s.length();
}

錯誤:局部變數前不能加 private/public/protected。final 可修飾局部變數(非存取修飾符)。修正:移除 private。

題目 3:abstract 方法不可為 private


abstract class Something {
    private abstract String doSomething(); // 錯誤:private abstract
}

錯誤:abstract 方法旨在被子類實現,不可為 private(同理不可為 final)。修正:protected abstract String doSomething(); 或 public。

題目 4: final 參數不可修改


public int addOne(final int x) {
    return ++x; // 錯誤:x 為 final,不可自增
}

錯誤:final int x 表示參數引用不可變更。修正:移除 final 或用區域變數 int y = x + 1; return y;。

題目 5: final 參數引用不可變,但可修改物件內部狀態


public void addOne(final Other o) {
    o.i++; // 正確:修改的是物件欄位,而非參考 o 本身
}

正確:final 限制參考變數 o 不能指向新物件(o = new Other() 錯誤),但可透過 o 修改物件可變狀態。

題目 6: 實例變數有預設值


class Something {
    int i; // 實例變數
    public void doSomething() { System.out.println("i = " + i); }
}

正確:int i 為實例變數,預設值 0。輸出 i = 0。

題目 7: final 實例變數無預設值,必須顯式初始化


class Something {
    final int i; // 錯誤:final 實例變數未初始化
    public void doSomething() { System.out.println("i = " + i); }
}

錯誤:final 實例變數必須在建構子結束前賦值。修正:final int i = 0; 或在建構子中賦值。

題目 8: static 方法不可直接呼叫非 static 方法


public static void main(String[] args) {
    Something s = new Something();
    System.out.println(DOSomething()); // 錯誤:靜態上下文呼叫非靜態方法
}
public String DOSomething() { return "Do something ..."; }

錯誤:main 為 static,不可直接呼叫實例方法。修正:s.DOSomething()。

題目 9: 類別檔名與 public 類別名必須一致,非 public 類別不受限


// 檔名 OtherThing.java
class Something { // 非 public 類別
    private static void main(String[] args) { ... }
}

正確:只有 public class 強制與檔名同名。非 public 類別檔名可任意。

題目 10: 介面與父類別同名欄位導致歧義


interface A { int x = 0; } // 隱含 public static final
class B { int x = 1; }
class C extends B implements A {
    public void pX() { System.out.println(x); } // 編譯錯誤:x 歧義
}

錯誤:x 同時匹配 A.x 與 B.x。修正:super.x (父類) 或 A.x (介面)。

題目 11: 介面變數隱含 public static final,不可重新指派


interface Rollable extends Playable, Bounceable {
    Ball ball = new Ball("PingPang"); // 實為 public static final Ball ball = ...
}
class Ball implements Rollable {
    public void play() {
        ball = new Ball("Football"); // 編譯錯誤:嘗試修改 final 參考
    }
}

錯誤:介面欄位隱含 public static final,ball 參考不可變更。修正:介面中勿定義可變狀態,或改為方法 Ball getBall();。

題目 12: 內部類別可存取外部類別成員

正確:內部類別物件持有外部類別物件隱含引用,可存取外部所有成員(含 private)。靜態巢狀類別則無此引用,僅能存取外部 static 成員。

題目 13: Web Service 核心名詞解釋

術語全稱核心作用
JAXPJava API for XML Parsing統一 DOM/SAX/XSLT 解析介面,屏蔽具體實現
JAXMJava API for XML MessagingSOAP 訊息傳輸與存取 API
WSDLWeb Services Description LanguageXML 格式描述服務端點、操作、訊息、綁定
SOAPSimple Object Access ProtocolXML 編碼訊息交換的輕量級協定
UDDIUniversal Description, Discovery, IntegrationWeb 服務註冊發現標準,電子商務服務目錄
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved