也谈在Java中调用其它的程序

原创 2002年05月08日 09:57:00
 

前一段时间看了《程序员》第3Java专家门诊中怎样调用其它的程序,我把其解答代码放到一个程序中,如下示:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

import java.lang.*;

 

public class runProg{

public static void main(String[] args){

       try{

         Runtime rt=Runtime.getRuntime();

         rt.exec("NotePad");

       }catch(Exception e){}

}

}

 

 

 

 

 

 

 

 

 

 

 

 


在命令符下编译运行,直接调用了记事本应用程序,没有任何问题。

但在图形用户的应用程序中,就不能编译,代码示例如下:

  void jButton1_actionPerformed(ActionEvent e) {

    //下是解答代码

try{

       Runtime rt=Runtime.getRuntime();

       rt.exec("NotePad");

    }catch(Exception e){

}

//上是解答代码

  }

 

 

 

 

 

 

 

 

 

 

 


就上面的代码而言,只是说明了调用其它程序的基本方法,但是这段代码根本不能被编译过去,在Jbuilder中的编译错误如下:

"Frame2.java": Error #: 469 : variable e is already defined in method jButton1_actionPerformed(java.awt.event.ActionEvent) at line 50, column 18

 

 

 

 


看到这个编译错误也许认为是按钮的事件定义错误,实际上是AWTComponent的事件是线程安全级的,不允许直接使用另外进程或线程,因Swing中的组件是从AWT中继承来的,所以也不允许直接使用。解决办法只有使用一个新线程。代码如下示:

  void jButton1_actionPerformed(ActionEvent e) {

    //must be use a new thread.

    Thread t = new Thread(new Runnable(){

    public void run(){

      try {

        Runtime rt = Runtime().getRuntime();

        rt.exec(“notepad”);

        } catch (IOException e) {

        System.err.println("IO error: " + e);

      }

    }

    });

    t.start();

 

  }

但是这段代码还是不能被编译,错误提示如下:

"Frame1.java": Error #: 300 : method Runtime() not found in anonymous class of method jButton1_actionPerformed(java.awt.event.ActionEvent) at line 74, column 22

 

 

 

 


看到这段代码,认为没有发现Runtime(),或者没有包含Runtime所在的包。但实际上是java每个Application都有一个自己的Runtime,所以不允许显式声明和使用另外一个。其实,许多文章也都是这么介绍的。在这里必须使用Process来启用另外一个进程使用Runtime。代码示例如下:

  void jButton1_actionPerformed(ActionEvent e) {

    //must be use a new thread.

    Thread t = new Thread(new Runnable(){

    public void run(){

      try {

        //String[] arrCommand = {"javaw", "-jar", "d:/Unicom/Salary/Salary.jar"};

              // Process p = Runtime.getRuntime().exec(arrCommand);

        Process p = Runtime.getRuntime().exec("notepad");

        p.waitFor();

        System.out.println("return code: " + p.exitValue());

      } catch (IOException e) {

        System.err.println("IO error: " + e);

      } catch (InterruptedException e1) {

        System.err.println("Exception: " + e1.getMessage());

      }

    }

    });

    t.start();

 

  }

运行后,点击jButton1调用了Windows中的记事本应用程序。这里,新线程使用了Runnable接口,这是一种常用的技巧。另外,还必须要捕获IOExceptionInterruptedException两个异常。对于调用带有参数的复杂程序,要使用字符串数组代替简单的字符串,我在上面的代码注释了。

Java精选笔记_面向对象(构造方法、this关键字、static关键字、内部类)

构造方法constructor构造器 构造方法的定义 [修饰符]  类名 (形式参数列表){         //语句 } 构造器用于构造该类的实例。作用:用来初始化对象!一般由系统在创建对...
  • xiaoye142034
  • xiaoye142034
  • 2017年06月28日 01:21
  • 194

Linux编程中的程序调用方法(附:自己来写个伪命令行?)

system系统调用:通过fork一个新的进程来执行参数中的命令,执行完毕返回阻塞的源程序 system("./test -a 3 -d"); execv代替调用:通过把新的程序代替源程序继续...
  • wuchunlai_2012
  • wuchunlai_2012
  • 2016年01月28日 15:38
  • 910

java 调用其它程序

假设我们已经把以下的 C 程序编绎成 adder.exe: #include int main() {     /* 简单地循环打印标准输入上的两个整数之和 */      int a...
  • xiewenbo
  • xiewenbo
  • 2013年06月05日 16:12
  • 589

也谈创新

前段时间经常听到有人提到《罗辑思维》里面的这样,那样的。于是乎我也入了“坑”, 这个“坑”还不错,就感觉罗胖看过的书真是太多了,就是传说中的博览全书啊。 其中有一期就是说“击溃牛顿的钟表匠”,这一期谈...
  • xuanwolanxue
  • xuanwolanxue
  • 2017年05月20日 12:56
  • 270

java中this语句来调用其他构造方法的规则

大家对java构造方法的理解吗?对于java构造方法一般需要满足以下几条规则: (1)方法名必须与类名保持一致。 (2)不要声明返回类型。 (3)不能被static, final, synchr...
  • rockpk008
  • rockpk008
  • 2016年06月18日 23:05
  • 1825

程序中调用另一个apk的方法

1、 一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动:  view source print? Intent intent = ne...
  • lizhenmingdirk
  • lizhenmingdirk
  • 2014年02月19日 10:05
  • 2697

java初始化构造器中调用其它方法

当继承的方法时,如果都有其本省的构造方法,那么执行顺序是: (1)在其它任何事物发生之前,将分配给对象的存储空间初始化为二进制的0 (2)从最初始的基类先去执行最初始基类的构造方法 (3)其后按声明顺...
  • uestc_lxp
  • uestc_lxp
  • 2014年10月31日 16:48
  • 788

也谈“读博士干啥”?(转)

http://juliazhou.bokee.com/1032249.html    在"吾诗已成"的博客里看到一篇"到底读博士干啥"(ZZ)的文章,觉得自己也有话要说。可能有些徘徊在读与不读之间的...
  • housheng3319
  • housheng3319
  • 2013年06月18日 11:12
  • 693

vc++ 在程序中运行另一个程序的方法

在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess()三个SDK函数: WinExec,ShellExecute ,Create...
  • msunyutao
  • msunyutao
  • 2010年08月13日 14:47
  • 6349

Intent隐式调用:启动其它应用程序

Intent的两种基本用法: 显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似; 隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也...
  • zhangping2015
  • zhangping2015
  • 2017年05月18日 23:57
  • 283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:也谈在Java中调用其它的程序
举报原因:
原因补充:

(最多只允许输入30个字)