适用于初学者的Java指针

发布于:2021-01-14 10:05:32

0

189

0

Java 初学者 指南

编程时曾经感到迷路吗?不要担心!今天,我在这里向您展示Java没什么可担心的。

我们都是从初学者开始的。今天,我将解释Java的基础知识,从生态系统到其执行等等。我们将花一些时间探索Hello,World和命令行,最后,我们将深入探讨Java初学者的一些常见错误以及如何编写出这些漏洞的代码。让我们开始吧!

Java主要基础架构组件

Java开发工具包(JDK)包含以下组件:Java运行时环境,工具和工具API和Java语言。Java运行时环境本身包括Java虚拟机,lang和util基本库,其他基本库。此外,我们还有集成库,用户界面工具包和部署。没有部署的所有这些都代表Java SE API。

HotSpot JVM的体系结构由类加载器子系统,运行时数据区和执行引擎表示。我们也有本机方法库。

Java程序流程的执行

计算机如何准确地理解代码?这是相当标准的操作顺序。

  1. 命令行参数被解析

  2. 分配了所需的内存

  3. 环境变量已加载

  4. 找到具有要执行的main方法的类

  5. 虚拟机的创建和初始化

  6. 带有main方法的类已加载

  7. 主方法执行

  8. 执行完成后,返回结果

  9. 虚拟机被破坏

Hello World示例

首先,您需要在名为PatsovHelloWorldExample.java的文件中添加以下文本:

public class PatsovHelloWorldExample {    public static void main( String[] args ) {       System. out .println( "Hello World!" );    } }

根据您的喜好,您可以选择使用IDE或文本编辑器。如果您使用过IDE,那么下一步就是运行程序。如果使用文本编辑器创建了文件,则需要在终端中使用“ javac PatsovHelloWorldExample.java”编译文件,并在终端中再次使用“ java PatsovHelloWorldExample”运行。在图2中,我们可以看到预期的结果。

{xunruicms_img_title}

命令行选项

启动JVM时,我们可以传递一些其他参数来控制

应用程序的执行和一些环境变量。语法如下:“ java [这里我们添加一些选项] -jar filToBeExecuted.jar [这里我们将一些参数传递给我们的应用程序]

“ java [这里我们添加一些选项] -jar filToBeExecuted.jar [这里我们将一些参数传递给我们的应用程序]

一个带有真实参数的实际示例是:“ java -classpath MyApplication.jar the.package.ClassWithMainMethod”

其中一些选项是“服务器”,“客户端”,“类路径”和“帮助”。在参数中,我们可以通过所需的任何内容,具体取决于我们如何开发应用程序以及要实现的目标。

原始类型

这里,我们有一个字节,由8位整数表示,值在[-128,127]之间,还有short数据类型,具有16位整数,值分别在[-32 768,32 767]之间。我们有一个int数据类型,它是一个32位整数,其值在[-2 31,2 31 -1]之间,而long是一个64位整数,以及浮点数float和double,其中float是一个精度为32位IEEE 754浮点数,而double则为双精度64位IEEE 754浮点数。我们还有一个布尔值,它是true或false,而char是一个16位Unicode字符。

对于货币,您将需要使用java.math.BigDecimal类,对于真正的大整数,您将需要java.math.BigInteger类。

集合

实际上,所有集合都代表一个容器,该容器将一些逻辑连接的组件分组为一个整体。它们通常分为3种类型:用于通用目的(例如ArrayList,LinkedList,TreeMap,TreeSet,HashMap和HashSet),并发的(例如ConcurrentMap,ArrayBlockingQueue,Vector,LinkedBlockingQueue和PriorityBlockingQueue)和专用的(如EnumSet,CopyOnWriteArraySet和WeakHashMap)。

该系列最适合:

  • 排序

  • 正在搜寻

  • 改组

  • 操作–反向,填充,复制,交换,批量添加

  • 查找最大值/最小值

常用表达

为了获得最佳学习效果,建议解决RegEx填字游戏。一些最著名的模式匹配表达式是:

  • ^ –用于匹配行首,

  • $ –用于匹配行尾,

  • 。–用于匹配除换行以外的任何字符

  • [somecharactershere] –用于指定一组字符,从中只能匹配一个字符,

  • [^ asd] –用于匹配未列出的任何字符(排除),

  • * –用于匹配之前出现的0个或多个表达式(例如asd *与'as'和'asd'匹配),

  • + –匹配之前出现的1个或多个表达式,

  • ?–匹配之前出现0或1个表达式

常见问题以及如何避免

问题:空指针异常–当我们实际上需要对象时尝试使用null时,会发生这种异常

解决方案:如果某个时候您的对象可能变为null,则应考虑在代码中添加null检查,尤其是当您自己没有创建对象时。同样,最好返回空集合而不是null。添加验证以设置和获取方法也是一个好主意。

问题:将比较运算符(==)与赋值运算符(=)混淆。

解决方案:如果您来自另一种语言,则需要一些时间来适应。我用来记住这一点的一个简单技巧是:如果您知道只对一个值感兴趣(将一个值分配给另一个值),则使用单个“ =”,否则,如果您关心两个变量和值(正在比较它们),您需要使用双“ ==”

问题:使用比较运算符(==)代替.equals()来检查相等的字符串。

解决方案:不会使用比较运算符(==)检查所有Java对象是否相等。相反,我们使用.equals()方法。在Java中,String是不可变的对象,而不是原始类型。

问题:无法正确使用访问修饰符(私有,受保护,公共和默认)

解决方案:尝试以更面向对象的方式进行思考。在实施之前要多想一点。“我应该能够从课堂之外调用该方法吗?我有权这样做吗?” 了解有关信息隐藏,松散耦合和创建应用程序层的更多信息。

问题:通过实现现有的库和工具来尝试彻底改变方向。

解决方案:了解Java标准库。与其他程序员进行更多配对编程。阅读本文,其中包含所有推荐的Java工具。尝试自己找到工具。了解如何使用Google和Stack Overflow。

问题:通过对对象的引用来更改对象的状态。当get方法返回可变对象时,通常会发生这种情况。这是非常不安全的!

解决方案:学习正确使用访问修饰符。在get方法中返回不可变的对象。创建get方法时,请始终考虑是否有可能实现该对象,并在返回对象后对其状态进行不希望的更改。了解有关如何在Java内存中定位和引用对象的信息。不要对通过值传递和通过引用传递感到困惑!

问题:语法错误,拼写错误,使用错误的重载函数,花费太多时间单击IDE中的菜单以实现所需的功能。

解决方案:获得一个不错的IDE。语法错误将在较早时检测出来,您将能够修复它们。了解IDE的功能。了解最常见的快捷方式,以便在开发时节省时间。正确设置代码格式。请勿经常更改IDE,或者如果可以的话,请不要更改。认真学习。这将成为您最好的自我延伸。使用有意义的变量名。

问题:资源没有被释放。您打开一些连接/文件/资源,然后不关闭它。

解决方案:这是实现java.lang.Autocloseable接口的任何类的“ Try-with-resources”语句。在执行try块之后,将自动关闭try()部分中所有打开的资源。下面的例子:

public class TryWithResources {    public static void main(String[] args) {       try (BufferedReader br =          new BufferedReader(             new FileReader(                System. getProperty ( "user.home" ) +                   "/Downloads/text.txt" ))) {          System. out .println(br.readLine());       } catch (IOException e) {          e.printStackTrace();       }    } }

问题:将字符串串联在一起。不要在家尝试这个。仅在家长咨询下允许。在每个字符串连接上,都会创建一个新的String对象(字符串是不可变的)。在某些时候,您将耗尽内存,或者开始执行会花费太多时间。

解决方案:在循环中串联内容时,请使用StringBuilder而不是String。

问题:循环执行SQL查询。

解决方案:尽可能优化对数据库的查询,因为执行查询是一项非常昂贵的操作。尝试通过单个查询获取所有必要的信息,然后遍历结果。

问题:空的catch块/忽略异常

解决方案:至少可以做的是将异常的堆栈跟踪信息打印到默认输出。通常,您可以将某些记录器用作Log4j,并使信息记录更加容易。

问题:调用run()而不是start()来启动线程。

解决方案:直接调用run()是错误的。这是一个非常常见的错误。始终使用start()!另外,建议实现Runnable接口,而不要继承Thread类。

问题:实施时考虑不足。一些结果可能是:死锁,从静态上下文中调用非静态方法,在迭代集合和所有逻辑错误时以不正确的方式删除项目。

解决方案:思考。设计。观察一下。如果您有一个小时来解决问题,请花50分钟考虑解决方案,并花10分钟进行实际执行。