# Help a beginner with Java



## razaron (Jul 5, 2011)

<Original question answered>

Edit: I'll post more questions as I'm learning.


----------



## streetfighter 2 (Jul 5, 2011)

If you already have it working for classes why doesn't it work for javac?  Maybe you just need to use something like "javac .\myfile.java"?

All you should need to do is add the Java directory to the "path" system variable.


----------



## Easy Rhino (Jul 5, 2011)

set the path for it i believe.


----------



## razaron (Jul 5, 2011)

How do you set the path for it? I've been reading around and am completely confused.


----------



## razaron (Jul 5, 2011)

Another question.



Spoiler



In the following code:


> public class Addition {
> public Addition( ) {
> int x, y = 1, z = 2;
> 
> ...



is



> public Addition( ) {


the method header



> int x, y = 1, z = 2;
> 
> x = y + z;
> System.out.println("+ operator resulted in "+x);
> }


the method body and


> new Addition();


the method call?


----------



## streetfighter 2 (Jul 5, 2011)

razaron said:


> How do you set the path for it? I've been reading around and am completely confused.


Easiest way to do it is in System Properties (in Windows 7 you can use Start->Run->systempropertiesadvanced.exe).






Then select Environment Variables and you'll see this window.





Then click "Path" in the lower box and hit "Edit" and you'll get here:





Then just add a semicolon and the path to your Java directory (with javac).


razaron said:


> Another question.


I'm pretty sure that's correct, though my terminology is a bit rusty.


----------



## razaron (Jul 5, 2011)

I ignored path and thought I had to add SOURCEPATH 

Edit: I've already done that what I meant was how do I set it (cmd) to know where my .java files are, not javac.


----------



## streetfighter 2 (Jul 5, 2011)

razaron said:


> Edit: I've already done that what I meant was how do I set it (cmd) to now where my where my .java files are, not javac.


Well it doesn't really work that way as far as I know, but it does work the other way.

You have to type in the directory of your .java files at one time or another.  The idea is usually to cd into the directory with your .java files and then all you need to do is type "javac myfile.java".  You could also make a batch file which would simplify the process even further.


----------



## Easy Rhino (Jul 5, 2011)

first off, not to be a dick, but you gotta correct your grammar. i had to read your question 3 times before i figured out what you were asking. better grammar means more people willing to help.

a .java file is the source code. you run javac on the .java file to compile it into a class file which you then execute running the java <your java class file>. 

so you have to either be in the directory of your compiled java program or include the entire working directory.


----------



## razaron (Jul 5, 2011)

I just changed the default start directory for a shortcut of cmd. That solves that problem.



Easy Rhino said:


> first off, not to be a dick, but you gotta correct your grammar. i had to read your question 3 times before i figured out what you were asking. better grammar means more people willing to help.



I couldn't think of a better way to word it (otherwise I would've just googled it...)


----------



## razaron (Jul 6, 2011)

I popped my programing cherry. 


Spoiler






> import java.util.Scanner;
> 
> public class test {
> 
> ...






I'm going to practice with maths for now then do that archery thing Kreij mentioned in another thread.

PS. Is it bad to have to regularly look up syntax?


----------



## A Cheese Danish (Jul 6, 2011)

razaron said:


> PS. Is it bad to have to regularly look up syntax?



Not at all for a beginner! 
I still have to look up syntax for some things. The more you do it, the easier it will become and the less you will have to reference


----------



## Kreij (Jul 6, 2011)

No raz, with 1000s of APIs and a jillion methods that are available in some of the modern programming languages, and the fact that with language revisions they will add/obsolete calls, you will be using references constantly.


----------



## razaron (Jul 7, 2011)

I was looking for java keyword definitions and found them on Wikipedia. The definition of "void" has me confused. 
Wikipedia defines void as, "The void keyword is used to declare that a method does not return any value.", if that's true how did the code I posted earlier return a value?

EDIT: Also, can any of you folks remember how long it took you to start using correct case letters (upper/lowercase) in code? That seems to be the commonest error I make.


----------



## Disparia (Jul 7, 2011)

That's because it didn't return anything, unlike this (poor) example:


```
public int getTheNumberTen() {
	return 10;
}
```


----------



## razaron (Jul 7, 2011)

Then would I be correct in assuming returning a value means "returning a value to the code"?



Another question:
The following code makes cmd say "Your target is x" where x is a value.


> System.out.println("Your target is " +x_target)



However I want cmd to say "Your target is x meters away" where x is a value. The code I'm using to make this happen is,


> System.out.println("Your target is " +x_target " meters away")


, which doesn't work/compile. What do I have to do to make it work/compile?


----------



## Disparia (Jul 7, 2011)

Seems like you're missing a "+" after the x_target variable. You need it to concatenate " meters away" with the beginning portion.


That's one way to describe it. It's going to return the result so you may do with it as you will. 

Ex: Lets say you have a function that returns a value describing how close a user got to the the target based on the angle, meters away, and the bow pull. It's something that you want to print out, but also save in an array so that the user can see their last ten moves or something like that.


```
proximity = getProximity(angle, meters, power)
```

Now you can print out the variable proximity and store it.

Note: Much more familiar with PHP, sorry if my Java syntax is off.


----------



## razaron (Jul 7, 2011)

Is it better to have several small formulae,


> u = Math.sqrt((2 * P * t_bow) / m);
> 
> t = (u * Math.sin(Math.toRadians(theta))) / 4.9;
> 
> x = Math.round(t * u * Math.cos(Math.toRadians(theta)) * 100)/100.0d;




or one big formula,


> x = Math.round(((Math.sqrt((2 * P * t_bow) / m) * Math.sin(Math.toRadians(theta))) / 4.9) * u * Math.cos(Math.toRadians(theta)) * 100)/100.0d;


?


----------



## razaron (Jul 7, 2011)

So far I have this for the archery game,


Spoiler






> import java.util.Scanner;
> 
> public class archery{
> public static void main(String args[]){
> ...






How do I make it return to the bit just after it's worked out "x_target" if "d_target" > 1?
Other than that it works, yay.

EDIT: I can advertise this game as using real Newtonian physics, lol.


----------



## streetfighter 2 (Jul 7, 2011)

Is this what you want?


Spoiler





```
. . .

[B]double d_target=2;[/B]

 . . . 

x_target = 1 + (Math.round(100 * Math.random() * 100)/100.0d);
[B]while (d_target > 1) {[/B]
     System.out.println("Your target is " +x_target+ " meters away");
     System.out.println();

     System.out.println("How much power will you pull the bow with: ");
     P = input.nextDouble();
     System.out.println();

     System.out.println("At what angle will you shoot your arrow: ");
     theta = input.nextDouble();
     System.out.println();
     
     u = Math.sqrt((2 * P * t_bow) / m);

     t = (u * Math.sin(Math.toRadians(theta))) / 4.9;

     x = Math.round(t * u * Math.cos(Math.toRadians(theta)) * 100)/100.0d;

     s_target = x_target - x;

     if (s_target < 0){
          d_target = s_target * -1;
     }
     else{
          d_target = s_target;
     }

     if (d_target > 1){
          System.out.println("You were "+Math.round(d_target * 100) / 100.0d+" meters off");
     }
[B]}[/B]
System.out.println("Well done you hit the target");
```


----------



## razaron (Jul 7, 2011)

streetfighter 2 said:


> Is this what you want?
> 
> 
> Spoiler
> ...



Couldn't get what you wrote to work. However that helped me learn the do-while thing, so thank you.

Here's my awesome game:


Spoiler






> import java.util.Scanner;
> 
> public class archery{
> public static void main(String args[]){
> ...


----------



## razaron (Jul 7, 2011)

What would be a logical step up from the archery game? Preferably something that doesn't require much imagination (so no text adventure).


----------



## PopcornMachine (Jul 7, 2011)

My advice is to learn Perl or Python or even C.

I hate Java.  It's buggy as hell.


----------



## streetfighter 2 (Jul 7, 2011)

razaron said:


> What would be a logical step up from the archery game? Preferably something that doesn't require much imagination (so no text adventure).


Seeing as how 99% of the world does not use console applications, I'd suggest making a GUI for your archery game.  The structure of GUI code is fairly similar in most languages, meaning they're mostly event driven.  Here's the (rather poorly written IMO) official tutorial.

I'd create a simple window with a couple edit controls (text boxes) for inputting theta/P and a button to start the simulation.  Then I'd plot the arrows path and show the origin and target.

It sounds complicated but it's actually very easy.


----------



## razaron (Sep 5, 2011)

What am I doing wrong with this piece of code?


Spoiler






> import java.util.*;
> 
> public class vectortest {
> 
> ...





I'm trying to make a 25 places big vector with each place containing an integer with the same value as the place itself (hence the (i, i)). Then it should display the 5th int in the vector.
The errors:


Spoiler


----------



## streetfighter 2 (Sep 5, 2011)

That isn't how you declare a *while* loop.

That's a *for* loop declaration.

It should be:

```
[B]for[/B] (int i = 0; i < 25; i++){
```

It's a very common mistake, don't feel bad about it.


----------



## razaron (Sep 5, 2011)

I feel like crying in the corner now.

Edit: but a stupid one none the less. Seeing as I've used it correctly several times before.


----------



## caleb (Sep 5, 2011)

Maybe use FOR instead of WHILE


----------



## Kreij (Sep 5, 2011)

razaron said:


> What would be a logical step up from the archery game? Preferably something that doesn't require much imagination (so no text adventure).



Good job on the game 

The next logical step would be to make the game more complex.
For instance, instead of just having the target be X distance away, give it a left and right position so that the player has to enter the angle to turn also (Power=10, Angle=25, 30° to the left).
If the player misses, have the target advance and moves left or right toward him some random amount before the next shot. If the target reaches the player, the player "dies". 
See if the player gets the target or the target gets the player (call it a zombie instead of a "target"  )

Then ... add multiple zombies attacking.

Also, I saw your comment about methods returning void (or nothing).
This means it returns no value to whatever called it. You will also get an error if you try to get a return value from a void method.

```
void MyMethod()
{
    // Do something, but return nothing.
}

int test = MyMethod() <-- Error
```

However, if a method returns a value, you do not have to use it if you do not need what it returns.


----------



## razaron (Sep 5, 2011)

So a void method is like a bully? 
"What's yours is mine and what's mine is also mine.", said the void method to the other methods.


----------



## Kreij (Sep 5, 2011)

Another thing to keep in mind, as I stated above, is that when you look at code just because a method call does not use it's return value, does not mean it does not return anything.

For instance, the Show method of the MessageBox class in C# returns a value of type DialogResult. If you don't care what that value is, you can call the method and just let it pitch the result or use it if you need it.

```
MessageBox.Show("Text for messgae box"); // Don't need result

or

DialogResult MyResult = MessageBox.Show("Text for message box"); // Save result for later
```

A void method isn't a bully, it's just so broke it can't afford to give anything back 


Also, Java is not dead. It's used by a lot of people for it's cross-platform capabilities.
for instance, Minecraft is written in Java.


----------



## human_error (Sep 5, 2011)

Aleksander Dishnica said:


> Java is dead, start c++



That's why a large number of corporations have programs written in Java (some of these programs make billions each year in revenue)? Java is hardly dead, and it isn't going to be going away for a looong time.

As for what to develop next Kreij is right - it is much better to improve on and add to an existing program if you want to try more complex things, at least until you can't think of any more ways to add to it.


----------



## razaron (Sep 5, 2011)

Currently I'm going through the different kind of data structures (array, bitset etc.). After that I'm going to learn basic swing and remake "Fate/stay night" with place-holders for all the audio, text and images. That ought to help in getting used to the syntax.


----------



## Kreij (Sep 5, 2011)

When learning the different data structures, take the time to learn not only how they work but where they are a "best fit".

If you need a data structure to hold a bunch of strings you could use an array, but depending upon what you are doing (like maybe adding and remove them) a List of string may be more appropriate because it will execute faster and is inherently dynamic in size.



			
				Human Error said:
			
		

> As for what to develop next Kreij is right - it is much better to improve on and add to an existing program if you want to try more complex things, at least until you can't think of any more ways to add to it.



You mean after writing your first "Hello World" program you should not jump right into making a 3D shooter?


----------



## streetfighter 2 (Sep 5, 2011)

Aleksander Dishnica said:


> Java is dead, start c++


No offense good sir, but I've seen your posts: you do not know that much about programming.


razaron said:


> So a void method is like a bully?
> "What's yours is mine and what's mine is also mine.", said the void method to the other methods.


It should be noted that void methods can still modify variables, whether globals, class members or certain types of passed objects (similar to python).  This gets confusing so check this out:
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Java doesn't support void type variables (AFAIK) but other languages do.  For instance I wanted a function to retrieve private variables from a class instance in C++.  The traditional way to do this is with a template, which is a type of generic specific to C++.  (Java [J2SE 5.0+] also supports generics.)  I intend to create a generic but for now I'm prototyping the behavior using void:


Spoiler





```
//Exposes private variable values
//note: might want to change this to BOOL in case name detection fails
//warning: this is not production quality code, it's for debugging only
void ProfileControl::request(void* var, LPCTSTR name) {
	if (_tcscmp(name,_T("settings"))==0){
		unsigned char* tSettings=(unsigned char*)var;
		*tSettings=settings;
	}
	else if (_tcscmp(name,_T("profilesSaved"))==0) {
		vector<wstring>* tProfilesSaved=(vector<wstring>*)var;
		*tProfilesSaved=profilesSaved;
	}
	else if (_tcscmp(name,_T("szDir"))==0) {
		TCHAR* tszDir=(TCHAR*)var;
		_tcscpy(tszDir, szDir);
	}
	else if (_tcscmp(name,_T("find"))==0) {
		wstring* tProfile=(wstring*)var;
		wstring profile;
		if (findprofile(*tProfile, &profile)) {
			*tProfile = profile;
		} else {
			*tProfile = _T("");
		}
	}
	return;
}
```



What that function does is allow you to pass in a variable of several different types, then request a variable by name and retrieve the desired value from the object instance.  It would be invoked like this:

```
TCHAR szDir[MAX_PATH];
tProfileControl->request(szDir,_T("szDir"));
```
It also uses loads of pointers which Java doesn't support . . .

NOTE: I'm using php tags for syntax highlighting, the code is written in C++.


Kreij said:


> When learning the different data structures, take the time to learn not only how they work but where they are a "best fit".


Not only that, but if razaron learns how to build his own data structures he can fit data structures to code rather than fit code to data structures.  I'm pretty sure that sounds more confusing than I want it to be.


----------



## Kreij (Sep 5, 2011)

streetfighter 2 said:


> Not only that, but if razaron learns how to build his own data structures he can fit data structures to code rather than fit code to data structures. I'm pretty sure that sounds more confusing than I want it to be.



We may want to give raz a little time to let the basics sink in before we give him an aneurysm trying to figure out delegates, generics, llambda expressions, etc.


----------



## Kreij (Sep 5, 2011)

Keep it on topic. He asked for help with Java, not for personal opinions on the merits of any particular programming language. Posts removed.


----------



## GSquadron (Sep 5, 2011)

Ok, sorry for the other post, but anyway i don't know why none suggested any videos
http://www.youtube.com/watch?v=Hl-zzrqQoSE
Thenewboston is well known for teaching
If i was you i would learn all the videos than come here again after learning that much
@streetfighter 2
I have not seen a program like the one in my signature.... yet


----------



## razaron (Sep 25, 2011)

[figured it out]


----------



## razaron (Sep 25, 2011)

This results in a stackoverflow error. 
If I remove " && halffact1==0.75 && halffact2==0.75 && halffact3==0.75" from the "checkGrid()" method then it results in an array full of zeros.
What am I doing wrong? 


Spoiler





```
import java.util.*;

public class test{
	static Random rand = new Random();
	
	public static void main(String args[]){
		print(secondaryGrid());
	}
	
	
	//prints MD array
	public static void print(int[][] x){
		for(int j=0;j<3;j++){
			for(int i=0;i<3;i++){
				System.out.print(x[i][j]+" ");
			}
			System.out.println();
		}
	}
	
	
	//makes the permutation of numbers 1-3
	public static int[] getPerm(){
		int[] temp = {1,2,3};
		int[] perm = new int[3];
		int sum = 0;
		
		do{
			for(int i=0;i<3;i++){
				int r = rand.nextInt(3-i);
				perm[i] = temp[r];
				temp[r] = temp[2-i];
				sum += perm[i];
			}
		}while(sum != 6);
		return perm;
	}
	
	
	//sets up the rows in a primary grid with previously made permutations
	public static int[][] primaryGrid(){
		int[][] primaryGrid = new int[3][3];
		int[] row1 = getPerm();
		int[] row2 = getPerm();
		int[] row3 = getPerm();
		
		for(int i=0;i<3;i++){
			primaryGrid[i][0] = row1[i];
			primaryGrid[i][1] = row2[i];
			primaryGrid[i][2] = row3[i];
		}
		return primaryGrid;
	}
	
	
	//returns a secondary grid based of the primary grid, if checkGrid is true.
	public static int[][] secondaryGrid(){
		int[][] primaryGrid = primaryGrid();
		int[][] secondaryGrid = new int[3][3];
		
		if(checkGrid(primaryGrid)==true)
			secondaryGrid = primaryGrid;
		else
			secondaryGrid();
		
		return secondaryGrid;
	}
	
	
	//sets and returns the boolean value, checkGrid, based on the columns of a grid
	public static boolean checkGrid(int[][] x){
		int sum1 = 0;
		int sum2 = 0;
		int sum3 = 0;
		int fact1 = 1;
		int fact2 = 1;
		int fact3 = 1;
		double halffact1 = 1;
		double halffact2 = 1;
		double halffact3 = 1;
		
		boolean checkGrid = false;
		
		for(int i=0;i<3;i++){
			//sums
			sum1 += x[0][i];
			sum2 += x[1][i];
			sum3 += x[2][i];
			//factorial
			fact1 *= x[0][i];
			fact2 *= x[1][i];
			fact3 *= x[2][i];
			//halved factorials
			halffact1 *= (double)(x[0][i]/2);
			halffact2 *= (double)(x[1][i]/2);
			halffact3 *= (double)(x[2][i]/2);
		}
		
		if(sum1==6 && sum2==6 && sum3==6 && fact1==6 && fact2==6 && fact3==6 && halffact1==0.75 && halffact2==0.75 && halffact3==0.75)
			checkGrid = true;
		else
			checkGrid = false;
		
		return checkGrid;
	}
	
}
```


----------



## Kreij (Sep 25, 2011)

I'm not sure but it looks like the checkGrid method is returning itself (which would cause a stack overflow because you are not specifying that it return the local boolean variable by the same name (this.checkGrid).


----------



## razaron (Sep 25, 2011)

To call a method in Java you must have "()" at the end of the name even if there are no parameters. 
Today is not your day, lol.

EDIT: The method checkGrid() returns a boolean named checkGrid, the method primaryGrid() returns an array named primaryGrid and the method secondaryGrid() returns an array called secondaryGrid. I realize this is confusing. That's just how I like it...


----------



## Kreij (Sep 26, 2011)

You are right. Today has not been my best day. lol
Oh well, it's not the first time.

I know you need to include the parenthesis when calling a method, but I was thinking that when you return checkGrid (without the parenthesis) it may be returning a pointer to the method instead of the value of the local checkGrid variable.

I probably just need some sleep so I can once again seperate different programming language syntax in real time. 


```
private static protected const internal void **string MyMethod (string *$lolwut)
{
   10 : return ***this.MyMethod->&MyMethod (&(LPTRSTR)(@"Just kill me now"));
   goto: 10;
}
```


----------



## razaron (Sep 26, 2011)

I took the recursion out of the *secondaryGrid()* method and moved the double casts (in the *checkGrid()* method) into the brackets. It now works perfectly.


----------



## razaron (Oct 12, 2011)

I have a really weird problem.
This works,

```
long time = getTime();
double theta = (360*time)/1000;
long x = (long)(100 * Math.cos(Math.toRadians(theta)));
long y = (long)(100 * Math.sin(Math.toRadians(theta)));
```

but this doesn't,

```
long time = getTime()%1000;
double theta = 360*((time)/1000);
long x = (long)(100 * Math.cos(Math.toRadians(theta)));
long y = (long)(100 * Math.sin(Math.toRadians(theta)));
```

This code is supposed to give the x,y co-ords of a dot thus animating it. getTime() returns a long value of time in milliseconds.
The second piece of code is mathematically sound but doesn't work.


----------



## Kreij (Oct 12, 2011)

Define "doesn't work".


----------



## razaron (Oct 12, 2011)

One animates. The other just has a static image.
I fiddled a bit more and figured out something even more weird. If for the second piece of code I make theta equal *(360*time)/1000*, it animates.


----------



## Kreij (Oct 13, 2011)

The two code blocks you posted are not mathematically equivelant. 
I guess still an not sure how to respond.


----------



## razaron (Oct 13, 2011)

The cosine and sine make them mathematically equivalent. The theta values are different but the cos(theta) and sin(theta) values are the same. Check it on a calculator.
Also, 360 * (time/1000) == (360*time)/1000. Think of them as fractions.


----------



## GSquadron (Oct 13, 2011)

I think it is not a mathematical problem here.
It is java which takes the time as another thing and an int as another.
Probably you cannot divide time.
Not that i know java though.

Also, this 360 * (time/1000) == (360*time)/360 is not equal


----------



## razaron (Oct 13, 2011)

<snip>

EDIT: Doh, I meant over 1000 not 360. 'twas a typo.


----------



## Jimmy6 (Dec 11, 2013)

int total=0;
for(int i=0;i<num.length;i++)
total +=num_;
//print total_


----------

