每个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 be 
  declared in a file named CodeGymTest.java 
  public class CodeGymTest 
 ^ 
  1 error 

顺便说一句,如果您从类名称中删除public修饰符,则程序将运行。

3.从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上有数百个数组和循环任务。 尝试解决它们(现在免费!),以获得自信的技能。

5.在周期或条件中输入“;”错误

在下面的块中,您不打印任何数组成员。 首先,循环以“;”结尾,因此什么也没有发生。 甚至更多:该程序将无法运行,因为您的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)传递给方法,则按值传递。 这意味着该数据类型的副本将被复制并传递给您的方法。 如果在方法内部修改了该数据,则对方法外部的“原始”数据没有影响。

  public class Main { 
   public static void swap( int i, int j) 
  { 
   int temp = i; 
  i = j; 
  j = temp; 
   System.out.println("from swap method i = " + i + ", j = " + j); 
  } 
   public static void main(String[] args) { 
   int i1 = 1; 
   int j1 = 2; 
  swap(i1,j1); 
   System.out.println("from main method i = " + i1 + ", j = " + j1); 
  } 
 } 

当您将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 initialized 

9.忘记整数除法

如果将一个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 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:您曾经从本文中犯过错误吗? 您在学习过程中遇到什么错误? 在评论中告诉我们!

本文最初是为 Java Code Geeks博客 撰写的 。