java 命令行-src_Java命令行提示找不到入口

初学Java时,总是要在命令行里面敲一敲、试一试才行。如果一开始就在集成开发环境中编写运行代码,很容易就会漏掉一些重要的内容。比如这个:错误: 找不到或无法加载主类 Test

原因: java.lang.NoClassDefFoundError: a/Test (wrong name: Test)

要搞清楚这个问题,首先我们要知道Java命令行使用的一般步骤:

一般步骤:

java源代码是以 .java结尾的文件。而对于这类文件来说,它们的本质和.txt文件的本质是相同的,即都为文本内容。但这并不意味着你可以直接编译 .txt,编译器不会允许.txt文件通过编译,你还是需要将文件改为 *.java才行。

编译:Javac

编译就是把 .java 文件转换为 .class文件的过程,这个过程可以借用javac完成。

首先,我们需要用记事本写一个文本文件,并改名为Test.java

其内容如下:public class Test {

public static void main(String[] args) {

System.out.println("Hello World!");

}

}

要编译这个文件,我们需要运行cmd,打开命令行工具,并切换到Test.java所在目录。输入 javac Test.java$ javac Test.java

这句话运行完成后,如果没有任何提示则说明运行正确,代码没有语法问题。

如果出现下面的情况,则是没有main入口,需要检查一下main部分是否有错误。错误: 在类 Test 中找不到 main 方法, 请将 main 方法定义为:

public static void main(String[] args)

否则 JavaFX 应用程序类必须扩展javafx.application.Application

运行成功后,目录下会多出一个(有时是多个) *.class文件。

在本例中,会生成一个Test.class文件

运行:java

运行就是用java虚拟机解释运行 .class字节码的过程。

如果要运行一个 class文件,我们应该以java + 包名.类名 的形式运行。

本例中没有包名(package为空),所以运行格式应该是 java + 类名。输入java Test,运行结果如下所示。$ java Test

Hello World!

带包名的情况

再看一个略微不同的package a;

public class Test {

public static void main(String[] args) {

System.out.println("Hello World!");

}

}

这一次我们还按照原来的方法编译、运行。c:\Users\15591\MyFiles\WorkSpace\VSCode-C

$ javac Test.java

c:\Users\15591\MyFiles\WorkSpace\VSCode-C

$ java Test

错误: 找不到或无法加载主类 Test

原因: java.lang.NoClassDefFoundError: a/Test (wrong name: Test)

命令行提示错误,那么为什么加入了package a;之后就不行了呢?

java创建起初就为了避免命名污染的问题,规定了package内容。所谓不同的package,其实就是不同的文件夹。package a 就意味着文件夹a。

此例的package为a,所以我们要将Test.class文件放到a文件夹下面才能正确运行。注意运行时把包名带上,即 a.Testc:\Users\15591\MyFiles\WorkSpace\VSCode-C

$ mkdir a

c:\Users\15591\MyFiles\WorkSpace\VSCode-C

$ move Test.class a\

移动了 1 个文件。

c:\Users\15591\MyFiles\WorkSpace\VSCode-C

$ java a.Test

Hello World!

运行正确!

小结:

java执行class文件时,会根据输入的 包名.类名 的形式,以当前路径为基础,再根据包名所提供的相对路径信息,去该目录下寻找相应的类。

例如 ,当前目录为C:Users15591MyFiles,运行的命令为java a.b.c.D。那么java虚拟机就会去C:Users15591MyFilesabc目录下寻找D.class文件,并以它的main方法为入口开始执行。

也有朋友提到CLASSPATH的问题,但是自从jdk5.0之后,虚拟机会自动处理大部分classpath问题,我们也就不用太关注这个问题了。

本文由 ukuq 创作,采用 知识共享署名4.0 国际许可协议进行许可

本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

最后编辑时间为: Aug 20, 2019 at 11:13 pm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值