The situation insists you to issue more than one command (native or external) through Java Runtime Environment via (Runtime.getRuntime().exec("Cmd")).
Ideally speaking, there has to be a way to separate/distinguish the commands from one another.
Few search results in Google suggested to use a semicolon in between the commands as 'cmd1;cmd2' in exec() method.
I tried the same way but it did NOT work out. During my trial-and-effort, the white space character did the trick :)
Runtime.getRuntime.exec("pwd date");
But it did work in Unix flavours but NOT in windows :( and i am still finding out a way to resolve.
Hope to get it resolved soon..
Cheers...
discussing some technical aspects covering tools, frameworks, technologies etc (the areas where i m involved and getting experienced) - feel free to discuss!
Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts
Friday, September 18, 2009
Thursday, November 06, 2008
java.io.UnsupportedEncodingException: Cp850
Wow.. A nice exception with which I learnt and found a new thing yesterday.
As being asked my one of my colleagues as she was facing this error soon after she launched the application in IE (the browser, Internet Explorer). It was a Struts based application and We digged around all the possibilities by looking at the flow to find out where the encoding has been specified.
I was sure that it has to deal with the encoding settings at the client side (obviously thats what the meaningful Exception says! lol..). The research continued with applicationResources.properties of struts, other application specific properties file, web.xml (to specify the encoding if any) etc., But no luck!!
The entire stack trace is below (fyi).
java.io.UnsupportedEncodingException: Cp850
sun.io.Converters.getConverterClass(Unknown Source)
sun.io.Converters.newConverter(Unknown Source)
sun.io.ByteToCharConverter.getConverter(Unknown Source)
java.lang.StringCoding.decode(Unknown Source)
java.lang.String.(Unknown Source)
java.lang.String.(Unknown Source)
...... [here the application specific code goes -- PRIVACY and CONFIDENTIALITY :)]
Well, she found out the solution with the googling that the "Issue was with the browser (IE 7) " and it was a bug in it. She got the application up and running in IE 6 :) Cool.
Thought of posting it here so that it may be useful for others whoever faces this issue :).
As being asked my one of my colleagues as she was facing this error soon after she launched the application in IE (the browser, Internet Explorer). It was a Struts based application and We digged around all the possibilities by looking at the flow to find out where the encoding has been specified.
I was sure that it has to deal with the encoding settings at the client side (obviously thats what the meaningful Exception says! lol..). The research continued with applicationResources.properties of struts, other application specific properties file, web.xml (to specify the encoding if any) etc., But no luck!!
The entire stack trace is below (fyi).
java.io.UnsupportedEncodingException: Cp850
sun.io.Converters.getConverterClass(Unknown Source)
sun.io.Converters.newConverter(Unknown Source)
sun.io.ByteToCharConverter.getConverter(Unknown Source)
java.lang.StringCoding.decode(Unknown Source)
java.lang.String.
java.lang.String.
...... [here the application specific code goes -- PRIVACY and CONFIDENTIALITY :)]
Well, she found out the solution with the googling that the "Issue was with the browser (IE 7) " and it was a bug in it. She got the application up and running in IE 6 :) Cool.
Thought of posting it here so that it may be useful for others whoever faces this issue :).
Labels:
Exceptions,
Java,
Tips
Sunday, March 09, 2008
dealing with windows services in java
&&tWell, had been thinking to get the control of windows services in a Java application so that programatically I can manage them (start/stop etc).
My main intention to start off this was basically to check the status of the service whether it is up and running. If not, start it before you accomplish the relevant task. The triggering factor was to check the 'MySQL' service as i sometimes keep certain services as of type 'Manual' instead of 'Automatic' so that these services may not take up considerable amount of time when the Windows OS gets booted up.
At times, when running a J2EE web application used to get the SQLException saying that 'could not obtain a connection', used to panic all of a sudden. Then recollecting our duty as having forgotten to start the particular service :)
As such, i am able to get the service up and bring it down through the application. Yet to get to know the status of a particular service and conditionally run the service :)
First, i remember i can get the external process running inside a Java appliation is via Runtime class (java.lang.Runtime) and its 'exec()' method which takes a String argument which says the OS process to run. A couple of years back i have invoked the IE browser via the same and recollected those stuff.
I tried executing the same as
Runtime runtime = new Runtime().exec("iexplore.exe www.javaranch.com");
The second argument is the actual argument to the application/process to be executed.
It was giving a different error saying that "java.io.IOException: CreateProcess iexplore.exe www.javaranch.com error=2". Had searched a bit in JavaDoc of the Java API in Process, Runtime classes, but really could not get anything.
Beforehand, i wanted to try with some other executables like Notepad etc., to my surprise it was working fine. for example the below command
runtime.exec("Notepad.exe C:\path.txt");
perfectly works fine and opens the path.txt inside the notepad application. Have checked the same with "Calc.exe" as well.
I have concluded to certain extent that the way we invoke this particular executable is errenous. I have tested the same by invoking the executable in the command prompt. It gave the infamous error
'iexplore.exe' is not recognized as an internal or external command,
Found out that the path was missing to this executable. That means, the location to the 'iexplore.exe' was not added into the path. Though i checked the same by adding the location to IE.exe in PATH and it worked fine, but it won't be appropriate to do so just for this testing purpose. So reverted back and tried executing the following:
runtime.exec("C:\\Program Files\\Internet Explorer\\iexplore.exe www.javaranch.com");
What a surprise? It worked fine!
Then i moved on to my required, 'services.msc' stuff in the same way. I got the same error but with different error code even when i gave it with full path :(. For the invocation of
runtime.exec("C:\\WINDOWS\\system32\\services.msc");
the error what i got was, "java.io.IOException: CreateProcess: C:\WINDOWS\system32\services.msc error=193". I am sure that the path to 'System32' was not mandatory at all. This error made me get into google and some good links helped me out in finding a way of what this error 193 means, 'this is not a valid Win32 application'. Also could get some other invocations and out of which what i tried was successful. It is below.
runtime.exec("cmd.exe /c services.msc");
Actually, you have to invoke the Command Prompt (cmd.exe) first and then pass the actual service/exectuable to be invoked as an argument to command prompt. The middle argument '/c' is for 'carrying out the command and terminates". And i thought it would work even if it is not present, but it failed :(. Need a clarification here. :). But it holds good when you type it in 'Run prompt'. The other option to verify it is '/K' which stands for 'carries out the command specified by the string but remains'.
The next question was, how to get the particular service up? I tried by passing the name of the service as an argument as follows.
runtime.exec("cmd.exe /c services.msc MySQL");
but it dint give any fruitful results :(. After a while, though why don't i directly execute the particular executable which the service is made run. Of course, the services is also a shortcut or link pointing to the executable placed elsewhere. Tried it out. it worked but with two drawbacks..
1. The java executable was getting hung. :(
2. Was not having a way to stop the executable rather than killing the process!
Finally when continued searching in google, somewhere i read about the way to start a service. That's through 'NET START '. Here is the link. Got succeeded as well :)
runtime.exec("net start MySQL");
runtime.exec("net stop MySQL");
Obviously these are invoking the MySQL Service in the services.msc only. As of now i am able enuf to do till this phase. Let me complete the rest and post it here..
Monday, January 21, 2008
Getters and Setters for better encapsulation
This is an interesting topic in the beginner's level. Well, at the end of this discussion you would have an answer for these questions.
Let's take you have a Person object and whose size object is what you are trying to access or set.
The plain version of the class would look like as follows:
The following program produces the output as:
By looking at the above code, you don't seem to get anything strange! Yes so do I :).
Let's have a different scenario on the same class.
Now did you see something strange?
If not, look at the two lines carefully.
They are perfectly valid and legal to the compiler and runtime, they are syntactically correct! But logically?
Why these occurred? Because the variables were of public during declaration.
That's why they are allowed outside and any legal value is allowed in the program without any harm.
How we go ahead in preventing this scenario?
Before the setters/getters were in picture or came into existence, the variables were declared public and given outside access without any harms.
In that case,
Just to have a better control on this value being accessed, there came a rescue in the form of Getters and Setters. As the name indicates, Getter is used to get/obtain a value and Setter is to set a value back. They are also called as Accessor and Mutators.
What if you allowed the access through a method and NOT directly?
For which you need to have two things.
Following the same, the code will initially look like
But had you been exposing your code through this way, it would be very easy in a later point when you realize that setting a negative value is a sin! you should NOT allow that, you have an easy way to get rid of it.
Just modify/update the setter method as below :
This way, you really don't break the existing code. As such the users would still continue using your setAge() method to set an age.
Here dealing with the invalid values and the condition to confirm the same may definitely based on the user and requirement. You can either set a default value or throw an exception or just let the user know about invalid value and continue the program normally.
A Quick Summary of encapsulation goes:
Encapsulation reduces coupling between classes, allowing it to make changes to classes without having to change its clients (whoever invokes the methods of this class). This makes maintenance and extension of a software system much easier and less costly.
Remember that for most systems, much more effort is put into maintenance than into initial development, so proper management of code dependencies pays manyfold.
/* 2-arg Constructor */
public Person(int age,String name)
{
this.age = age;
this.name = name;
}
/*Overridden toString() for our Person class*/
public String toString()
{
return "[Person] : age="+this.age+", name="+this.name;
}
- What are Getters and Setters?
- What way they are beneficial?
- Are they the means of achieving Encapsulation?
- Summary of this encapsulation
Let's take you have a Person object and whose size object is what you are trying to access or set.
The plain version of the class would look like as follows:
class Person
{
public int age;
public String name;
public static void main(String[] args)
{
Person obj1 = new Person();
obj1.age = 5;
obj1.name = "Raghavan";
System.out.println("obj1.age="+obj1.age);
System.out.println("obj1.name="+obj1.name);
}
}
The following program produces the output as:
obj1.age=5
obj1.name=Raghavan
By looking at the above code, you don't seem to get anything strange! Yes so do I :).
Let's have a different scenario on the same class.
class Person
{
public int age;
public String name;
public static void main(String[] args)
{
Person obj1 = new Person();
obj1.age = -5;
obj1.name = "";
System.out.println("obj1.age="+obj1.age);
System.out.println("obj1.name="+obj1.name);
}
}
Now did you see something strange?
If not, look at the two lines carefully.
obj1.age = -5;
obj1.name = "";
They are perfectly valid and legal to the compiler and runtime, they are syntactically correct! But logically?
- Can any person have a negative age?
- Can a person's name be empty?
Why these occurred? Because the variables were of public during declaration.
That's why they are allowed outside and any legal value is allowed in the program without any harm.
How we go ahead in preventing this scenario?
Before the setters/getters were in picture or came into existence, the variables were declared public and given outside access without any harms.
In that case,
class Person
{
public int age;
public static void main(String[] args)
{
Person myObj = new Person();
myObj.age = 5;
System.out.println("myObj.age : "+myObj.age);
Person myObj2 = new Person();
/* Check here! */
myObj.age = -2; //Ouch! a syntactically correct but logically incorrect value
System.out.println("myObj2.age : "+myObj2.age);
}
}
Just to have a better control on this value being accessed, there came a rescue in the form of Getters and Setters. As the name indicates, Getter is used to get/obtain a value and Setter is to set a value back. They are also called as Accessor and Mutators.
What if you allowed the access through a method and NOT directly?
For which you need to have two things.
- First "protect" your variable from outside access. Means, declare them to be of private.
- Then provide getter and setter for your private variable. As the variable is pricate, the getter and setters should be public.
Following the same, the code will initially look like
class Person
{
private int age;
/* Getter Method */
public int getAge() {
return this.age;
}
/* Setter Method */
public void setAge(int newAge) {
this.age = newAge;
}
public static void main(String[] args)
{
Person myObj = new Person();
//myObj.age = 5; // can't access directly!
myObj.setAge(5);
System.out.println("myObj.age : "+myObj.getAge());
Person myObj2 = new Person();
/* Check here! */
myObj.SetAge(-2); //Ouch! a syntactically correct but logically incorrect value
System.out.println("myObj2.age : "+myObj2.getAge());
}
}
But had you been exposing your code through this way, it would be very easy in a later point when you realize that setting a negative value is a sin! you should NOT allow that, you have an easy way to get rid of it.
Just modify/update the setter method as below :
...
public void setAge(int newAge) {
/* introducing a new check for Age */
if(newAge <=0){ /*definitely age should NOT be zero! */
System.err.println("Invalid age!");
return;
}
this.age = newAge;
}
This way, you really don't break the existing code. As such the users would still continue using your setAge() method to set an age.
Here dealing with the invalid values and the condition to confirm the same may definitely based on the user and requirement. You can either set a default value or throw an exception or just let the user know about invalid value and continue the program normally.
A Quick Summary of encapsulation goes:
Encapsulation reduces coupling between classes, allowing it to make changes to classes without having to change its clients (whoever invokes the methods of this class). This makes maintenance and extension of a software system much easier and less costly.
Remember that for most systems, much more effort is put into maintenance than into initial development, so proper management of code dependencies pays manyfold.
/* 2-arg Constructor */
public Person(int age,String name)
{
this.age = age;
this.name = name;
}
/*Overridden toString() for our Person class*/
public String toString()
{
return "[Person] : age="+this.age+", name="+this.name;
}
Thursday, September 13, 2007
Pass by Reference for object references holds good really?
Pre-requisite: Well, If you want to refreshwith the concepts of "Pass-by-value Vs Pass-by-reference", you may please refer this previous entry in this blog.
With respect to Java, it "passes everything by value". I repeat, "everything" by value only.
Generally, we may think that passing by values will hold good only for primitive types and values but not for the object references.
This everything includes even the references to objects.
Lets say, you have a method which takes an object as a parameter as follows
public void doChange(MyClass myClassObj)
{
//do something..
}
And you call that method from some other piece of code as follows
//calling method
public void method1()
{
MyClass myClassObj = new MyClass();
doChange(myClassObj);
}
The reference variable myClassObj is being assigned to an object of class MyClass in Heap. Just like primitive variables holding bit patterns to represent a value, reference variables also store the bit patterns to reach an object.
Once you call the method doChange() by passing the reference variable "myClassObj" to it, the value of the bit patterns held by "myClassObj" is being copied and passed into the called method doChange(). In the called method doChange(), the copied-and-sent bit pattern is received in the same name as that of the original reference variable "myClassObj". But the compiler treats that as a different one just like primitives.
Lets say the received reference variable as "myClassObjLocal" for easy understanding. In this stage, both the original refernece variable "myClassObj" and the received reference variable inside the doChange() method "myClassObjLocal" (to compiler) point to the same object in Heap.
Now if you change the state of the object being pointed by, it will reflect to both the reference variables because both of them point to the same object in Heap. Whereas,if you change the received reference variable "myClassObjLocal" to point to a new object (reassign a different object), it does NOT reflect back to the original object because the bit pattern to the "myClassObjLocal" alone gets changed!
If you are clear with the above paragraphs, lets go to an example to make it more clear.
Lets take a small example.
class TestObjRef
{
int intValue;
public TestObjRef()
{
intValue = 1;
}
public static void changeStateOfObject(TestObjRef obj)
{
obj.intValue = 2;
}
public static void changeReference(TestObjRef obj)
{
obj = new TestObjRef();
obj.intValue = 9;
}
public static void main(String[] args)
{
TestObjRef obj1 = new TestObjRef();
System.out.println("obj1.intValue (1) = "+obj1.intValue);
changeStateOfObject(obj1);
System.out.println("obj1.intValue (2) = "+obj1.intValue);
changeReference(obj1);
System.out.println("obj1.intValue (3) = "+obj1.intValue);
}
}
Running the above code produces the following output:
Output:
obj1.intValue (1) = 1
obj1.intValue (2) = 2
obj1.intValue (3) = 2
changeStateOfObject Method
This is because, changeStateOfObject() method just changes the value of the variable "intValue" which definitely constitutes the state of object. And as such, both the "obj1" in main() method and "obj" in changeStateOfObject() method point to the same object. Means, they both hold the same bit patterns to reach a single object of TestObjRef class in heap.
That's why the output in the second line shows the changed state of object "2" as the value of "intValue" property.
changeReference() Method
If you look at the changeReference() method, by the time of receiving the argument, both the "obj1" reference variable in main() method and received reference variable "obj" in changeReference() method both hold the same bit patterns to reach the same and single TestObjRef class in Heap.
But inside the method, the received "obj" reference variable is reassigned to a newly created object of TestObjRef class. In this case, only the bit pattern of the "obj" reference variable inside the changeReference() method is changed and the change is NOT reflected back to the originally sent reference variable "obj1".
That's why the third line in the output still shows the value of "intValue" as "2" since the changed value "9" is only reflected in the received local reference variable "obj" in changeReference() method.
Note :
The received argument (object reference variable) is treated local to the method. That means, the scope of the variable is only local to the called method just like primitives and the variable cannot be accessed outside the method.
Labels:
Java,
pass-by-reference,
Pass-by-value
Subscribe to:
Posts (Atom)
Blog Archive
Links
About Me
- Raghavan alias Saravanan M
- ஏதோ பிறந்தோம், ஏதோ வாழ்ந்தோம் என்றிருப்பதல்ல வாழ்க்கை! எப்படி வாழ்ந்தோம் என்பதும் ஒரு அங்கம். வாழக் கிடைத்த வாழ்க்கையில், ஒரு சிலருக்காவது வசந்தத்தின் முகவரியை அறிமுகம் செய்தோமேயானால் அதுவே வசீகரத்தின் வனப்பைக் கூட்டும்!