[Bluej-discuss] A weird bluej IDE. A bug?

Jason Zong zongzhaoguang at gmail.com
Sun Apr 16 16:29:18 BST 2006


Hi, Michael

Sorry for my poor english. Thanks for interest my question and reply this 
email.

> You are a bit unspecific about the error message you get -- when you
> say "the system reports", what does that mean? Does it appear in the
> BlueJ terminal? Or as an exception? In a dialogue? Or in your Windows
> system somewhere?

Sorry, I didn't specify the error message accurate. The systme reports that 
appears in a command line window. It pops up and give 2 lines messages and 
close the window quickly. It doesn't appear neither in BlueJ terminal nor 
exception.

As you know the Runtime.exec() method will create a native process and 
return a instance of subclass of Process that can be used to control the 
process and obtain information about it.  I want my program to compile the 
java files in the current working directory. So I wrote the statement 
"Process  process2= Runtime.getRuntime().exec("cmd.exe /k start javac 
*.java");" You could comment the other three process statements and compile 
the snippet , then run it under BlueJ IDE.

The snippet will create a native process which will run cmd command in the 
windows XP operating system. Then it tries to compile all the java file 
under the current working directory.  The wierd thing is that if I start run 
the main() method of the snippet from BlueJ, the native process (create a 
cmd window) will give two lines error message, and close that windows very 
quickly.I run it a few times, some times it will run well, some times it 
will show the following messages in a command line window and close that 
window very quickly. Finally I use prt sc caugh the windows. I attached it 
in the email. The messages are that first line is "_shellXX.java2: the 
package bluej.runtime doesn't exist." and second line is" public class 
_shellXX extends bluej.runtime.shell { ".  XX means a number such as 12,17. 
However if I start run the main() method of the snippet from command line, 
it will always work well.

> Also, is the message text really accurate? It looks suspicious to me.
> I clearly looks BlueJ related ("bluej.shell"), but BlueJ does not
> create any file or process with this name.
>
> When reporting error messages, please be specific and accurate, and
> tell us the complete message.
>
> So far, I can only guess. One guess is this: when you execute a
> method in BlueJ, BlueJ creates a .java file, compiles it, executes
> the class file, and after successful execution, removes it again.

I wrote a snippet, and execute the main method in BlueJ. The  BlueJ create a 
native process during running the main method. Some times there is error 
happened. I don't know the inside mechanism of the BlueJ how it works. Snice 
your email, I guess the process as following:
1. We select run the void main(String[]) method form the popup menus caused 
by right click on the class TestCmd icon in the BlueJ IDE.
2. The BlueJ create it's java file for execution, during the execution the 
cmd.exe process will be created and executed.
3. The cmd.exe scanning the current directory for *.java. As you said below, 
there is a BlueJ's generated java file, is that file a temporary file? Does 
BlueJ delete the file automatically? If yes, when would the BlueJ remove or 
delete the file generated by itself?
4. The cmd.exe passes the names to the javac process.
5. the javac process runs, receives the file names, and reports that  the 
file (the one created and removed by BlueJ) cannot be found. Hence the error 
messages are report. So do you think that caused by the java Garbage 
Collection or the side effect of BlueJ or my snippet?
If my guess correct, that could be explain why process3 works well but 
process2 doesn't.


Here another question why process4 has problem? If I comment the other three 
processes statements, compile and run the snippet in BlueJ, the BlueJ will 
report an exception as following.
java.io.IOException: CreateProcess: "cmd.exe \k start dir" "cmd.exe /k start 
javac *.java" error=2
 at java.lang.ProcessImpl.create(Native Method)
 at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
 at java.lang.ProcessImpl.start(ProcessImpl.java:30)
 at java.lang.ProcessBuilder.start(ProcessBuilder.java:451)
 at java.lang.Runtime.exec(Runtime.java:591)
 at TestCmd.main(TestCmd.java:29)
 at __SHELL31.run(__SHELL31.java:6)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at bluej.runtime.ExecServer$3.run(ExecServer.java:858)

Is that a bug or side effect? In my program I wrote the statment " String[] 
cmds={"cmd.exe /k start dir","cmd.exe /k start dir","cmd.exe /k start javac 
*.java");" why the system report "java.io.IOException: CreateProcess: 
"cmd.exe \k start dir" "cmd.exe /k start javac *.java" error=2" , I mean why 
the string /k is changed to \k in the BlueJ generated file 
__SHELL31.run(__SHELL31.java: 6).

Many Thanks. I'm very glad to you want to discuss this meanless snippet with 
me. Thank for your attention again.

King regards
Yours Jason.

Here I post the  snippet again.

import java.io.*;
import java.lang.*;

//the TestCmd.java is stored in D:\Test directory.
public class TestCmd {

    public static void main(String args[]){
        File dir=new File("C:\\Projects\\test2Code");
        String[] cmds={"cmd.exe /k start dir","cmd.exe /k start javac 
*.java"};
        for(int i=0;i<cmds.length;i++){
            System.out.println(cmds[i]);
        }
        try{
            //list the files in the current directory, where we store 
TestCmd.class D:\test, passed in both bluej and command line
            Process  process1= Runtime.getRuntime().exec("cmd.exe /k start 
dir");

            //compile all the java files under the current directory, same 
as above. sometime failed in bluej but passed in command line
            Process  process2= Runtime.getRuntime().exec("cmd.exe /k start 
javac *.java");

            //compile all the java files under the specified directory 
c:\..., passed in both bluej and command line;
            Process  process3= Runtime.getRuntime().exec("cmd.exe /k start 
javac *.java",null,dir);

            //try to executes the specified commands and arguments in a 
separate process with specified working directory. failed in both.
            /*the exception information is weird, the systme output is 
"cmd.exe /k start dir" and "cmd.exe /k start javac *.java"
            * "java.io.IOException: CreateProcess: "cmd.exe \k start dir" 
"cmd.exe /k start javac *.java" error=2 ....."
            *
            * That is so strange.
            */
            Process  process4= Runtime.getRuntime().exec(cmds,null,dir);
        }catch (IOException  e)
        {
            e.printStackTrace();
        }
    }
}







-------------- next part --------------
A non-text attachment was scrubbed...
Name: prt screen.JPG
Type: image/jpeg
Size: 104769 bytes
Desc: not available
Url : http://lists.bluej.org/pipermail/bluej-discuss/attachments/20060418/024aad79/prtscreen-0001.jpe


More information about the bluej-discuss mailing list