if statt while nach export Runnable Jar File

Cangonator

Mitglied
Hello World,
ich habe folgendes Problem:

Wenn ich mein Projekt im Programm Eclipse exportiere und danach die .jar datei in den Java Decompiler öffne,
wird eine while schleife in eine if abfrage umgewandelt.
Ich habe auch versucht statt der while schleife eine for schleife zu nutzen, selbes Problem

Hier in zeile 12 ist die while schleife
[CODE lang="java" title="Code in Eclipse" highlight="12"] public static void Start(String sDateiUser, String sDateiProxies, String timetoplay, String sPlaylist) throws InterruptedException {
ArrayList<String> users = new ArrayList<>();
ArrayList<String> proxys = new ArrayList<>();
users = Datei.Lesen(sDateiUser);
if (sDateiProxies.length() != 0) {
proxys = Datei.Lesen(sDateiProxies);
}

int i = 0;
int iProxy = 0;

while(i < users.size()) {
if ((proxys.size() - 1 >= i && proxys.size() - 1 >= iProxy) || sDateiProxies.length() == 0) {
try {
String sUsername = ((String)users.get(i)).split(":")[0];
String sPasswort = ((String)users.get(i)).split(":")[1];
String ChromeDriver = Datei.Configuration("ChromeDriver");
System.setProperty("webdriver.chrome.driver", ChromeDriver);
ChromeOptions options = new ChromeOptions();
if (sDateiProxies.length() != 0) {
options.addArguments(new String[] { "--proxy-server=http://" + (String)proxys.get(iProxy) });
}
options.addArguments(new String[] { "--mute-audio" });
iProxy++;
driver.add(i, new ChromeDriver(options));
((WebDriver)driver.get(i)).manage().window().maximize();
((WebDriver)driver.get(i)).get("http://accounts.spotify.com/de/login?continue=" + sPlaylist);
while(!((WebDriver)driver.get(i)).getTitle().equals("Anmelden - Spotify")) {
Thread.sleep(5000L);
System.out.println("kk");

JavascriptExecutor js = (JavascriptExecutor)driver.get(i);
js.executeScript("window.scrollBy(0,1000)", new Object[0]);
String ElementLoginUsername = Datei.Configuration("ElementLoginUsername");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementLoginUsername)).sendKeys(new CharSequence[] { sUsername });
String ElementLoginPassword = Datei.Configuration("ElementLoginPassword");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementLoginPassword)).sendKeys(new CharSequence[] { sPasswort });
String ElementLoginButten = Datei.Configuration("ElementLoginButten");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementLoginButten)).click();
// System.out.println("hat sich angemeldet!");
// bricht nach x mal die cookiesuche ab // Nur wenn ohne Proxy dann kommt Cookieabfrage
int j = 0;
while(j < 3) {
try {
// System.out.println("Versuch ElementCookieButton...");
Thread.sleep(1000);
String ElementCookieButton = Datei.Configuration("ElementCookieButton");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementCookieButton)).click();
// System.out.println("Versuch ElementCookieButton ERFOLGREICH");
break;
}catch(Exception e) {
try {
// System.out.println("catch block - Versuch ElementCookieButton2");
Thread.sleep(1000);
String ElementCookieButton2 = Datei.Configuration("ElementCookieButton2");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementCookieButton2)).click();
// System.out.println("catch block ende - Versuch ElementCookieButton2 ERFOLGREICH");
break;
}catch(Exception e2) {
// System.out.println("ElementCookieButton2 auch Exception, beginne von vorne while");
j++;
}
}
}
String p = "";
if (sDateiProxies.length() != 0) {
p = String.valueOf(String.valueOf((sDateiProxies.length() != 0))) + ": " + (String)proxys.get(iProxy - 1);
} else {
p = String.valueOf((sDateiProxies.length() != 0));
}
JTableRow.add(String.valueOf(i), sUsername, p);
}

}catch(Exception e2) {
i--;
}
i++;
}
System.out.println("while wird jetzt gebreaked!");
break;

}[/CODE]


Hier in zeile 9 wurde einfach nach dem exportieren eine if abfrage aus der while schleife.
[CODE lang="java" title="Code aus Java Decompiler" highlight="9,"]public static void Start(String sDateiUser, String sDateiProxies, String timetoplay, String sPlaylist) throws InterruptedException {
ArrayList<String> users = new ArrayList<>();
ArrayList<String> proxys = new ArrayList<>();
users = Datei.Lesen(sDateiUser);
if (sDateiProxies.length() != 0)
proxys = Datei.Lesen(sDateiProxies);
int i = 0;
int iProxy = 0;
if (i < users.size()) {
if ((proxys.size() - 1 >= i && proxys.size() - 1 >= iProxy) || sDateiProxies.length() == 0) {
try {
String sUsername = ((String)users.get(i)).split(":")[0];
String sPasswort = ((String)users.get(i)).split(":")[1];
String ChromeDriver = Datei.Configuration("ChromeDriver");
System.setProperty("webdriver.chrome.driver", ChromeDriver);
ChromeOptions options = new ChromeOptions();
if (sDateiProxies.length() != 0)
options.addArguments(new String[] { "--proxy-server=http://" + (String)proxys.get(iProxy) });
options.addArguments(new String[] { "--mute-audio" });
iProxy++;
driver.add(i, new ChromeDriver(options));
((WebDriver)driver.get(i)).manage().window().maximize();
((WebDriver)driver.get(i)).get("http://accounts.spotify.com/de/login?continue=" + sPlaylist);
while (!((WebDriver)driver.get(i)).getTitle().equals("Anmelden - Spotify")) {
Thread.sleep(5000L);
System.out.println("kk");
JavascriptExecutor js = (JavascriptExecutor)driver.get(i);
js.executeScript("window.scrollBy(0,1000)", new Object[0]);
String ElementLoginUsername = Datei.Configuration("ElementLoginUsername");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementLoginUsername)).sendKeys(new CharSequence[] { sUsername });
String ElementLoginPassword = Datei.Configuration("ElementLoginPassword");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementLoginPassword)).sendKeys(new CharSequence[] { sPasswort });
String ElementLoginButten = Datei.Configuration("ElementLoginButten");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementLoginButten)).click();
int j = 0;
while (j < 3) {
try {
Thread.sleep(1000L);
String ElementCookieButton = Datei.Configuration("ElementCookieButton");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementCookieButton)).click();
break;
} catch (Exception e) {
try {
Thread.sleep(1000L);
String ElementCookieButton2 = Datei.Configuration("ElementCookieButton2");
((WebDriver)driver.get(i)).findElement(By.xpath(ElementCookieButton2)).click();
break;
} catch (Exception e2) {
j++;
}
}
}
String p = "";
if (sDateiProxies.length() != 0) {
p = String.valueOf(String.valueOf(String.valueOf((sDateiProxies.length() != 0)))) + ": " + (String)proxys.get(iProxy - 1);
} else {
p = String.valueOf((sDateiProxies.length() != 0));
}
JTableRow.add(String.valueOf(i), sUsername, p);
}
} catch (Exception e2) {
i--;
}
i++;
}
System.out.println("while wird jetzt gebreaked!");
}
Thread.sleep(1000L);
int x = 0;
while (x <= i - 1) {
try {
int AktuelleZeit = 0;
Thread.sleep(500L);
Play(driver.get(x));
AktuelleZeit = Integer.valueOf(getPlaytime(driver.get(x)).replace(":", "")).intValue();
x++;
break;
} catch (Exception e2) {
int AktuelleZeit = 0;
Thread.sleep(500L);
try {
Play2(driver.get(x));
AktuelleZeit = Integer.valueOf(getPlaytime(driver.get(x)).replace(":", "")).intValue();
break;
} catch (Exception exception) {}
}
}
while (true) {
x = 0;
while (x <= i - 1) {
try {
int AktuelleZeit = Integer.valueOf(getPlaytime(driver.get(x)).replace(":", "")).intValue();
if (AktuelleZeit >= Integer.valueOf(timetoplay.replace(":", "")).intValue()) {
Skip(driver.get(x));
System.out.println("song wurde geskipppt jetzt folgt getsong!");
JTableRow.plus(x, getSong(driver.get(x)));
System.out.println("vor der getplaytime while schleife");
while (Integer.valueOf(getPlaytime(driver.get(x)).replace(":", "")).intValue() > 0)
Thread.sleep(1000L);
}
x++;
} catch (Exception e) {
Thread.sleep(1000L);
}
}
}
}[/CODE]

Kann mir jemand sagen wieso er nach dem export die while schleife in eine if anweisung ändert?
Ich habe dieses Problem nirgends im Internet gefunden.
Ich hoffe jemand kann mir helfen.

Eckdaten:
Ich nutze wie gesagt Eclipse
Version: 2020-12 (4.18.0)
Build id: 20201210-1552
jdk 13.0.2
Windows 10
 
Bist Du sicher, dass Dein aktueller Code in der Jar-Datei landet, es gibt offenbar noch mehr Unterschiede?

Folge mal dem Weg der Erzeugung der Jar-Datei, lösche alle temporären Dateien.

Die andere Möglichkeit ist, dass der Decompiler den Bytecode eben anders nach Java-Quellcode zurück übersetzt als der Java-Compiler den Java-Quellcode nach Bytecode übersetzt.

Was willst Du mit dem Decompilieren erreichen?

Ich habe Decompiler nur für Bytecode verwendet, für den ich keinen Java-Quellcode hatte.
 
Was gibt denn diese Methode für einen Wert zurück?
Die Methode gibt einen ArrayList<String> zurück

[CODE lang="java" title="Methode" highlight="30,"]public class Datei
{
public static ArrayList<String> Lesen(String sDateiname) {
ArrayList<String> DateiInhalt = new ArrayList<String>();

BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(sDateiname));
} catch (FileNotFoundException e) {

e.printStackTrace();
}


String zeile = null;

try {
while ((zeile = reader.readLine()) != null)
{
DateiInhalt.add(zeile);

}

}
catch (IOException e) {

e.printStackTrace();
}

return DateiInhalt;
}[/CODE]
 
Weil die while Schleife sowieso nur eine einzige Iteration durchlaeuft. Am Ende hast du dort als letzte Anweisung ein break. Somit ist deine while Schleife effektiv dasselbe wie ein if, und es ist kein Bug im Decompiler.
du hast alles zerstört, danke dir 😀
Du hast natürlich recht, das war die Lösung!
Und selbstverständlich danke für alle anderen schnellen Antworten.
Wenn der code wieder läuft, melde ich mich nochmal
 

Zurück
Oben