每个Java学习者都会犯的10大常见错误1
據說:“您的朋友會吞下您的錯誤,您的敵人會將它們呈現在盤子上”。 我絕對不是你的敵人,但我想向您介紹一些針對每個Java初學者的錯誤,我將在此博客“標牌”上就此做錯。 當然只有我從CodeGym.cc課程分析系統收集的內容。 如果您還不了解,CodeGym是一門從入門到高級的實用Java課程。
因此,它們在這里。
0.分配還是比較(=或==)?
這是從頭開始學習Java的學生的第一個錯誤。 容易混淆=是分配運算符,而==是關系運算符。 這是自然的錯誤,因為在數學中“ =”比Java的“ =”更接近Java的“ == ”。 通常,編譯器會捕獲此類錯誤,但是可以將其隱藏起來。 例如:
boolean myBoolean; If (myBoolean = true) { doSomething; }看到? 無論如何,此塊都將是真實的,因為您將其分配為真實的…
1.用==運算符比較字符串。
在完成第一個Java任務(通常有一些控制臺輸出和算術問題)后不久,您將學習String類。 但是,初學者常常會忘記,特定的字符串不是char或int等原始類型的代表,而是一個對象。 您不能使用==運算符比較對象。 請記住,使用string.equals(Object object)函數來比較字符串(或其他對象),而不是==運算符。 等于檢查字符串的內容,而==運算符檢查對對象的引用是否相等。
老實說,字符串常量通常是“ interned”。 這意味著具有相同值的兩個常量實際上可以與==進行比較,但并不真正依賴于此。使用.equals。
2.類的不同名稱以及其代碼所在的文件。
幾年前,這個錯誤非常普遍(甚至可能是所有人)。 現在,即使是初學者也正在使用現代IDE,并且它已瀕臨滅絕。 無論如何,記住Java文件名和類名應該相同是很有用的。 例如,如果您命名文件Test.java并在其中編寫一些類CodeGymTest代碼:
//File name: Test.java public class CodeGymTest { public static void main(String[] args) { System.out.println("Hello world"); } }您將獲得下一個輸出:
Test.java:9: error: class CodeGymTest is public, should bedeclared in a file named CodeGymTest.java public class CodeGymTest ^ 1 error順便說一句,如果您從類名稱中刪除public修飾符,則程序將運行。
從main方法或其他靜態方法訪問非靜態成員
很多時候,初學者不知道如何使用靜態上下文。 靜態變量是在類的所有實例之間共享的變量。 因此,只有一個副本被所有對象共享。 因此,我們不能以“靜態方式”使用非靜態變量。 main()method (which is static!), when novice programmer attempts訪問實例變量或方法時,此錯誤通常發生在main()method (which is static!), when novice programmer attempts 。 如果您嘗試這樣的代碼
public class MyExample {public String myString; public static void main(String[] args) {myString = “non static String”; }}我們有編譯錯誤:
non-static variable number cannot be referenced from a static context 。
我們應該怎么做才能避免這種情況? 首先,我們可以將我們的變量設為靜態,但是它并不總是符合程序的目的。 解決方案之一是創建我們類的對象:
public class MyExample {public String myString; public static void main(String[] args) { MyExample myExample = new myExample(); myString = “non static String”; }}請記住,您可以使用靜態變量或靜態或非靜態上下文中的方法。 您可以使用對象引用處理非靜態元素。
4.數組索引超出數組范圍
在初學者編程的學生中,這是一個非常普遍的錯誤。 這種流行的原因是,最初或多或少的復雜任務是關于數組和循環的。 很簡單的例子:
String[] name = { "Snoopy", "Woodstock", "Charlie Brown" }; for (int i = 0; i <= name.length; i++) {System.out.println(name[i]); }循環從零元素“史努比”開始,然后轉到第一個“ Woodstock”,再到第二個“ Charlie Brown”……并嘗試打印第三個元素,但是我們沒有它(我們的“第三個”是“第二”(例如“第一”)是數字零)。 這里的錯誤非常明顯,但并非總是這樣。
對于新手來說,周期和數組非常困難。 然而,實踐使鉆石。 CodeGym上有數百個數組和循環任務。 嘗試解決它們(現在免費!),以獲得自信的技能。
周期或條件錯誤
在下面的塊中,您不打印任何數組成員。 首先,循環以“;”結尾 所以什么都沒發生 甚至更多:該程序將無法運行,因為您的int i僅在循環內運行,并且以“;”結尾。
public static void main(String[] args) {int [] myArray = {2,5,7};for (int i=0; i<3; i++);{System.out.println(myArray[i]);}}如果您嘗試這樣的事情:
public static void main(String[] args) {int [] myArray = {2,5,7};int i = 0;for (i=0; i<3; i++);{System.out.println(myArray[i]);}}您有java.lang.ArrayIndexOutOfBoundsException,因為System.out.println嘗試打印元素#3和僅此元素,但是我們沒有這樣的數組成員。 最后一個是第二個,它是7。
同一個故事; 和條件。 例如:
public static void main(String[] args) {int [] myArray = {2,5,7};if (myArray[0] > myArray[1]);System.out.println("it is");}}這里不滿足該條件,但是由于“;”而將打印“它是” 如果施工后。
如果您開始學習CodeGym,那么您將獲得第4級 Java語法quest 上帶有循環的第一個編碼任務 。 我想您會忘記解決足夠問題的這種錯誤。
6.缺少一個Switch-Case結構中的“ break”關鍵字
缺少“ break”關鍵字的尷尬之處在于沒有編譯器錯誤。 但是,您的代碼工作方式錯誤。
看下面的代碼示例,我們忘記在“ case 0”中插入一個中斷。 該程序將運行,但同時打印“ 0”和“ 1”,因為開關構造因中斷而結束工作。
public static void switchCasePrimer() {int counting = 0;switch (counting) {case 0:System.out.println("0");case 1:System.out.println("1");break;case 2:System.out.println("2");break;default:System.out.println("Default");} }此規則有例外。 開關塊可以與返回操作員一起完成工作
public class test {public static void main(String[] args) {System.out.println(showSwitch(1));}public static int showSwitch(int condition) {switch (condition) {case 1:System.out.println(1);return 1;case 2:System.out.println(2);return 4;case 3:System.out.println(3);return 8;default:System.out.println("default");return 256;}} }在這種情況下,開關在情況1之后立即完成其工作。
7.混亂與值傳遞和引用傳遞
如果將原始數據類型(例如char,int或double)傳遞給方法,則按值傳遞。 這意味著該數據類型的副本將被復制并傳遞給您的方法。 如果在方法內部修改了該數據,則對方法外部的“原始”數據沒有影響。
當您將Java對象(例如數組或字符串)傳遞給方法時,這意味著您將傳遞引用(數據的地址),而不是重復項。 因此,如果您在方法中更改數據,那么它也將在其外部更改。
public class Main {static int[] outer = new int[3];public static void swap(int[] array) {System.out.println("(swap) Before swap :" + Arrays.toString(array));int first = array[0];int last = array[array.length - 1];array[0] = last;array[array.length - 1] = first;System.out.println("(swap) After swap :" + Arrays.toString(array));}public static void main(String[] args) {outer[0] = 0;outer[1] = 1;outer[2] = 2;swap(outer);System.out.println("(main) After swap :" + Arrays.toString(outer));}8.嘗試使用未初始化的字段或變量
在沒有初始化的情況下使用對象類型非常危險。
類變量由默認值初始化(0表示int,0.0表示double,false表示布爾值,null表示非原始類型(對象)。
public class Test2 {static String test;public static void main(String[] args) {System.out.println(test);} }輸出為:
Null使用本地方法變量時,需要手動對其進行初始化,否則會出現編譯錯誤。
public class Test2 {public static void main(String[] args) {String test2;System.out.println(test2);} }輸出為:
Error:(6, 28) java: variable test2 might not have been initialized9.忘記整數除法
如果將一個int劃分為另一個int,您將再次獲得int。 所以?= 0,而不是0.5:
public static void main(String[] args) {int i = 1;int j = 2; int k = i/j; //here we’ve got 0 }您可以從CodeGym的Java語法要求中了解除法和實型,并解決與該主題相關的許多編碼任務。
10.在子對象中調用構造函數的順序混亂
當您嘗試創建Child類的實例時,首先調用Child,然后調用Parent。 父子關系中構造函數執行的順序從基本(父)類繼承到繼承(子)。
public class Test3 {static class Parent {Parent() {System.out.println("a Parent is created");}}static class Child extends Parent {Child(){System.out.println("a Child is created");}}public static void main(String[] args) {Child child = new Child();} }輸出:
a Parent is created a Child is created如果加入CodeGym,您將在 Java Core Quest中 遇到OOP和繼承 。 這個主題確實有很多任務。 因此,遲早您將對OOP原理有一個細微的了解。
結論
我想,沒有文章可以積累Java新手的所有潛在錯誤。 但是,這樣的列表對于避免常見的錯誤非常有用……并且有時間查找較少的瑣碎問題! Praemonitus,praemunitus(*被預先警告)。
但是,最重要的步驟不是避免錯誤,而是練習編碼本身。 因此,我們創建了 Java核心課程 CodeGym ,其中包含1000多個練習任務,有趣的講座以及有關您的改進的即時反饋。 當您犯了一個錯誤,普遍或罕見的錯誤時,CodeGym System會警告您有關錯誤,并提供避免錯誤的建議。 自己嘗試該課程,目前免費。
不要停止練習,您肯定會成為更好的軟件開發人員。 祝您學習愉快!
PS:您曾經從本文中犯過錯誤嗎? 您在學習中遇到什么錯誤? 在評論中告訴我們!
翻譯自: https://www.javacodegeeks.com/2019/04/common-mistakes-every-java-learner-makes.html
總結
以上是生活随笔為你收集整理的每个Java学习者都会犯的10大常见错误1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (开发嵌入式linux系统)
- 下一篇: webapp文本编辑器_Project