View Full Version : دلیل این خطا چیست؟
hosseini25
جمعه 15 آبان 1394, 17:48 عصر
سلام دوستان
کلاس زیر این خطا رو میده اگر کسی دلیلش میدونه لطفا راهنماییم کنه
Сlasses cannot directly extend java.lang.Enum
public final class WholesaleActionType extends Enum
{
private WholesaleActionType(String s, int i)
{
super(s, i);
}
public static WholesaleActionType[] values()
{
WholesaleActionType awholesaleactiontype[];
int i;
WholesaleActionType awholesaleactiontype1[];
System.arraycopy(awholesaleactiontype = ENUM$VALUES, 0, awholesaleactiontype1 = new WholesaleActionType[i = awholesaleactiontype.length], 0, i);
return awholesaleactiontype1;
}
public static WholesaleActionType valueOf(String s)
{
return (WholesaleActionType)Enum.valueOf(WholesaleActionT ype.class, s);
}
public static final WholesaleActionType GENEROUS;
public static final WholesaleActionType NEUTRAL;
public static final WholesaleActionType STINGY;
public static final WholesaleActionType PENNY_BLUE_CHIP;
private static final WholesaleActionType ENUM$VALUES[];
static
{
GENEROUS = new WholesaleActionType("GENEROUS", 0);
NEUTRAL = new WholesaleActionType("NEUTRAL", 1);
STINGY = new WholesaleActionType("STINGY", 2);
PENNY_BLUE_CHIP = new WholesaleActionType("PENNY_BLUE_CHIP", 3);
ENUM$VALUES = (new WholesaleActionType[] {
GENEROUS, NEUTRAL, STINGY, PENNY_BLUE_CHIP
});
}
}
-سیّد-
شنبه 16 آبان 1394, 12:56 عصر
خوب همونطور که متن خطا کاملاً گویاست، شما توی جاوا اجازه ندارید از Enum کلاسی رو extend کنید. اگه میخواین enum بسازین، باید با syntax خاص خود جاوا enum بسازید. دربارهی enum اینجا بیشتر توضیح دادم:
http://blog.yooz.ir/?q=node/27
(http://blog.yooz.ir/?q=node/27)
در ضمن لطفاً وقتی میخواین یه کد جاوا اینجا قرار بدید، اون رو توی تگ [JAVA] قرار بدید (توسط دکمهی مخصوصش که موقع نوشتن متن بالای کادر قرار داره) تا قشنگ مرتب بشه و توسط بقیه قابل خوندن باشه. الان من اصلاً نمیتونم کدتون رو نگاه کنم و بفهمم چی نوشتید! هم indentation اش کلاً به هم ریخته، هم به نظر میرسه یه بخشهاییش راست-به-چپ شده!
hosseini25
شنبه 16 آبان 1394, 14:48 عصر
مرسی از راهنماییتون من لینکی که گذاشتین رو مطالعه کردم و دلیل خطا رو متوجه شدم . من کد کلاس بالا رو به همراه کلاسی دیگر که به این کلاس مرتبط میشه رو مجددا میزارم. من این دو تا کلاس رو decompil و الان میخواستم بدونم دقیقا باید چکار انجام بدم تا خطای بالا رفع بشه؟ (چه تغییری ایجاد کنم)
package org.powertac.agent.learning.action;
public final class WholesaleActionType extends Enum
{
private WholesaleActionType(String s, int i)
{
super(s, i);
}
public static WholesaleActionType[] values()
{
WholesaleActionType awholesaleactiontype[];
int i;
WholesaleActionType awholesaleactiontype1[];
System.arraycopy(awholesaleactiontype = ENUM$VALUES, 0, awholesaleactiontype1 = new WholesaleActionType[i = awholesaleactiontype.length], 0, i);
return awholesaleactiontype1;
}
public static WholesaleActionType valueOf(String s)
{
return (WholesaleActionType)Enum.valueOf(WholesaleActionT ype.class, s);
}
public static final WholesaleActionType GENEROUS;
public static final WholesaleActionType NEUTRAL;
public static final WholesaleActionType STINGY;
public static final WholesaleActionType PENNY_BLUE_CHIP;
private static final WholesaleActionType ENUM$VALUES[];
static
{
GENEROUS = new WholesaleActionType("GENEROUS", 0);
NEUTRAL = new WholesaleActionType("NEUTRAL", 1);
STINGY = new WholesaleActionType("STINGY", 2);
PENNY_BLUE_CHIP = new WholesaleActionType("PENNY_BLUE_CHIP", 3);
ENUM$VALUES = (new WholesaleActionType[] {
GENEROUS, NEUTRAL, STINGY, PENNY_BLUE_CHIP
});
}
}
hosseini25
شنبه 16 آبان 1394, 14:53 عصر
این هم کلاس دیگری که به این کلاس مرتبط هست
package org.powertac.agent.learning.action;
import java.util.Random;
import org.apache.log4j.Logger;
import org.powertac.common.Order;
import org.powertac.agent.learning.OrderParams;
// Referenced classes of package org.powertac.crocodileagent.learning.action:
// AbstractAction, WholesaleActionIF, WholesaleActionType
public class WholesaleAction extends AbstractAction
implements WholesaleActionIF
{
public WholesaleAction(WholesaleActionType actionType, double initialPropensity)
{
super(initialPropensity);
this.actionType = actionType;
log.info((new StringBuilder("Created ")).append(toString()).toString());
}
public OrderParams performBidding(double baselinePrice, double baselineMwh, Order lastTry, int proximity)
{
boolean isBuying = baselineMwh > 0.0D;
if(isBuying)
baselinePrice = -1D * Math.abs(baselinePrice);
else
baselinePrice = Math.abs(baselinePrice);
double random = (new Random()).nextDouble();
switch($SWITCH_TABLE$org$powertac$agent$learning$a ction$WholesaleActionType()[actionType.ordinal()])
{
default:
break;
case 1: // '\001'
if(isBuying)
{
baselinePrice *= 2.2999999999999998D + 0.40000000000000002D * random;
baselineMwh *= 1.0D;
} else
{
baselinePrice *= 0.5D - 0.20000000000000001D * random;
baselineMwh *= 1.0D;
}
break;
case 2: // '\002'
if(isBuying)
{
baselinePrice *= 0.90000000000000002D + 0.20000000000000001D * random;
baselineMwh *= 1.0D;
} else
{
baselinePrice *= 0.90000000000000002D + 0.20000000000000001D * random;
baselineMwh *= 1.0D;
}
break;
case 4: // '\004'
if(isBuying)
{
baselinePrice *= 0.69999999999999996D - 0.20000000000000001D * random;
baselineMwh *= 1.5D + 0.20000000000000001D * random;
} else
{
baselinePrice *= 1.5D + 0.20000000000000001D * random;
baselineMwh *= 1.0D;
}
break;
case 3: // '\003'
if(isBuying)
{
baselinePrice *= 0.59999999999999998D - 0.20000000000000001D * random;
baselineMwh *= 1.0D + 0.20000000000000001D * random;
} else
{
baselinePrice *= 1.8D + 0.20000000000000001D * random;
baselineMwh *= 1.0D;
}
break;
}
log.debug((new StringBuilder(String.valueOf(toString()))).append("performed a bidding: baseMwh@basePrice ").append(" finalMwh@FinalPrice ").append(baselineMwh).append("@").append(baselinePrice).toString());
return new OrderParams(Double.valueOf(baselinePrice), baselineMwh);
}
public WholesaleActionType getActionType()
{
return actionType;
}
public String toString()
{
return (new StringBuilder("WholesaleAction [actionType=")).append(actionType).append(", getPropensity()=").append(getPropensity()).append(", getProbability()=").append(getProbability()).append("]").toString();
}
static int[] $SWITCH_TABLE$org$powertac$agent$learning$action$W holesaleActionType()
{
$SWITCH_TABLE$org$powertac$agent$learning$action$W holesaleActionType;
if($SWITCH_TABLE$org$powertac$agent$learning$actio n$WholesaleActionType == null) goto _L2; else goto _L1
_L1:
return;
_L2:
JVM INSTR pop ;
int ai[] = new int[WholesaleActionType.values().length];
try
{
ai[WholesaleActionType.GENEROUS.ordinal()] = 1;
}
catch(NoSuchFieldError _ex) { }
try
{
ai[WholesaleActionType.NEUTRAL.ordinal()] = 2;
}
catch(NoSuchFieldError _ex) { }
try
{
ai[WholesaleActionType.PENNY_BLUE_CHIP.ordinal()] = 4;
}
catch(NoSuchFieldError _ex) { }
try
{
ai[WholesaleActionType.STINGY.ordinal()] = 3;
}
catch(NoSuchFieldError _ex) { }
return $SWITCH_TABLE$org$powertac$agent$learning$action$W holesaleActionType = ai;
}
private static Logger log = Logger.getLogger(WholesaleAction.class);
WholesaleActionType actionType;
private static int $SWITCH_TABLE$org$powertac$agent$learning$action$W holesaleActionType[];
}
hosseini25
شنبه 16 آبان 1394, 15:01 عصر
کلاس دوم در خط 99 تا 104 خطای not a statement و خطای iilegal start of expression میده
-سیّد-
شنبه 16 آبان 1394, 17:05 عصر
آهان کلاس decompile شده هست. اینو از اول میگفتید!
به نظر میرسه این کلاسها توسط JAD برگردونده شدن. معمولاً decompile ها از این خطاها دارن. مثلاً همونطور که میبینید، enum رو نتونسته درست تشخیص بده و به جاش یه کلاس ساخته که Enum رو extend میکنه. خوب شما باید دستی درستش کنید (یا اگه خیلی حال دارید، برید سراغ کد JAD و این بخشش که enum رو نمیفهمه درست کنید!). اونطور که از کد decompile شده پیداس، یه enum ساده هست با چهار تا مقدار:
GENEROUS
NEUTRAL
STINGY
PENNY_BLUE_CHIP
کلاس دوم هم توی خط ۹۹ قرار بوده یه switch-case روی مقادیر اون enum داشته باشه. اون رو هم باید دستی درستش کنید.
hosseini25
شنبه 16 آبان 1394, 17:22 عصر
باز هم مرسی. من این کلاسها رو با DJ java decompiler برگردوندم . راستش من برنامه نویسیم زیاد خوب نیست . میشه بگید دستی دقیقا باید چه تغییراتی بدم ؟ یا منظورتون سراغ کدوم کد jad برم؟
-سیّد-
شنبه 16 آبان 1394, 17:54 عصر
اون بخش اول که گفتم یه enum هست با ۴ تا مقدار، اینطوری میشه:
public enum WholesaleActionType {
GENEROUS,
NEUTRAL,
STINGY,
PENNY_BLUE_CHIP;
}
برای دومی هم من یه مقدار دقیقتر به کد decompile شده نگاه کردم، اون بخش پایین switch table مربوط به switch-case خط ۳۰ هست. اون switch-case خط ۳۰ به این تبدیل میشه:
switch(actionType)
{
default:
break;
case GENEROUS:
if(isBuying)
{
baselinePrice *= 2.2999999999999998D + 0.40000000000000002D * random;
baselineMwh *= 1.0D;
} else
{
baselinePrice *= 0.5D - 0.20000000000000001D * random;
baselineMwh *= 1.0D;
}
break;
case NEUTRAL:
if(isBuying)
{
baselinePrice *= 0.90000000000000002D + 0.20000000000000001D * random;
baselineMwh *= 1.0D;
} else
{
baselinePrice *= 0.90000000000000002D + 0.20000000000000001D * random;
baselineMwh *= 1.0D;
}
break;
case PENNY_BLUE_CHIP:
if(isBuying)
{
baselinePrice *= 0.69999999999999996D - 0.20000000000000001D * random;
baselineMwh *= 1.5D + 0.20000000000000001D * random;
} else
{
baselinePrice *= 1.5D + 0.20000000000000001D * random;
baselineMwh *= 1.0D;
}
break;
case STINGY:
if(isBuying)
{
baselinePrice *= 0.59999999999999998D - 0.20000000000000001D * random;
baselineMwh *= 1.0D + 0.20000000000000001D * random;
} else
{
baselinePrice *= 1.8D + 0.20000000000000001D * random;
baselineMwh *= 1.0D;
}
break;
}
در نهایت هم یک نکتهی مهم بگم. decompile کردن bytecode جاوا کار معمولیای نیست. معمولاً کسانی میرن سراغ decompile که کاربرد خاص دارن (مثلاً برای crack کردن یه نرمافزار که به زبان جاوا یا اندروید نوشته شده)، و در نتیجه معمولاً یه مقدار توی برنامهنویسی این زبونها تبحر دارن. میتونم بپرسم کاربرد شما چی بوده که سراغ decompile کردن رفتید؟ ممکنه بتونید کارتون رو خیلی سادهتر و بدون نیاز به decompile کردن جلو ببرید.
hosseini25
شنبه 16 آبان 1394, 18:57 عصر
برای بخش اول enum که شما تعریف کردین جایگزین کدوم قسمتش کنم و یا به کدوم قسمت اضافه کنم؟ واسه بخش دوم هم باید علاوه بر switch-case تغییر دیگه ای بدم؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.