【问题标题】:How to run a java program using apache commons-exec?如何使用 apache commons-exec 运行 java 程序?
【发布时间】:2013-03-14 17:57:50
【问题描述】:

我正在尝试在我的 java 应用程序 GUI 中动态运行 java 代码。我试过以下代码:

            Sring tempfile="java -classpath "+wrkdir+"/bin "+runfile;
            CommandLine cmdLine = CommandLine.parse(tempfile);
            DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
            ExecuteWatchdog watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT);
            DefaultExecutor executor = new DefaultExecutor();
            executor.setExitValue(1);
            executor.setWatchdog(watchdog);
            try {
                executor.execute(cmdLine, resultHandler);
            } catch (ExecuteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                resultHandler.waitFor();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

结果是,当我的输入文件(tempfile)由打印语句组成时;也就是说,

public class Sample2 {  
    public static void main(String[] args) {                               
                System.out.println("It Works..!!");  
    }  
}

它能够显示结果。但是如果输入文件是这样的,

   import java.io.DataInputStream;
   import java.io.IOException;
   import java.util.*; 
   public class Count 
   { 
     public static void main(String args[]) throws IOException 
     { 
       int n;
       System.out.println("Enter the number: ");
       DataInputStream din=new DataInputStream(System.in);
       String s=din.readLine();
       n=Integer.parseInt(s);
       System.out.println("#"+n);
     } 
  }

NumberFormatException 是结果。这是什么原因?在这种情况下如何通过键盘输入值?

【问题讨论】:

  • 包含异常的 stracktrace 是个好主意。
  • 在我的程序中何处包含此堆栈跟踪?对不起,我对java不太熟悉。所以,请帮忙。

标签: java exec apache-commons-exec


【解决方案1】:

您是否认为输入文件中的 parseInt 实际上可能引发了合法的解析异常?

尝试更改以下行

n=Integer.parseInt(s);

try {
 n=Integer.parseInt(s);
} catch(NumberFormatException e) {
  System.out.println("Unable to parse string into Integer. String: " + s);
}

【讨论】:

  • 是的,但同样的异常也会发生。
【解决方案2】:

DefaultExector() 构造函数没有附加到标准输入,所以你没有得到任何输入,也没有什么可以解析的。要附加到标准输入,请创建一个 ExecuteStreamHandler 并将其添加到您的 DefaultExecutor,如下所示:

ExecuteStreamHandler streamHandler = new PumpStreamHandler(System.out, System.err, System.in);
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler(streamHandler);

如果您想从其他地方而不是 System.in 读取输入,请将合适的 InputStream 对象传递给 PumpStreamHandler 构造函数。

【讨论】:

  • 一条错误消息是结果,“构造函数 DefaultExecutor(ExecuteStreamHandler) 未定义”。我现在该怎么办?
  • 能否请您提一下在我的代码中将此代码附加到何处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
相关资源
最近更新 更多