当前位置:编程学习 > JAVA >>

关于没有main的Hello,World!

最近在java核心技术 基础知识 上看到一个程序说是不用main方法就可以打印出Hello,World!
public class Hello

   staitc
    {
      System.out.println("Hello,World!");
      System.exit(0);
    }

 }可是自己运行的时候硬是不出来 后来网上查了一下也说可以,说是程序运行时先执行静态块的内容,main方法不是入口么,各种凌乱。。。。。还请个位大牛解释一二,谢谢那 --------------------编程问答-------------------- 没入口是进不去的。。
还有标准的hello,world是这样的,全小写中间用逗号隔开不加感叹号 --------------------编程问答-------------------- staitc写错了。 static


static {
System.out.println("Hello,World!");
System.exit(0);
}

public static void main(String[] args) throws IOException {
}

--------------------编程问答-------------------- 写了static 还是要写main方法的 --------------------编程问答-------------------- 可以不需要main方法。

本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。

但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。

但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。


各位可以这样试试:
public class Hello{
  static {
    System.out.println("Hello,World!");
  }
}
能看到很有意思的结果。 --------------------编程问答-------------------- 静态标识符: static
拼写错误。 --------------------编程问答--------------------
引用 4 楼  的回复:
可以不需要main方法。

本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。

但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。

但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。


各位可以这样试试:
……
试了一下,可是虽然没有报错。但得不到输出啊 --------------------编程问答--------------------
引用 6 楼  的回复:
试了一下,可是虽然没有报错。但得不到输出啊



public class Hello{
  static {
    System.out.println("Hello,World!");
  }
}


C:\>java Hello
HelloWorld
Exception in thread "main" java.lang.NoSuchMethodError: main --------------------编程问答--------------------  除非你这个类被别的类调用,否则如果不写自己的main方法是不会打印的 --------------------编程问答-------------------- 1、你要确定这个类有一下几种情况才会被jvm的ClassLoader加载:
   a、new这个类的一个实例;
   b、访问类的静态变量或者静态方法
   c、反射
   d、访问该类的子类,即创建子类对象
   e、标示该类为启动类

应该有6种的 ,好像b包含了两种 ,以上就是类的主动使用,jvm会加载类,加载类才会初始化 ,才会运行static模块 --------------------编程问答-------------------- 受教了 --------------------编程问答--------------------
引用 7 楼  的回复:
引用 6 楼 的回复:
试了一下,可是虽然没有报错。但得不到输出啊



Java code

public class Hello{
  static {
    System.out.println("Hello,World!");
  }
}



C:\>java Hello
HelloWorld
Exception in thread "main" ja……
--------------------编程问答--------------------
引用 4 楼  的回复:
可以不需要main方法。

本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。

但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。

但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。


各位可以这样试试:
……


public class HelloWorld {
static {
System.out.println("Hello,World!");
}
}

可以输出:
F:\fzjwork\java>java HelloWorld
Hello,World!
Exception in thread "main" java.lang.NoSuchMethodError: main --------------------编程问答-------------------- 因为在类加载的时候会执行类中的 static 块、方法和初始化 static 的成员变量和内部类,因此 static 块中的代码会执行。但是由于缺少 main 函数,所以在执行完 static 块后会抛个异常出来。 --------------------编程问答--------------------

public class HelloWorld {
static {
System.out.println("Hello,World!");
System.exit(0);
}
}

结果:
F:\fzjwork\java>java HelloWorld
Hello,World!
学会了。。。 --------------------编程问答-------------------- System.out.println(打印方法是异步方法。也就是说执行该方法仅仅发出打印请求,但是并不是立即打印,而是由另外一个线程打印。而你后面立即执行System.exit方法在打印出来之前就退出了。打印线程非常耗费时间,所以等不了那么长时间系统就退出了 --------------------编程问答-------------------- 原来如此 --------------------编程问答-------------------- 试过 还是不行 
 根本不能java java的时候报错如下
在HelloWorld类中找不到主方法,请讲主方法定义为public static void main(String[] args)
--------------------编程问答--------------------
引用 17 楼  的回复:
试过 还是不行 
 根本不能java java的时候报错如下
在HelloWorld类中找不到主方法,请讲主方法定义为public static void main(String[] args)


你真的运行过么?
public class HelloWorld {
    static {
        System.out.println("Hello,World!");
        System.exit(0);
    }
}
--------------------编程问答--------------------
引用 15 楼  的回复:
System.out.println(打印方法是异步方法。也就是说执行该方法仅仅发出打印请求,但是并不是立即打印,而是由另外一个线程打印。而你后面立即执行System.exit方法在打印出来之前就退出了。打印线程非常耗费时间,所以等不了那么长时间系统就退出了


谁说print是异步方法的 --------------------编程问答--------------------
public class HelloWorld {
    static {
        System.out.println("Hello,World!");
        System.exit(0);
    }
}

受教了 

没有System.exit(0)的话会抛出异常 --------------------编程问答--------------------
在Eclipse下是不行滴
自己敲CMD才行
--------------------编程问答-------------------- 这个要涉及到底层的JVM的内存管理了 我也不是很懂, --------------------编程问答-------------------- 学习了,喜欢static --------------------编程问答-------------------- 完全是因为static拼写错误   虽然会报错 但是static所包含的静态代码块完全会输出 --------------------编程问答-------------------- 我也试过了,eclipse里不行,必须要自己在cmd里才可以。 --------------------编程问答-------------------- 这是静态代码块的知识,你只要记住,静态代码块用来给类进行初始化,随着类的加载执行,并且只执行一次,也优于主函数执行
class StaticCode
{
static
{
System.out.println("Hello,World");
System.exit(1);
}
}
--------------------编程问答-------------------- 我也试过了, 在cmd下编译能通过,且运行。结果显示了hello world. 在eclipse跑不起来。静态块是加载类时最先初始化的。
根据java编程思想
1. 即使没有使用static, 构造器也是静态方法,先被访问,java解释器定位class文件
2. 载入class文件,执行所有静态初始化(也就是上面的static)

--------------------编程问答-------------------- 你的代码没有问题,你可以用jdk运行,静态代码块优先于主方法执行,这是正确的。 --------------------编程问答-------------------- 好牛叉呀。。。受教了。 --------------------编程问答-------------------- 好牛叉呀。。。受教了。 --------------------编程问答-------------------- 好牛叉啊。。。学到了。。 --------------------编程问答-------------------- eclipse中没有main函数是不能运行的  你这段程序可以在命令提示符下运行  --------------------编程问答-------------------- 还真学习到了哇。。 --------------------编程问答-------------------- 我的可以编译成功,但是运行时会出现异常!
引用 14 楼  的回复:
Java code

public class HelloWorld {
    static {
        System.out.println("Hello,World!");
        System.exit(0);
    }
}


结果:
F:\fzjwork\java>java HelloWorld
Hello,World!
学会了。。。
--------------------编程问答-------------------- 我试了

public class Hello{
static {
System.out.println("123");
System.exit(0);
}
}

完全可以输出。没问题、编译和运行都不会报错。。。我不知道你怎么搞的、 --------------------编程问答-------------------- 这个真可以 --------------------编程问答--------------------
引用 4 楼  的回复:
可以不需要main方法。

本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。

但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。

但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。


各位可以这样试试:
……
是不是写main但是main函数里是空的? 为什么我不写main函数怎么都弄不出来呢  求教育啊 --------------------编程问答-------------------- --------------------编程问答-------------------- 我在cmd中运行,但是它的提示是:
错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
   public static void main(String[] args)
为什么会这样,请指点指点。
引用 4 楼  的回复:
可以不需要main方法。

本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。

但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。

但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。


各位可以这样试试:
……
--------------------编程问答-------------------- 静态代码块可以执行!!执行一次!!

下面这种没有main方法也可以执行hello world

import org.junit.Test;

public class NoMain {
   
     @Test
     public void noMain()
     {
      System.out.println("hello,world");
     }
} --------------------编程问答-------------------- --------------------编程问答-------------------- 受教了
引用 34 楼  的回复:
我的可以编译成功,但是运行时会出现异常!引用 14 楼  的回复:

Java code

public class HelloWorld {
static {
System.out.println("Hello,World!");
System.exit(0);
}
}


结果:
F:\fzjwork\java>java HelloWorld
Hello,Worl……
--------------------编程问答-------------------- 不懂Java.但凡是过程,必定有入口--当然,我这里说的不是main. --------------------编程问答-------------------- 只有这个类被主动使用了,才可以执行静态的代码块

public class HelloWorld {
static {
System.out.println("hello world");
}

public static void main(String[] args) {
new HelloWorld();
}
}

这只是其中的最简单的一种情况为类被创建了一个对象,还有反射之类的,你可以去以下的网站看看,可以做一下实验,都可以达到楼主的效果
http://gaolixu.iteye.com/blog/560436
--------------------编程问答-------------------- 严格的说main是主线程入口 而当你打开某个程度的时候最先启动的是这个进程 --------------------编程问答-------------------- staitc
  是优先于main执行的  但是你这样 执行玩包报错因为他找不到 main入口的方法 --------------------编程问答-------------------- 当你java Hello时,会先把这个类加载到内存中,因为你写了static块,所以会执行它,又因为在static块中退出了,所以程序不会抛出异常
当没有System.exit(0);这句时,JVM会找main方法,因为没写main方法,所以抛出异常 --------------------编程问答-------------------- public class Hello{
  static {
  System.out.println("Hello,World!");
  System.exit(0);
  }
}
运行之后,说在类中找不到主方法main.郁闷》》》》》》》》》》》》》》》 --------------------编程问答-------------------- 甚至不用写static段,也能打出hello world,
public class HelloWorld {
}

命令行运行:
java HelloWorld | echo Hello World --------------------编程问答--------------------
牛逼 --------------------编程问答--------------------
引用 4 楼  的回复:
可以不需要main方法。

本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。

但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。

但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。


各位可以这样试试:
……

但是JVM在完成类定义装载后,就会用反射来查找main函数
可以帮我解释解释怎么反射的吗?我在学反射...谢谢大侠。 --------------------编程问答--------------------
引用 48 楼  的回复:
public class Hello{
  static {
  System.out.println("Hello,World!");
  System.exit(0);
  }
}
运行之后,说在类中找不到主方法main.郁闷》》》》》》》》》》》》》》》

命令行运行就ok --------------------编程问答-------------------- 我擦,环境变量搞来搞去,现在eclipse也不能运行了,悲剧...

--------------------编程问答-------------------- 我的也是显示找不到主方法。。。。。肿么办啊 --------------------编程问答-------------------- --------------------编程问答-------------------- 用cmd命令行可以 --------------------编程问答--------------------
引用 47 楼  的回复:
当你java Hello时,会先把这个类加载到内存中,因为你写了static块,所以会执行它,又因为在static块中退出了,所以程序不会抛出异常
当没有System.exit(0);这句时,JVM会找main方法,因为没写main方法,所以抛出异常


正解~ --------------------编程问答--------------------
引用楼主  的回复:
最近在java核心技术 基础知识 上看到一个程序说是不用main方法就可以打印出Hello,World!
public class Hello

  staitc
  {
  System.out.println("Hello,World!");
  System.exit(0);
  }

 }可是自己运行的时候硬是不出来 后来网上查了一下也说可以,说是程序运行时先执行静态块……




D:\Temp\TSLOG>javac Hello.java

D:\Temp\TSLOG>java Hello
错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
   public static void main(String[] args)

D:\Temp\TSLOG>


测试了,不可以的 --------------------编程问答--------------------
引用 4 楼  的回复:
可以不需要main方法。

本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。

但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。

但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。


各位可以这样试试:
……



D:\Temp\TSLOG>javac Hello.java

D:\Temp\TSLOG>java Hello
错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
   public static void main(String[] args)

D:\Temp\TSLOG>


和楼主的例子一样,找不到main() --------------------编程问答--------------------
引用 18 楼  的回复:
引用 17 楼 的回复:

试过 还是不行
根本不能java java的时候报错如下
在HelloWorld类中找不到主方法,请讲主方法定义为public static void main(String[] args)


你真的运行过么?

Java code
public class HelloWorld {
    static {
        System.ou……

我也测试了,就是不行,那两种方法都不行 --------------------编程问答--------------------
E:\JavaProject\Project>javac Hello.java

E:\JavaProject\Project>java Hello
错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
   public static void main(String[] args)

E:\JavaProject\Project>
这是我的结果 为什么也不能啊 顺便求指导了 。。。。。 --------------------编程问答--------------------
引用 35 楼  的回复:
我试了
Java code

public class Hello{
    static {
        System.out.println("123");
        System.exit(0);
        }
}

完全可以输出。没问题、编译和运行都不会报错。。。我不知道你怎么搞的、

你确定可以吗 ?我写的都和你一模一样 为啥不行呢 ?? --------------------编程问答-------------------- 还是不可以啊 用不用设置什么东西啊 ??我就是自己敲的cmd啊 ....高手快指导一下吧 
--------------------编程问答-------------------- 看看Thinking in JAva

这个内容属于很基本的概念 --------------------编程问答-------------------- 我也测试了是可以的,是不是你重写了类加载器呢 --------------------编程问答-------------------- 这个静态方法的含义是,比构造方法更快被调用,我们一般不都是创建一个类的对象,会自动调用这个类里面的构造方法么?这个静态方法就是比构造方法更早被调用,但是要输出的话,必须从另一个类里面的main方法里面去NEW除这个类,不然一样是不会调用的 --------------------编程问答-------------------- 没有main方法程序找不到入口,另外static写错了。。。。 --------------------编程问答--------------------
引用 4 楼  的回复:
可以不需要main方法。

本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。

但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。

但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。


各位可以这样试试:
……


受教! --------------------编程问答-------------------- 新手来逛逛,受教了,static --------------------编程问答--------------------
引用 63 楼  的回复:
还是不可以啊 用不用设置什么东西啊 ??我就是自己敲的cmd啊 ....高手快指导一下吧

别放在eclipse的工程下试试
这个东西叫静态块 它里边的东西只在类被加载的时候执行一次 然后再也看不到了
这里例子其实程序并没有运行起来 只是在加载类的时候把静态块加进去了
拿static{}括起来是因为类里面只能有方法和成员变量 想在加载类的时候执行的东西只能靠放在静态块里实现 --------------------编程问答--------------------
引用 40 楼  的回复:
静态代码块可以执行!!执行一次!!

下面这种没有main方法也可以执行hello world

import org.junit.Test;

public class NoMain {
   
@Test
public void noMain()
{
System.out.println("hello,world");
}
}




在哪里 运行的??? --------------------编程问答--------------------
public class  Test
{
static {
System.out.println("I will not use the 'Hello World'!");
System.exit(0);
}
}

[img=http://my.csdn.net/my/album/detail/1120441][/img]
我的也不行。。。不会跟jdk有关吧。。 --------------------编程问答--------------------
public class  Test
{
    static {
        System.out.println("I will not use the 'Hello World'!");
        System.exit(0);
    }
}
--------------------编程问答-------------------- 这是静态初始化语句块,类加载是可以执行的,它是在main之前执行的 --------------------编程问答--------------------
引用 74 楼 qinhualiu 的回复:
这是静态初始化语句块,类加载是可以执行的,它是在main之前执行的


+10086 --------------------编程问答--------------------
引用 7 楼 ldh911 的回复:
引用 6 楼  的回复:
试了一下,可是虽然没有报错。但得不到输出啊



Java code
?



123456

public class Hello{   static {     System.out.println("Hello,World!");   } }

C:\>java Hello
HelloWorld
Exception in thread……


System.exit(0);这句话是强制终止找寻main方法的命令吗?应该是System类中的一个特性吧! --------------------编程问答-------------------- 还可以这样啊  受教了! --------------------编程问答--------------------
引用 7 楼 ldh911 的回复:
引用 6 楼  的回复:试了一下,可是虽然没有报错。但得不到输出啊

Java code?12345public class Hello{  static {    System.out.println("Hello,World!");  }}

C:\>java Hello
HelloWorld
Exception in thread "main" java……

试了一下,JDK1.6可以,JDK1.7就不行。 --------------------编程问答-------------------- 在Eclipse和通过CMD都可以运行。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 78 楼 duxingzhe0311 的回复:
引用 7 楼 ldh911 的回复:
引用 6 楼  的回复:试了一下,可是虽然没有报错。但得不到输出啊

Java code?12345public class Hello{  static {    System.out.println("Hello,World!");  }}

C:\>java Hello
HelloWorld
Exception in thread "mai……



顶一个
--------------------编程问答-------------------- JDK,我这1.6正常,static可以输出! --------------------编程问答--------------------
引用 73 楼 longyaxx258 的回复:
Java code?1234567public class  Test{    static {        System.out.println("I will not use the 'Hello World'!");        System.exit(0);    }}

我也试了,不行,和JDK版本有关? --------------------编程问答-------------------- 我测试过了 用的1.7不可以,但是1.6可以  

正确的理解确实是 在程序运行时 先加载static 块  --------------------编程问答-------------------- 呵呵 各种切糕!
--------------------编程问答-------------------- 虽然说类在加载时会先执行全局代码区和静态代码区,但这个类不会被JVM主动加载的。除非你在别的类中实例化这个类. --------------------编程问答-------------------- Applet是不是也可以的
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class HelloApplet extends Applet {
public void init() {
      setBackground( Color.black );
   }

   public void paint( Graphics g ) {
      g.setColor( Color.green );
      g.drawString("Hello World", 40, 80);
   }
}
--------------------编程问答-------------------- 楼主该结贴了 --------------------编程问答-------------------- 难道没用过JDBC么?JDBC的class.forname用的和这个差不多,这个是静态代码块,JDBC用的是构造代码块,反射一下就行了,还不会报错。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,