Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Threads


Автор: ts_ 3.11.2007, 20:10
    Всем доброго времени суток, в програме есть два потоки, один читает, с одного файла, второй записывает транслитный текс во второй,  выкидает ошибку source not found, вот исходные класы, почему она появляется? вот исходный код класов:
Главный:
Код

package mypackage;

import java.io.IOException;

public class MainClass {
    public static void main(final String...args) throws IOException {
        new CreateFiles();
        final ThreadBuffer tb = new ThreadBuffer();
        new Thread() {
            public void run() {
                if(!tb.isInterrupt()){
                    try {
                        tb.readString();
                    } catch (InterruptedException ie) {                   
                    } catch (IOException ioe) {} 
                } else {
                    this.interrupt();
                    try {
                        tb.closeFiles();
                    } catch (IOException ioe) {}
                }
            }
        }.start();
        
        new Thread() {
            public void run() {
                if(!tb.isInterrupt()){
                    try {
                        tb.putString();
                    } catch (InterruptedException ie) {
                        
                    } catch (IOException e) {
                    }
                } else { 
                    this.interrupt();
                }
            }
        }.start();
    }
}


Промежуточный клас-буфер:
Код

package mypackage;

import java.io.IOException;
import java.io.RandomAccessFile;

public class ThreadBuffer {
    private final TranslitDictionary td;
    
    private long fLength;
    private boolean interruptFlag = false;
    private boolean valueSet = false;
    private String tString = "";
    private RandomAccessFile rafToRead;
    private RandomAccessFile rafToWrite;

    ThreadBuffer() {
        this.td = new TranslitDictionary();
    }

    public boolean isInterrupt() {
        return interruptFlag;
    }

    public long getFLength() {
        return fLength;
    }

    public void setFLength() throws IOException {
        fLength = rafToRead.length();
    }

    public void setRafToRead() throws IOException {
        this.rafToRead = new RandomAccessFile("C:\\testfile.txt", "rw");
    }

    public void setRafToWrite() throws IOException {
        this.rafToWrite = new RandomAccessFile("C:\\testfile.txt", "rw");
    }

    public void closeFiles() throws IOException {
        rafToRead.close();
        rafToWrite.close();
    }

      
    synchronized public void putString() throws InterruptedException, IOException {
        while (this.valueSet) {
            try {
                wait();
            }  catch (InterruptedException ie) {}
        }
        rafToWrite.writeUTF(tString);
        this.valueSet = false;
        notify();
    }
    

    synchronized public void readString() throws InterruptedException, IOException {
        if (rafToRead.getFilePointer() <= fLength) {           
            while (!this.valueSet) {
                try {
                    wait();
                } catch (InterruptedException ie) {}
            }
            String tempCh = tString;
            System.out.println(tempCh);
            tempCh = rafToRead.readUTF();
            tempCh = tempCh.toUpperCase();
            char[] chArr = tempCh.toCharArray();
            for (int count = 0; count < chArr.length; count++) {
                if (td.isTransChar(chArr[count])) {
                    chArr[count] = td.getTransChar(chArr[count]);
                }
            }
            tempCh = "";
            for (char ch : chArr) {
                tempCh += ch;
            }
            tString = tempCh;
            System.out.println(tString);
            this.valueSet = true;
            notify();
        } 
            else {
            interruptFlag = true;
        }            
    }

}



Хеш таблица для транслита:
Код

package mypackage;
import java.util.Hashtable;

public class TranslitDictionary {
    private Hashtable<Character, Character> translitHt;
    public Character getTransChar(Character ch) {
        return translitHt.get(ch);
    }
    public boolean isTransChar(Character ch) {
        return translitHt.containsKey(ch);
    }
    public TranslitDictionary() {
        // TODO Auto-generated constructor stub
        translitHt = new Hashtable<Character, Character>();
        translitHt.put('А', 'A');
        translitHt.put('Б', 'B');
        translitHt.put('В', 'V');
        translitHt.put('Г', 'G');
        translitHt.put('Д', 'D');
        translitHt.put('Ж', 'G');
        translitHt.put('З', 'Z');
        translitHt.put('И', 'I');
        translitHt.put('Й', 'J');
        translitHt.put('К', 'K');
        translitHt.put('Л', 'L');
        translitHt.put('М', 'M');
        translitHt.put('Н', 'N');
        translitHt.put('О', 'O');
        translitHt.put('П', 'P');
        translitHt.put('Р', 'R');
        translitHt.put('С', 'S');
        translitHt.put('У', 'U');
        translitHt.put('Ф', 'F');
        translitHt.put('Х', 'H');
        translitHt.put('Ц', 'C');
        translitHt.put('Ч', '4');
        translitHt.put('Ш', '4');
        translitHt.put('Щ', '4');
        translitHt.put('Є', 'E');
        translitHt.put('Ю', 'U');
        translitHt.put('Я', 'J');
    }
}

и создание файлов:
Код

package mypackage;

import java.io.File;
import java.io.RandomAccessFile;
import java.io.IOException;

public class CreateFiles {
    CreateFiles() throws IOException {
        File f1 = new File("C:\\testfile.txt");
        if (!f1.exists()) {
            f1.createNewFile();
        } else {
            f1.delete();
            f1.createNewFile();
        }
        File fT = new File("C:\\translitedFile.txt");
        if (!fT.exists()) {
            fT.createNewFile();
        } else {
            fT.delete();
            fT.createNewFile();
        }
        RandomAccessFile raf = new RandomAccessFile(f1, "rw");
        raf.writeUTF("Здание аеропорта");
        raf.close();
    }
}

Автор: Kangaroo 3.11.2007, 20:29
Цитата

source not found

Это что за ошибка такая? У меня выдает НПЕ, потому что ты забыл вызвать методы setRafToRead и setRafToWrite, чтобы проинициализировать файлы.
Плюс, в методе setRafToWrite поменяй название файла, а то сейчас они одинаковы.

Автор: LSD 3.11.2007, 20:30
Полный стек ошибки выложи.

Автор: ts_ 3.11.2007, 20:38
 С названиями ошибся, поменял, выдает:
"
Exception in thread "Thread-0" java.lang.NullPointerException
    at mgub.softservecom.training.ThreadBuffer.readString(ThreadBuffer.java:59)
    at mgub.softservecom.training.MainClass$1.run(MainClass.java:13)
Exception in thread "Thread-1" java.lang.NullPointerException
    at mgub.softservecom.training.ThreadBuffer.putString(ThreadBuffer.java:52)
    at mgub.softservecom.training.MainClass$2.run(MainClass.java:29)
"
А если ставить брейкпоинт в дебагере, то выскакивает "Source not found"
 smile 

Автор: Kangaroo 3.11.2007, 21:08
Я же написал ошибку:
Цитата

У меня выдает НПЕ, потому что ты забыл вызвать методы setRafToRead и setRafToWrite, чтобы проинициализировать файлы.

Вот в этом месте:
Код

 if (rafToRead.getFilePointer() <= fLength) {

у тебя rafToRead == null

Напиши:
Код

ThreadBuffer() {
        this.td = new TranslitDictionary();
setRafToRead();
setRafToWrite();
    }

Автор: ts_ 3.11.2007, 21:17
    Исправил, еще я забыл setFLength(); дописать, но и с этим не ошибка

Автор: ts_ 3.11.2007, 21:42
Всем спасибо за помощь, все работает, нашел еще один баг! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)