初学Java,从HelloWorld开始

JAVA版hello world全攻略
侯光敏

    看到很多技术网站的BBS上面充斥着java初学者的关于运行第一个java程序的求助信息,我觉得作为“过来人“很有写这篇文章的必要,因为他们遇到的都是些很低级的问题,但是让这些问题占据bbs上那么多宝贵的空间就太不应该了。
    要搞清楚的基本概念
    java是一种跨平台的网络语言,为了能够在不同平台上运行,它使用了虚拟机这个概念。后缀名为java的文件是源代码文件,它经过编译后生成的是 class文件。虚拟机执行的就是这些class文件,将它们转化成为不同平台能够运行的命令。这就是为什么java的效率比较低的原因。也是因为这个原 因,在java里没有其它语言的使用者熟悉的exe文件的概念。
    执行hello world的方法
    切记:在命令行中输入 javac 源文件名.java (编译)
                        java  源文件名      (执行,没有后缀)
这里说的是java application,里面包括main函数。
如果hello world是applet版的,在命令行中输入appletviewer 源文件名 (已经编译后的class文件)
如果class文件已经嵌入了html网页中,直接用IE打开就行了。
    application经常出现的错误
    系统提示Exception in thread "main" java.lang.NoClassDefFoundError。出现这个提示的原因可能有:
    1 你把文件名拼错了,java对大小写是敏感的。打错了当然找不到文件。
    2 虚拟机没有找到必须的类库。你可能没有在autoexec.bat文件中设置classpath。进入windows的运行,输入sysedit,然后在 autoexec.bat文件中加入这么一行:set classpath=你的jdk的安装目录\lib; 例如set classpath=c:\jdk1.3.0_02\lib; 保存退出后,你要在dos窗口的c根目录下执行一遍autoexec.bat文件已保证被设置了,当然,如果你愿意也可以重启机器。
    系统提示HelloWorld.java:1: Public class helloworld must be defined in a file called
           "HelloWorld.java".
            public class helloworld{
            ^
一个Java源程序中可以定义多个类,但是,具有public 属性的类只能有一个,而且要与文件名相一致。还有,main方法一定要放在这个public
的类之中,这样才能运行这个类。
     系统提示Exception in thread "main" java.lang.NoSuchMethodError: main 出现这个异常是因为你在抄书上的代码时抄错了。主函数一定要这么写:public static void main(String args[]) 一个字都不能错,切记!!!
    applet常出现的错误
    IE显示了一个灰色的区域,但是上面没有显示hello world,状态栏显示load:calss 你的class文件名 no found 。出现这个问题是因为IE没有找到applet(有点废话),你应该把class文件放在和html文件相同的目录下。如果class文件在该文件夹的子 目录下,那么要这么写CODE= "子目录名.文件名.class"。
    IE显示applet已经启动,但是还是只显示灰色的一块。这种问题在使用jBuilder等集成开发工具是最容易出现,用appletviewer就没 有问题。这是因为你在applet中使用了IE不支持的java版本。jBuilder在做applet是默认使用了swing组件,但是IE只支持 jdk1.1,所以造成了这种情况。只要把导入swing的语句去掉就行了,然后按照提示修改一下代码,不要用swing组件的方法。如果你觉得 swing组件很漂亮,打死都要用,那么就装一个java的plug-in这个东西在你装jdk的高版本时就自动装上了。看看你的控制面版中有没有那个红 鼻子的小东西。但是切记,如果你要用它,那么你的html的文件的写法就和从前不一样了,不能简单的用CODE来指明类了。至于怎么写,不在这篇文章的讨 论范围内了(你写一个hello world还要用plug-in就搞大了)。网上有很多文章讲怎么写。
     怎么实现点击就执行
     用惯了点击就执行的的exe文件自然就很不习惯打开dos窗口输入命令行,你可以把它做成jar文件,但是对hello world来说有点麻烦,有个简单的傻办法:自己做一个批处理文件。例如:用记事本写一个run.txt文件,内容是:java 你的主文件名 ,然后把后缀改成bat存到和主文件相同的目录下。呵呵,双击就运行了,够傻吧。
     如果你非要用exe文件运行,jet等工具可以把class文件做成exe文件。但是这样也失去了java的跨平台性。
     以上就是hello world的全攻略了,如果你还看不到“hello world“,我倒!你还是别学java了。

=========================================================================================

Java程序的编译和运行
    Java程序的编译程序是javac.exe,它是负责解释执行编译后的字节码。
    我们只需要明白一个问题,编译是使用javac程序对源Java文件的编译,运行是用Java这个工具程序(在Windows平台是java.exe)来运行一个类(.class文件),但类文件的扩展名可以省略不写。
    注:Class文件是Java程序的可执行代码,称为Class文件。Javac将Java文件编译成字节码,也就是Class文件。
    Javac的用法如下:
    javac -g-O-debug-depend-nowarn-verbose-classpath path-nowrite-d dir
    -d directory 指明类层次的根目录。用javac -d DIR yourfile.java编译后可以把生产的.class文件存放在DIR目录里。
    -classpath path 定义Javac搜索类的路径。它将覆盖缺省的CLASSPATH环境变量的设置。
    对于详细的参数设置,可以用javac -help查看帮助。一般情况下,你只需要简单地使用下面的命令编译和运行Java程序就行了。
    编译:javac filename.java
    执行:java yourClass
   

 编程演练
    先动手写出一个程序,在运行起来时会很有成就感的,所以很多讲编程语言的书都会不失时机地用一个简单的程序来引导读者。这的确是个不错的主意,有了成功的体验,相信接下来的学习就难不倒你了。
    我们先看看两个简单的Java程序:
 

   例一:控制台(俗称DOS窗口)里输出Hello World,让你喝上第一杯咖啡
 //filename  HelloworldApp.java
 import java.io.//引入Java包
 public class HelloworldApp//定义类名
 public static void main String args //主方法,程序从这里开始执行
 System.out.println″Hello this is a simply test″//输出字符串,字符串用引号括起来
 //程序结束
    怎么编译、运行一个程序呢?上一期我们介绍了JDK,现在我们装好JDK后,先将上面的代码保存到一个文本文件HelloworldApp.java。
    然后在当前目录下运行javac HelloworldApp.java
    可能你需要等待几秒钟才能编译完成。现在看看,目录下是不是多了一个HelloworldApp.class
    OK,再运行java HelloworldApp,现在你会看到程序的输出结果:Hello??this is a simply test !
    提示:如果出现“Exception in thread ″main″ java.lang.NoClassDefFoundError  HelloWorldApp ”错误,那么,需要设置你的Classpath的路径(你应该先设置好环境变量),在Helloworldapp.class的当前目录下运行“set classpath=.”命令来设置classpath为当前目录。然后运行java test就不会出错了。或者请参考前一期的环境配置一节。
    现在,程序运行起来了。 那我现在告诉你,以“//”开始的部分为Java程序的注释,每一个语句以分号结束……
   

 例二:编写一个简单的窗口程序
    也许,你对这种只能在控制台下运行的程序不太感兴趣吧!那好,下面我们看一个能在Windows下运行的Hello World程序。
 /文件名:test.java/
 /
  The first program.
  @author warton
 @version 1.0 2004-01-01
 /
 import javax.swing.JOptionPane //需要调用JOptionPane类
 public class test //定义类名
 public static void main String  args //开始main方法
 //显示一个消息框
 JOptionPane.showMessageDialognull″Hello?? this is a basic Java program ″

 System.exit 0 // 程序结束
  //结束method
  //结束Class
    编译并运行程序。

    演练代码分析
    现在我们来分析一下,上面两个经典的Hello World程序的结构,以便让你举一反三,写出比Hello World更经典的程序。
    其中,import为引入Java包,如语句import java.io.引入Java基础IO包,并以分号结束。
    IO包package含各种输入输出流操作,就如同C/C++语言中的#include ″stdio.h″或#include ″iostream″差不多。与C++语言中不同的是Java的程序以一个Class开始:public class test定义一个public类型的test类,类的执行从main()方法开始执行,和c/c++语言中的main()函数类似。
    public class test定义了一个类,类是公共public类型的,类名为test。要注意的是Java中主类名应该和要保存的Java文件名相同。也就是说,这里定义 的类名是test,则文件应该保存成test.java(这样,我们编译就用javac test.java命令??运行这个类就用java test命令)。
Main()方法中有参数String args,用于从命令行向应用程序传送参数。我们可以用args 0 args 1   ...args n 来访问这些参数。比如用System.out.println args 0来输出第一个命令行参数,这一点和C语言很类似。
    import javax.swing.JOptionPane引入了Java的界面设计包Swing中的JOptionPane类。 Pane.showMessageDialog方法显示出一个消息框。
    System.exit 0 则是退出程序。
    //之前的部分为代码注释,//之间的@开头的标记就是javadoc标记(这将在后续章节中详细讲解,不过现在可以先运行“javadoc -d doc -author -version test.java”试试,你会看到当前目录下多了一个DOC文件夹,里面有Javadoc生成的漂亮的HTML文档)。

    增强理解
    相信不少朋友在学校一定学过C/C++语言吧!为了让你更深入地了解第一个例程,我们先用一个C语言程序来说明。当然你如果没有C/C++语言基础的话,可以跳过。
 #include ″stdio.h″//引入头文件
 main //C++的main函数,相当于Java的main方法(在Java里,是类的一个方法,称为Method)
 printf″This is a simply test
 ″//输出字符串
 //结束
    也许你的编程起步是从C++语言开始的,根本没接触过纯C语言,那么很简单,我们用纯C++语言来描述一下这个程序:
 #include ″iostream.h″//按C++语言标准应该写在#include″ iostream″
 void main void //c++程序开始执行
 cout<<″This is a simply test ??″<

=========================================================================================

初级版FAQ

Sun的The Java FAQ:       go
ranchgirl提供的FAQ:    go
JDK下载:jdk 6.0  J2SE 5.0    J2SE 5.0 日本语    J2SE 1.4.1    J2SE 1.4.2 日本语
jdk 6.0文档下载:    chm格式    html格式
jdk 6.0在线文档:    jdk 6.0 online docs
jdk 6.0 turtorial:    jdk 6.0 turtorial    turtorial 下载
java ide下载:    netbeans    eclipse

论坛资源版精华:    论坛资源版精华


Q: JAVA的环境变量如何设置? A: 如果是Win95/98,在\autoexec.bat的最后面添加如下3行语句:
set JAVA_HOME=c:\j2sdk1.4.2
set PATH=%JAVA_HOME%\bin;%PATH%
set CLASSPATH=.;
看好了CLASSPATH中第一个“.”,这个代表当前目录,很多人HelloWorld没有运行起来大多是这个原因。

如果是Win2000或者XP,使用鼠标右击“我的电脑”->属性->高级->环境变量
系统变量->新建->变量名:JAVA_HOME 变量值:c:\j2sdk1.4.2
系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%\bin;
系统变量->新建->变量名:CLASSPATH 变量值:.;
CLASSPATH前面的那个"."和上面的意义是一样的。

Q:javac 不是有效的内部命令 A:有两个原因:1 没有安装jdk,安装了jre,这时候是可以运行java命令,但是javac不能运行。2 安装了jdk但路径设置不对,也就是path这个环境变量设置不对,请参考如上设置方法,一定要在path的最前边加上jdk的bin目录的路径。例如, 如果设置了JAVA_HOME,那么在path前加【%JAVA_HOME%/bin;】

Q: JDK怎么使用? A: 按照提示把JDK安装成功,设置好环境变量,打开记事本,输入:

public class HelloWorld {
public static void main(String[] args) {
            System.out.println("Hello ,world!");

}
}

保存为HelloWorld.java ,注意保存时要选择"所有类型", 打开命令提示符(Dos),进入你保存文件的目录,
[i]javac HelloWorld.java[/i] (编译) 如果没错误,再
[i]java HelloWorld[/i] (运行)
java.sun.com官方关于第一个Java程序编写的教程.
Your First Cup of Java (for Microsoft Windows)

Q: 运行javac HelloWorld.java 为何“error:cannot read:HelloWorld.java 1 error” A: 首先检查文件名的的拼写,大小写是否正确,再看目录是否正确。可以在运行该命令的窗口中dir HelloWorld.java,看有无该文件。

Q: java HelloWorld 提示“NoClassDefFoundError: HelloWorld Eception in thread "main"”
A: 首先可能是你CLASSPATH没有设置正确,请按照上面的那个步骤进行设置。如果你路径设置正确了,请确认你的类名是否正确,JAVA中大小写是区分的,看看你的类名是否正确。

Q: 提示“Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/java” A: 编译用“javac HelloWorld.java”,要扩展名。运行用“java HelloWorld”,不要扩展名。

Q: Applet 怎样运行? A: 主要有两种方法
1 JDK中的applet浏览器。
2 IE浏览器
这两种方法都要将Applet嵌入到 HTML 文件中,如
<applet code="MyApplet.class",width=200 height=150>
</applet>
保存在和源文件同目录下,文件名为xxx.html,如果用JDK中的applet浏览器看,就在命令提示符下运行
appletviewer xxx.html
用IE看直接双击 html 文件即可

Q: 为什么用IE运行Applet时,显示的就是一片空白 A: IE本身并不支持Applet 的运行,要去 java.sun.com 下载一个插件(java plug_in)

Q: NullPointerException的原因? A: NullPointerException发生的原因是操作了一个为null的变量,比如使用该为null变量的【.】操作.如

File[] fileSet=new File[3];//只是初始化了fileSet数组,并没有初始化各个元素,各个元素现在仍为null.

fileSet[0].exists();//该操作就会造成NullPointerException异常.


Q: 查看Applet不能运行的错误原因? A:对于用浏览器来查看的方式,如果是ie的话,可以通过工具-》Sun java控制台来看看是什么错误。其他浏览器也有类似的sun java控制台。

Q:为什么编译提示uses or overrides a deprecated API?(或java文件使用或覆盖了已过时的API) A:From jdk文档 java.langAnnotation Type Deprecated

programmers are discouraged from using, typically because it is dangerous, or because a better alternative exists. Compilers warn when a deprecated program element is used or overridden in non-deprecated code。

Q:为什么编译提示class YourClass(注:你的类名)is pubic, should be declared in a file named YourClass.java? A:有两种情况,只有一个解释。两种情况是:
1 把两个public类放在同一个文件中,这样就会出现该问题。
2 一个文件虽然只有一个公共类,但该文件的名字和public的类名不一致(注意大小写,必须和你的public的类的名字大小写完全一样)。

一个解释也就很清楚了,public类所在的文件名不是“类名+.java”。改正的方法也很明白了,一个java文件中只有一个public类,并且该文件名的大小写和public的类的类名完全一致。

Q:uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
A:和泛型有关。不过只是个Note,你可以不用管它。
在1.5中,使用util中的类时,如List,希望你指定特定的类型,如List<String>,这样就只能add String类型的元素。如果没有参数化集合类,就会出现这样的提示,你可用 javac -Xlint:unchecked编译来试试。

Q:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 A:数组越界,访问数组下标为6的元素时发生的越界异常。

Q:编译提示:不是抽象的,并且未覆盖超类或接口中的抽象方法。
例如如下代码:

public class check extends Applet implements ItemListener{
public void init(){ 

      .......

} 

public void itemStateChange(ItemEvent e){
      ......

}
}

编译提示:check不是抽象的,并且未覆盖java.awt.event.itemListener中的抽象方法:itemStateChanged(java.awt.event.ItemEvent)

A: 编译提示中说得很明确。check实现了ItemListener,但却没有覆盖其中的抽象方 法:itemStateChanged(java.awt.event.Item.Event)。检查上边的代码,其中的方法名错写成 itemStateChange,最后一个单词是Changed。
在java中,如果类继承了超类,或是实现了接口,而没有实现其中的抽象方法,该类必须被声明为abstract类,否则就会出现如上的提示。出现这种错 误的原因有三:1 没有写这个方法。2 写这个方法了,但是方法的签名和需要的不一样,容易出现方法名写错。3 参数类型不一致,参数顺序不一致。其中方法名写错最容易出现。
这种情况下,仔细对照ItemListener的API文档,看看自己写的方法和其中的抽象方法的方法名,参数类型,参数顺序是否相同。
在jdk 1.5及以后,在override地方可以使用【@Override】放在override的方法前,这样如果没有override,编译器会有提示。如上述代码:

@Override public void itemStateChanged(ItemEvent e){
...............

}


仔细检查应该可以发现问题,那时必将会心一笑,原来如此简单,:)。

Q:jar打包后运行提示找不到主类 A: 1 清单mainfest文件中必须指定了Main-Class类,并且该类可有main方法,在未打包前可运行
2 清单文件的问题 a Main-Class后的冒号和class类名之间必须且只能有一个空格。
b 清单文件的最后必须有一个新行或回车,而不是空行,方法是在文件的末尾按一下回车。

更详细的内容请看精华中再议JAR文件

Q:运行程序提示OutOfMemoryError: Java heap space A: 1 可以看看jdk文档中该类的解释 2 java有-X选项可以用来指定虚拟机的可用内存,具体的选项可以用运行 java -X得到。其中有两个和这个有关:
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size

可以用如下方式指定使用的内存大小 java -Xmx200m 这表示允许虚拟机最大使用200m的内存

Q:运行程序提示StackOverflowError A: 1 可以看看jdk文档中该类的解释 2 调用的时候会把主叫方法压入堆栈中,这样被调用的方法返回的时候就取出主叫方法。在递归很多的程序中,比如QuickSort中,有很多次递归,堆栈大小 不够,就会出现这种错误。在运行的时候可以指定所用的堆栈大小,可以用java -X得到。有关的项如下
-Xss<size> set java thread stack size
可以用如下方式指定使用的堆栈大小 java -Xss400k

=========================================================================================

Exception in thread "main" java.lang.NoClassDefFoundError错误信息

 

1、你的文件名对吗?
JAVA要求你的文件和你的类名严格对应的。
比如 public class HelloWorld{ .....
那么文件名一定只能是HelloWorld.java,看仔细了!

2、你的程序中有main方法吗?参数什么的对吗?
main方法的声明应该是这样子的:
public static void main(String[] args)
事实上如果你用开发工具来做的话,是不会错的。如果你用UltraEdit之类的来写程序的话,就一个字不要改的照抄吧!

3、记住,javac后面跟的参数是文件名,但java 后面跟的是类名!
这是我开始学JAVA是犯的错,java HelloWorld.class,然后就报错。后来才弄明白,应该是java HelloWorld。

犯的就是这个错误,自己先是看了环境变量的配置和其他的设置都是正确,就是报这个错误,最终发现原来java 后面跟的应该是类名,而不是文件名

4、设置了classpath了吗?
不仅是在安装JDK时要设置的内容,一般来说最好还要自己设置一个目录来存放自己的类文件的。比如d:\class目录。
设置classpath=%classpath%;d:\class
那么,现在将HelloWorld.class文件COPY到d:\class目录下,再java HelloWorld应该就OK了。

5、结合第3点和第4点
如果你的类是属于某一个包的,比如这样一个类sony.test.HelloWorld,那么按照我在第4点中说的目录来说,就应该将HelloWorld.class文件存放到d:\class\sony\test\目录下。
执行的时候应该参考第3点中说的,按类名执行:java sony.test.HelloWorld。

=========================================================================================

 

不含包层次的HelloWorld.java

 

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

保存在E:\java\src下,使用javac命令编译:
E:\java\src>javac HelloWorld.java
运行:
E:\java\src>java HelloWorld
屏幕打印出:
Hello World!
 

初学者常犯的错误

 

  • 1. 运行时,带了.class后缀
    如果你试图使用如下命令:
    E:\java\src>java HelloWorld.class
    系 统会误认为你运行的是HelloWorld包下的名为class的类文件,会到系统的CLASSPATH下(一般都包括当前目录)企图寻找 HelloWorld.class.class这样的类,这样的类当然不存在了;并且也不可能存在,因为class是关键字,不能作为一个类的名字。所以 会报如下错误信息:
    Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class
  • 2. 文件名大小写错误
    对于像Windows这样的系统,编译时可以不关心大小写。比如编译HelloWorld.java时,也可以使用:
    E:\java\src>javac helloworld.java
    也可以编译通过,但产生的类文件仍然是和源文件相符的:HelloWorld.class。
    但在运行时一定要注意大小写,比如试图使用如下命令运行:
    E:\java\src>java helloworld
    将报类似于1中的错误:
    Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)

 

包含包层次的HelloWorld.java

比如上面的HelloWorld.java修改如下:

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

编译时有两种方法

  • 1. 直接编译
    E:\java\src>javac HelloWorld.java
    此时在当前目录下输出HelloWorld.class。此时,运行不能使用上面相同的方法,使用:
    E:\java\src>java HelloWorld
    运行时,出现如下错误:
    Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/javaresearch/HelloWorld)
    从 上述错误信息你也可以看到,系统可以找到HelloWorld类(因为当前路径包含在CLASSPATH中,具体为什么会提示wrong name,有兴趣的朋友参见Java语言规范),但这个类属于org.javaresearch包。所以,你要做的就是按照上述包层次,相应的创建目录层 次,把上面生成的HelloWorld.class放到E:\java\src\org\javaresearch\目录下。运行:
    E:\java\src >java org.javaresearch.HelloWorld
    系统打印出:
    Hello World!
    这儿要注意的是,不能使用java org\javaresearch\HelloWorld来运行,此时同样会出现如下错误:
    Exception in thread "main" java.lang.NoClassDefFoundError:org\javaresearch\HelloWorld (wrong name: org/javaresearch/HelloWorld)
    哈哈,是不是有点怪怪的,那没办法。以后对Java的包有更深的认识时,就会明白了。
  • 2. 使用 -d <directory>编译选项
    是不是觉得上面的编译方法有点麻烦,能不能自动在当前路径(或任意指定的路径)下生成包层次呢?有!使用-d <directory>编译选项就能做到。
    E:\java\src >javac -d . HelloWorld.java
    此时,在当前目录下就生成了一个org\javaresearch目录,并且输出的.class文件也在里面。运行:
    E:\java\src >java org.javaresearch.HelloWorld
    系统打印:Hello World!
    如果你想把生成的类文件集中存放在一个目录中,比如:E:\java\classes下,那么你首先创建这个目录,然后编译时:
    E:\java\src >javac -d E:\java\classes HelloWorld.java
    就 可以把生成的类文件放到E:\java\classes目录下,并且按照包层次相应的创建目录路径。你可以在E:\java\classes\org \javaresearch下找到HelloWorld.class文件。此时使用如下命令可以正确运行(注意如果要用到其它类,请在CLASSPATH 中设好):
    E:\java\classes >java org.javaresearch.HelloWorld

 

  • 本文链接地址:http://www.dbainfo.net/java-hello-world.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《初学Java,从HelloWorld开始》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)