Unkown Error Crashing a Server - Console Crashes too - java

Basically, whenever I type a certain command in a server, it loads all of this code multiple times (20+). For some reason whenever I type the command, the server freezes (including the console). If I stop the server and restart it, it says something is binded to the port the server is running on, resulting in me having to kill the server process. Is it because there are way too many calculations running at the time when I issue the command? I remember it didn't crash as much before, but after I changed how the percent bar was calculated, it crashes every time.
package com.mcvigor.utils;
import java.util.ArrayList;
import org.apache.commons.lang.WordUtils;
import org.bukkit.ChatColor;
import org.bukkit.inventory.meta.ItemMeta;
import com.mcvigor.RunePlayer;
import com.mcvigor.Skills;
public class ItemUtils {
public static ItemMeta addSkillInformation(ItemMeta i, Skills skill, RunePlayer rp) {
i.setDisplayName(ChatColor.GOLD + WordUtils.capitalize(skill.toString().toLowerCase()));
ArrayList<String> lore = new ArrayList<String>();
lore.add(ChatColor.RED + "Level " + ChatColor.YELLOW + rp.getSkillLevel(skill));
int xp = rp.getSkillXP(skill);
int neededXP = rp.getXPRequiredForLevel((rp.getSkillLevel(skill) + 1));
lore.add(ChatColor.RED + "Experience: " + ChatColor.YELLOW + xp + ChatColor.RED + " / " + ChatColor.YELLOW + neededXP);
lore.add(ChatColor.RED + "Remainder: " + ChatColor.YELLOW + (neededXP - xp));
float percent = (xp/neededXP);
int percent10 = (int) Math.floor(percent * 10);
String bar = "";
while (percent10 >= 10) {
bar += ChatColor.GREEN + "▀";
percent--;
}
while (percent10 < 10) {
bar += ChatColor.RED + "▀";
percent10--;
}
lore.add(ChatColor.RED + "Percent to next level: " + ChatColor.YELLOW + (int) percent + ChatColor.RED + "%");
lore.add(bar);
i.setLore(lore);
return i;
}
}
Edit:
Think its because of:
while (percent10 < 10) {
bar += ChatColor.RED + "▀";
percent10--;
}
percent10 will ALWAYS be less than 10 so it will keep on repeating.

You're testing a variable in a loop ending condition but that variable doesn't change in the loop :
while (percent10 >= 10) {
bar += ChatColor.GREEN + "▀";
percent--;
}
If percent10 is greater than 10 before the loop, you'll loop until there isn't enough memory to augment bar.
You probably should replace
percent--;
with
percent10--;
You have a similar problem in the loop just after :
while (percent10 < 10) {
bar += ChatColor.RED + "▀";
percent10--;
}
If percent10 is < 10, then it won't go bigger than 10 in the loop (apart in case of overflow).

Related

Euler Project - Work out the first ten digits of the sum of the following one-hundred 50-digit numbers

I know that it is a horrible question to ask at this forum since I do know the rules but at the moment I just do not know what the issue is here. So for anyone that has some spare time I would be very thankful if it could be answered. I tried to carry out the Euler Project exercise number 13: Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.
I know the logic that I have used behind it is not the best and later I managed to solve the problem using another method, but it still bothers me until today why does the following code not work:
import java.util.ArrayList;
public class LargeSum {
public static ArrayList<String> addAll(ArrayList<ArrayList<Integer>> listOfResults) {
ArrayList<String> result = new ArrayList<String>();
int singlesum = 0;
int remainder = 0;
for (int i = 49; i >= 0; i--) {
System.out.println(remainder + "to rem");
singlesum += remainder;
for (ArrayList<Integer> list : listOfResults) {
System.out.println(list.get(i));
singlesum += list.get(i);
}
String lastChar = String.valueOf(singlesum);
singlesum = 0;
result.add(String.valueOf(lastChar.charAt(lastChar.length() - 1)));
remainder = 0;
if (lastChar.length() > 1) {
remainder = Integer.parseInt(lastChar.substring(0, lastChar.length() - 1));
}
}
if (remainder > 0)
result.add(String.valueOf(remainder));
return result;
}
public static ArrayList<ArrayList<Integer>> createLists() {
ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
String c =
"37107287533902102798797998220837590246510135740250"
+ "46376937677490009712648124896970078050417018260538"
+ "74324986199524741059474233309513058123726617309629"
+ "91942213363574161572522430563301811072406154908250"
+ "23067588207539346171171980310421047513778063246676"
+ "89261670696623633820136378418383684178734361726757"
+ "28112879812849979408065481931592621691275889832738"
+ "44274228917432520321923589422876796487670272189318"
+ "47451445736001306439091167216856844588711603153276"
+ "70386486105843025439939619828917593665686757934951"
+ "62176457141856560629502157223196586755079324193331"
+ "64906352462741904929101432445813822663347944758178"
+ "92575867718337217661963751590579239728245598838407"
+ "58203565325359399008402633568948830189458628227828"
+ "80181199384826282014278194139940567587151170094390"
+ "35398664372827112653829987240784473053190104293586"
+ "86515506006295864861532075273371959191420517255829"
+ "71693888707715466499115593487603532921714970056938"
+ "54370070576826684624621495650076471787294438377604"
+ "53282654108756828443191190634694037855217779295145"
+ "36123272525000296071075082563815656710885258350721"
+ "45876576172410976447339110607218265236877223636045"
+ "17423706905851860660448207621209813287860733969412"
+ "81142660418086830619328460811191061556940512689692"
+ "51934325451728388641918047049293215058642563049483"
+ "62467221648435076201727918039944693004732956340691"
+ "15732444386908125794514089057706229429197107928209"
+ "55037687525678773091862540744969844508330393682126"
+ "18336384825330154686196124348767681297534375946515"
+ "80386287592878490201521685554828717201219257766954"
+ "78182833757993103614740356856449095527097864797581"
+ "16726320100436897842553539920931837441497806860984"
+ "48403098129077791799088218795327364475675590848030"
+ "87086987551392711854517078544161852424320693150332"
+ "59959406895756536782107074926966537676326235447210"
+ "69793950679652694742597709739166693763042633987085"
+ "41052684708299085211399427365734116182760315001271"
+ "65378607361501080857009149939512557028198746004375"
+ "35829035317434717326932123578154982629742552737307"
+ "94953759765105305946966067683156574377167401875275"
+ "88902802571733229619176668713819931811048770190271"
+ "25267680276078003013678680992525463401061632866526"
+ "36270218540497705585629946580636237993140746255962"
+ "24074486908231174977792365466257246923322810917141"
+ "91430288197103288597806669760892938638285025333403"
+ "34413065578016127815921815005561868836468420090470"
+ "23053081172816430487623791969842487255036638784583"
+ "11487696932154902810424020138335124462181441773470"
+ "63783299490636259666498587618221225225512486764533"
+ "67720186971698544312419572409913959008952310058822"
+ "95548255300263520781532296796249481641953868218774"
+ "76085327132285723110424803456124867697064507995236"
+ "37774242535411291684276865538926205024910326572967"
+ "23701913275725675285653248258265463092207058596522"
+ "29798860272258331913126375147341994889534765745501"
+ "18495701454879288984856827726077713721403798879715"
+ "38298203783031473527721580348144513491373226651381"
+ "34829543829199918180278916522431027392251122869539"
+ "40957953066405232632538044100059654939159879593635"
+ "29746152185502371307642255121183693803580388584903"
+ "41698116222072977186158236678424689157993532961922"
+ "62467957194401269043877107275048102390895523597457"
+ "23189706772547915061505504953922979530901129967519"
+ "86188088225875314529584099251203829009407770775672"
+ "11306739708304724483816533873502340845647058077308"
+ "82959174767140363198008187129011875491310547126581"
+ "97623331044818386269515456334926366572897563400500"
+ "42846280183517070527831839425882145521227251250327"
+ "55121603546981200581762165212827652751691296897789"
+ "32238195734329339946437501907836945765883352399886"
+ "75506164965184775180738168837861091527357929701337"
+ "62177842752192623401942399639168044983993173312731"
+ "32924185707147349566916674687634660915035914677504"
+ "99518671430235219628894890102423325116913619626622"
+ "73267460800591547471830798392868535206946944540724"
+ "76841822524674417161514036427982273348055556214818"
+ "97142617910342598647204516893989422179826088076852"
+ "87783646182799346313767754307809363333018982642090"
+ "10848802521674670883215120185883543223812876952786"
+ "71329612474782464538636993009049310363619763878039"
+ "62184073572399794223406235393808339651327408011116"
+ "66627891981488087797941876876144230030984490851411"
+ "60661826293682836764744779239180335110989069790714"
+ "85786944089552990653640447425576083659976645795096"
+ "66024396409905389607120198219976047599490197230297"
+ "64913982680032973156037120041377903785566085089252"
+ "16730939319872750275468906903707539413042652315011"
+ "94809377245048795150954100921645863754710598436791"
+ "78639167021187492431995700641917969777599028300699"
+ "15368713711936614952811305876380278410754449733078"
+ "40789923115535562561142322423255033685442488917353"
+ "44889911501440648020369068063960672322193204149535"
+ "41503128880339536053299340368006977710650566631954"
+ "81234880673210146739058568557934581403627822703280"
+ "82616570773948327592232845941706525094512325230608"
+ "22918802058777319719839450180888072429661980811197"
+ "77158542502016545090413245809786882778948721859617"
+ "72107838435069186155435662884062257473692284509516"
+ "20849603980134001723930671666823555245252804609722";
for (int i = 0; i < 4950; i += 50) {
ArrayList<Integer> strings = new ArrayList<Integer>();
for (int j = i; j <= i + 49; j++) {
strings.add(Integer.parseInt(String.valueOf(c.charAt(j))));
}
results.add(strings);
}
return results;
}
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> results = createLists();
System.out.println(addAll(results));
}
}
The array should give me the number from the back one by one each digit of the number yet I do not get the answer to the question. I investigated this many times for smaller numbers (where it worked) and for only two numbers (and it worked) yet I cannot get the answer to the question (I always get another number as result not the designated Result: 5537376230).
Thanks to everybody that looks at the code.
Best regards,
Rob
I believe the main source of the issue lies in the fact that you hardcoded a lot of numerical values and thus can not really verify correctness in the middle steps. Especially bad idea is using single String instead of the array of String[] for your source data.
Anyway, if you re-check the task you may find that the last numbers are:
...
72107838435069186155435662884062257473692284509516
20849603980134001723930671666823555245252804609722
53503534226472524250874054075591789781264330331690
while in your code you have:
+ "72107838435069186155435662884062257473692284509516"
+ "20849603980134001723930671666823555245252804609722";
So you just missed the last number and that spoils the result.
Sidenotes:
you don't really handle the top digits (your "top" digit is "55") properly which is a result of a lot of hardcoding but you probably already know that.
In java there is a BigInteger class that can solves this task easily. It is OK to write your own code for learning but for the real world task you should use a standard library unless you have a good reason not to use it.
In the case where you have a remainder left over, you add it to result as a string. But the digits in your results are reversed, so you also need to reverse the digits of the remainder.
It also looks like you've got an off-by-one error in the construction of your numbers. i < 4950 should be i < 5000 I think, since the 100th number starts at index 99 * 50 = 4950.

ThreadLocalRandom random integer not in range

I executed this bunch of code:
int newOrderLow = ThreadLocalRandom.current().nextInt(50, shipCapacity / 3);
int newOrderUp = ThreadLocalRandom.current().nextInt(newOrderLow, shipCapacity + 1); // not lower than lower value
int newOrderMid = ThreadLocalRandom.current().nextInt(newOrderLow, newOrderUp + 1); // in between
Log.d(TAG, "New Order: {" + newOrderLow + ", " + newOrderMid + ", " + newOrderUp + "}");
and started debugging it. For example, when I set shipCapacity as 600, I got these figures logged in my console:
New Order: {493, 772, 672}
One thing is that upper range is not within [lower value; shipCapacity + 1],
the other one is the middle value result. So what is the issue? How to generate random integers properly using ThreadLocalRandom?
You might want to consider running following test code:
#Test
public void test1() {
final int shipCapacity = 600;
for (int i = 0; i < 1000000; i++) {
int newOrderLow = ThreadLocalRandom.current().nextInt(50, shipCapacity / 3);
int newOrderUp = ThreadLocalRandom.current().nextInt(newOrderLow, shipCapacity + 1); // not lower than lower value
int newOrderMid = ThreadLocalRandom.current().nextInt(newOrderLow, newOrderUp + 1); // in between
System.out.println("numbers= " + newOrderLow + " " + newOrderUp + " " + newOrderMid);
assertThat(newOrderLow).isBetween(50, shipCapacity / 3);
assertThat(newOrderUp).isBetween(newOrderLow, shipCapacity + 1);
assertThat(newOrderMid).isBetween(newOrderLow, newOrderUp + 1);
}
I've done that and on my machine none of the rules that you mentioned seem to be violated.
In my opinion the problem is somewhere else, not in the code that you provided, but test it yourself.

Java Math.random won't refresh on while loop (of course)

So, I am trying to make a text based RPG. A good starter project, as I am new to all of this. I want to make a critical hit, and math.random seems like the best way to go. Only one problem; when it loops, it doesn't refresh the random. I can assume that that's because it calls it once, and once it's called in, that's it. That's it's value. I want to know of an alternative so it refreshes every time the while loop starts over. I know there are some other bugs in my code; but that's not what I'm focusing on right now. Here's the entire method:
public void battleStart(Enemy enemy, Player player)
{
while (enemy.health != 0)
{
String battle = null;
int criticalHt = (int) (Math.random() * 10) + 0;
boolean T = true;
while (T = true)
{
battle = Game.console.next();
enemy.attackplayer(player);
if (battle.toLowerCase().contains("skip"))
{
System.out.println(criticalHt);
if (criticalHt == 1)
{
player.hitPoints -= enemy.dmg * 2;
System.out.println(Game.toTitleCase(enemy.firstName) + " " + Game.toTitleCase(enemy.lastName) + " has used " + Game.toTitleCase(enemy.attackName) + " for a critical level of " + enemy.dmg * 2 + "!.\n Your health is now " + player.hitPoints + ".");
}
else
{
player.hitPoints -= enemy.dmg;
System.out.println(Game.toTitleCase(enemy.firstName) + " " + Game.toTitleCase(enemy.lastName) + " has used " + Game.toTitleCase(enemy.attackName) + ".\n Your health is now " + player.hitPoints + ".");
System.out.println("Your turn to attack! Use an attack, or type \"skip\" to let your enemy strike.");
};
if (battle.contains("skp"))
{
};
}
}
}
Move the code
int criticalHt = (int)(Math.random() * 10) + 0;
INSIDE the while loop
while(T = true){
int criticalHt = (int)(Math.random() * 10) + 0;
battle = Game.console.next();
...

Round Robin in Java

I am working on a round robin algorithm in Java, and I have a loop that is not working correctly. I believe it is a simple logic error that I am missing. The exec[] array holds execution times for processes in a cpu. I need the quantam to be subtracted from that time or the amount of time left if less than the quantam. Then I need it to check the next process. Each process should have one pass through until the execution time is 0. The sum makes sure that the statements keep running while there is any one process that needs to run. The sum is simply from adding all the array element times.
while (sum != 0) {
int show = i + 1;
if (exec[i] != 0 && exec[i] > quant) {
exec[i] = exec[i] - quant;
sum = sum - quant;
JOptionPane.showMessageDialog(null, "Process" + " " + show + " is at" + " " + exec[i]);
JOptionPane.showMessageDialog(null, "sum" + " " + " is " + sum);
if (i == irq - 1) {
i = 0;
} else {
i++;
}
}
if (exec[i] != 0 && exec[i] < quant) {
exec[i] = exec[i] - exec[i];
sum = sum - exec[i];
JOptionPane.showMessageDialog(null, "Process" + " " + show + " is at" + " " + exec[i]);
JOptionPane.showMessageDialog(null, "sum" + " " + " is " + sum);
if (i == irq - 1) {
i = 0;
} else {
i++;
}
}
}
Please let me know if there is a fix or if any more information is needed. Thanks!
exec[i]=exec[i]-exec[i];
sum=sum-exec[i];
Is same as
exec[i]=0;
sum=sum-0;
Also, you don't treat the case of exec[i]==quant
I am not sure, what you want to do. It sounds like "I want Multithreading to make my application faster" but within in Single-Core loop, you won't succeed.
If you want a CPU round robin, let the JVM (or the operating system) decide. Both are made for this:
Some kind of java pseudo-Code:
int threadPoolSize = Runtime.getRuntime().availableProcessors();
ExecutorService pool = Executors.newFixedThreadPool(threadPoolSize);
pool.execute(new ImplementationOfCallableOrRunnable());
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

Trying to instantiate objects within for loop and failing

Basically I am trying to create a new class as long as the continue variable equals "Y". The problem I am having is
DigitalMain.java:18: not a statement
DigitalPhoto[] class = new DigitalPhoto[9];
upon compile. I have looked at ArrayLists but I am not quite sure if they would instantiate classes the same way as what I am trying to achieve. In an ideal situation I would have objects with the name "class"+i, and different values for every object via their built in set methods.
// Import classes for class
import java.util.Arrays;
import java.util.List;
import javax.swing.*;
import java.awt.event.*;
import java.text.DecimalFormat;
public class DigitalMain
{
public static void main(String args[])
{
String cont = "Y";
String heightString,widthString,width,bitpsString;
double bitps,x,y,totesPrice,totesSize,totesSpeed;
DecimalFormat wholeDigits = new DecimalFormat("0");
DecimalFormat dec = new DecimalFormat("0.00");
DigitalPhoto[] picc = new DigitalPhoto[20];
for(int i=0; cont.equals("Y") ; i++)
{
picc[i] = new DigitalPhoto();
heightString = JOptionPane.showInputDialog("Please enter height");
picc[i].setHeight = Double.parseDouble(heightString);
heightString = JOptionPane.showInputDialog("Please enter width");
picc[i].setWidth = Double.parseDouble(widthString);
continueQuestion = JOptionPane.showInputDialog("Height: " + picc[i].getHeight + "\n Width: " + picc[i].getWidth + "\n Resolution: " + picc[i].getResolution + "\n Compression Ratio: " + picc[i].getCompression + "\n Required Storage: " + picc[i].calcStorage() + "\n Price of Scanned Photo: " + picc[i].getCost() + "Please enter 'Y' to try again or anything but 'Y' to accept values.");
};
do
{
bitpsString = JOptionPane.showInputDialog("Please enter your internet connection speed. Must be an integer between 1 and 99999999");
bitps = Double.parseDouble(bitpsString);
} while (bitps > 0 && bitps < 99999999);
picc0.setSpeed(bitps);
for(y = 0; y<picc.length; y++) {
totesPrice += picc+y.getCost();
totesSize += picc+y.calcStorage();
totesSpeed = picc0.getSpeed();
}
double seconds = transferTime(totesSize, totesSpeed);
double minutes = seconds / 60;
double realsec = seconds % 60;
JOptionPane.showMessageDialog(null, "You will be paying: " + totesPrice + "\nRequired Storage is: " + totesSize + "Required time for transfer is: " + wholeDigits.format(minutes) + " minutes, and " + wholeDigits.format(realsec) + " seconds.");
}
public static double transferTime(double totalStorage, double netSpeed) {
double bits, seconds;
bits = (totalStorage * 8);
seconds = (bits / netSpeed);
return seconds;
};
}
class is a keyword - you can't use it as a variable name.
Additionally, you have an odd construct here:
for(int i=0; cont.equals("Y") ; i++)
{
...
} while {continue.equalsIgnoreCase(Y)};
There's no such thing as a "for/while" loop - there's a normal for loop, a while loop, and a do/while loop.
So you've actually got a for loop followed by an invalid while loop here. It has no condition.
You need to work out which you want. (Possibly a for loop containing a do/while loop, although I'd extract the inner loop into a separate method. In general your code would greatly benefit from being broken out into multiple methods.
You do something similar later, although this time with do/while:
do
{
...
} while {bitps > 0 && bitps < 99999999};
The condition of a while loop goes in round brackets, not braces:
do
{
...
} while (bitps > 0 && bitps < 99999999);
Basically, you should read up on the syntax options available for loops.
The issue is most likely the name of your array. The word class is a keyword in the Java language and hence cannot be used to name variables. You can also use ArrayLists like so:
List<DigitalPhoto> photoes = new ArrayList<DigitalPhoto>();
do
{
DigitalPhoto photo = new DigitalPhoto();
heightString = JOptionPane.showInputDialog('Please enter height');
photo .setHeight = double.parseDouble(heightString);
heightString = JOptionPane.showInputDialog('Please enter width');
photo .setWidth = double.parseDouble(widthtString);
photos.add(photo)
continueQuestion = JOptionPane.showInputDialog('Height: ' + class[i].getHeight + '\n\lWidth: ' + class[i].getWidth + '\n\l Resolution: ' + class[i].getResolution + '\n\lCompression Ratio: ' + class[i].getCompression + '\n\lRequired Storage: ' + class[i].calcStorage() + '\n\lPrice of Scanned Photo: ' + class[i].getCost() + 'Please enter "Y" to try again or anything but "Y" to accept values.')
} while {cont.equals("Y")};
What kind of loop you are using.
for(...)
{
...
}while();
There is no for-while loop.
And also your for loop condition never going to become false. Set a proper condition to your for loop.
Also there is syntax error in your for-while loop. ie. last statement
continueQuestion = JOptionPane.showInputDialog('Height: ' + class[i].getHeight + '\n\lWidth: ' + class[i].getWidth + '\n\l Resolution: ' + class[i].getResolution + '\n\lCompression Ratio: ' + class[i].getCompression + '\n\lRequired Storage: ' + class[i].calcStorage() + '\n\lPrice of Scanned Photo: ' + class[i].getCost() + 'Please enter "Y" to try again or anything but "Y" to accept values.') // you miss the ;
there is some rules for naming of variables Variables
You cannot use any of the following(in list of keywords) as identifiers in your
programs.The keywords const and goto are reserved, even though they are not
currently used. true, false, and null might seem like keywords, but they
are actually literals; you cannot use them as identifiers in your programs.
List of keywords
for(int i=0; cont.equals("Y") ; i++)
{
class[i] = new DigitalPhoto();
heightString = JOptionPane.showInputDialog('Please enter height');
class[i].setHeight = double.parseDouble(heightString);
heightString = JOptionPane.showInputDialog('Please enter width');
class[i].setWidth = double.parseDouble(widthtString);
continueQuestion = JOptionPane.showInputDialog('Height: ' +
class[i].getHeight + '\n\lWidth: ' + class[i].getWidth + '\n\l Resolution: ' +
class[i].getResolution + '\n\lCompression Ratio: ' + class[i].getCompression +
'\n\lRequired Storage: ' + class[i].calcStorage() + '\n\lPrice of Scanned Photo: ' +
class[i].getCost() + 'Please enter "Y" to
try again or anything but "Y" to accept values.')
} while {continue.equalsIgnoreCase(Y)};
here i dont know any for-while loop..just check some basics..
Loops in java

Categories

Resources