Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z Javą

Ostatnio zmodyfikowano 2012-05-10 19:35
Autor Wiadomość
pawajoro
Temat założony przez niniejszego użytkownika
Problem z Javą
» 2012-05-09 21:51:02
Witam,
Mianowicie kod:

private static boolean scanCDP(DataInputStream dis, PrintStream ps,
            String sCont, String sPath) throws Exception {
        // Scan .cdp file function itself

        int iVal, iFilePtr = 0, iLength, iFileEnd, iBlockEnd, iRecEnd, iFieldEnd;
        String sVal, skuid, sField, sKind, sClass, sRegion, sUName, sType,
                sAuth, sEra, sAssFName, sName;
        byte bVal;
        byte[] baVal = new byte[256];
        boolean bAssets = false;

        iFilePtr += dis.read(baVal, 0, 4); // Read file ID
        sVal = new String(baVal, 0, 4);
        if (sVal.compareTo("ACS$") != 0) {
            // "ACS$" authenticates CDP files
            return false;
        }
        iFilePtr += dis.skipBytes(8); // These bytes are not used
        iLength = IntBitsRotation(dis.readInt()); // Read file length
        iFilePtr += 4;
        if (iLength == 0) {
            return false;
        }
        inFILES++;
        iFileEnd = iFilePtr + iLength; // EOF pointer
        while (iFilePtr < iFileEnd && !bAssets) {
            // Read simultaneous blocks
            iLength = IntBitsRotation(dis.readInt()); // Block length
            iFilePtr += 4;
            iBlockEnd = iFilePtr + iLength; // next block pointer
            bVal = dis.readByte(); // This byte is not used
            iFilePtr++;
            iVal = (int)bVal; // Block name length
            iFilePtr += dis.read(baVal, 0, iVal); // Block name
            sVal = new String(baVal, 0, iVal - 1);
            if (sVal.equalsIgnoreCase("assets")) {
                // assets block contains kuids and their description
                bAssets = true; // Only asset block is processed
                dis.readByte(); // This byte is not used
                iFilePtr++;
                while (iFilePtr < iBlockEnd) {
                    // Read kuids sections
                    iLength = IntBitsRotation(dis.readInt()); // kuid section length
                    iFilePtr += 4;
                    iRecEnd = iFilePtr + iLength; // next kuid section pointer
                    bVal = dis.readByte(); // kuid string length
                    iFilePtr++;
                    iVal = (int)bVal;
                    iFilePtr += dis.read(baVal, 0, iVal); // kuid
                    dis.readByte(); // This byte is not used
                    iFilePtr++;
                    skuid = new String(baVal, 0, iVal - 1);
                    sKind = "";
                    sType = "";
                    sClass = "";
                    sRegion = "";
                    sEra = "";
                    sAuth = "";
                    sUName = "";
                    sName = "";
                    sAssFName = "";
                    while (iFilePtr < iRecEnd) {
                        // scans asset fields
                        iLength = IntBitsRotation(dis.readInt()); // Field length
                        iFilePtr += 4;
                        iFieldEnd = iFilePtr + iLength; // next field pointer
                        bVal = dis.readByte(); // field name length
                        iFilePtr++;
                        iVal = (int)bVal;
                        iFilePtr += dis.read(baVal, 0, iVal); // field name
                        sField = new String(baVal, 0, iVal - 1);
                        bVal = dis.readByte(); // field value type
                        iFilePtr ++;
                        if (bVal == 3 && (iFieldEnd - iFilePtr) > 1
                                && (iFieldEnd - iFilePtr) < 256) {
                            // field value type is string
                            iLength = dis.read(baVal, 0, iFieldEnd - iFilePtr); // field value
                            iFilePtr += iLength;
                            sVal = new String(baVal, 0, iLength - 1);
                            sVal = ClearString(sVal); // clear bad chars
                            if (sField.equalsIgnoreCase("kind")) {
                                sKind = sVal;
                            } else if (sField.equalsIgnoreCase("type")) {
                                sType = sVal;
                            } else if (sField.equalsIgnoreCase("category-class")) {
                                sClass = sVal;
                            } else if (sField.matches("category-region-\\d+")) { //tu błąd
                                sRegion += (sRegion.isEmpty() ? "" : ",")+sVal;
                            } else if (sField.matches("category-era-\\d+")) { // tu błąd
                                sEra += (sEra.isEmpty() ? "" : ",")+sVal;
                            } else if (sField.equalsIgnoreCase("author")) {
                                sAuth = sVal;
                            } else if (sField.equalsIgnoreCase("username")) {
                                sUName = sVal;
                            } else if (sField.equalsIgnoreCase("asset-filename")) {
                                sAssFName = sVal;
                            } else if (sField.equalsIgnoreCase("name")) {
                                sName = sVal;
                            }
                        } else if (bVal == 1 && (iFieldEnd - iFilePtr) >= 4) {
                            // field value type is integer
                            iLength = IntBitsRotation(dis.readInt());
                            iFilePtr += 4;
                            if (sField.matches("category-era-\\d+")) { // tu błąd
                                sEra += (sEra.isEmpty() ? "" : ",")+iLength+"s";
                            }
                        }
                        iFilePtr += dis.skipBytes(iFieldEnd - iFilePtr); // goto next field
                    }
                    // end of kuid, print fields values
                    ps.println(skuid+"~!"+sKind+"~!"+sUName+"~!"+sRegion+"~!"+sEra+"~!"+sAuth);
                    inKUID++; // one more kuid processed
                }
            } else {
                iFilePtr += dis.skipBytes(iBlockEnd - iFilePtr); // goto next block
            }
        }
        return true;
    }
Skompilowany w http://www.onlinecompiler.net/java
powoduje błędy

Compiler Output:
4sfShx9L.java:146: illegal escape character
} else if (sField.matches("category-region-\d+")) {
^
4sfShx9L.java:148: illegal escape character
} else if (sField.matches("category-era-\d+")) {
^
4sfShx9L.java:163: illegal escape character
if (sField.matches("category-era-\d+")) {
^
3 errors
(Kod źródłowy nie jest oddany w całości więc miejsca, gdzie się one znajdują oznaczyłem komentarzem)
Nie znam Javy, a moje poprawki wynikały z domysłów, więc prosiłbym o konkretną instrukcję GDZIE, CO I JAK. Dziękuję za wyrozumiałość :-)
P-56355
DejaVu
» 2012-05-10 02:13:58
Chyba Javy nikt tu nie lubi ;p
P-56375
m4tx
» 2012-05-10 06:26:35
Chyba Javy nikt tu nie lubi ;p
Mylisz się ;p

Hm... W kodzie powyżej masz:
C/C++
} else if( sField.matches( "category-region-\\d+" ) ) { //tu błąd
sRegion +=( sRegion.isEmpty() ? ""
    : "," ) + sVal;
} else if( sField.matches( "category-era-\\d+" ) ) {

Natomiast w logu kompilatora:

Compiler Output:
4sfShx9L.java:146: illegal escape character
} else if (sField.matches("category-region-\d+")) {
^
4sfShx9L.java:148: illegal escape character
} else if (sField.matches("category-era-\d+")) {
^
4sfShx9L.java:163: illegal escape character
if (sField.matches("category-era-\d+")) {
^
3 errors

Ciekawe... :P

Nie możesz dać backslasha w kodzie po prostu. Dlaczego? Bo kompilator to rozumie tak, że masz Stringa, wykracza poza przewidziane w wytycznych pisania kodu dla Javy 80 kolumn w linii, i chcesz go rozdzielić na 2 linie. Problem w tym, że go nie rozdzielasz. Jak temu zaradzić? Trzeba dawać podwójne backslashe, wtedy kompilator "interpretuje" jako 1 backslash, a nie jako chęć rozdzielenia Stringa.
P-56376
yoogi
» 2012-05-10 07:51:37
Zapomnieliście o mnie :)
P-56378
pawajoro
Temat założony przez niniejszego użytkownika
» 2012-05-10 11:16:36
@m4tx: No są 2 backslashe. I kompilator poprawnie je rozpoznał. Moglibyście dać mi gotowca? Wolę nie ruszać tego kodu, bo Java to dla mnie czarna magia. Te poprawki co zrobiłem dotyczyły tylko zapisów do pliku, a to już obsługa skomplikowanego pliku, więc wolę tego nie ruszać jako amator ;)
P-56381
SeaMonster131
» 2012-05-10 19:34:05
Chyba Javy nikt tu nie lubi ;p
Mylisz się ;p

Dokładnie :) Tylko niektórzy jeszcze się uczą, np ja :)
P-56401
pawajoro
Temat założony przez niniejszego użytkownika
» 2012-05-10 19:35:46
Dobra, coś ten kompilator nie polubił mojego kodu, w innym poszło. Ale dzięki za pomoc :)
P-56402
« 1 »
  Strona 1 z 1