2016-03-31 15 views
0

Bir listedeki simgeleri görüntülemek için JavaFx kullanan bir program üzerinde çalışıyorum. Bir txt belgesinden belirli kimlikleri aramak için kullanılan statik bir sınıf yaptım. Aslında, statik blok her satırda tanımlanmış bir öğenin kimliğini ve adını eklerdi, ancak bu sorunlar ortaya çıktığı için, sorunun kaynağını bulmaya çalıştım.Java: Program okunurken txt dosyasının içeriğini listeleyemiyor

Bunun yerine, metin dosyasının içeriklerini statik blokta geçirdim ve konsola yazdırdım.

public class ItemIds { 
    public static int UNDEFINED_ID = -1; 
    private static HashMap<String, Integer> items; 
    static { 
     items = new HashMap<String, Integer>(); 
     System.out.println(new File("res/ids/item ids.txt").exists()); 
     try { 
      //should print out every line in the text file 
      Files.lines(Paths.get("res/ids/item ids.txt")).forEach(s -> { 
       System.out.println(s); 
      }); 
     } catch (IOException e) { 
      System.out.println("Unable to read specified file."); 
      e.printStackTrace(); 
     } 
    } 

    public static int getId(final String name) { 
     final Integer id = items.get(name); 
     return id != null ? id : UNDEFINED_ID; 
    } 
} 

Ancak, bu statik sınıf başlatıldığında olsun ve statik blok çağrılan ne oldukça tuhaf:

Başvuru için benim kodudur. Her satırın 10691 satırına ulaşana kadar hatasız olarak listelenir, burada "iş parçacığında özel durum" JavaFX Application Thread "java.lang.ExceptionInInitializerError" ifadesini atar.

Bunu özellikle garip yapan şey, daha küçük bir metin belgesine (daha az girişli) sahip olduğumda her şeyin iyi çalıştığını gösteriyor. Dosya neredeyse 14000 satırdan oluştuğundan, çalışabilmesi için ~ 4000 satırı silmem gerekiyor.

Bunu neden yaptığına dair herhangi bir fikir var mı? Herhangi bir geri bildirim takdir - teşekkürler

+1

Bütün stacktrace lütfen ... – Seelenvirtuose

+0

Model sınıfındaki bu tür bir dosya yoğun kodunu neden statik bir bloğa yerleştirdiğinizi merak ediyorum. Neden doğru şekilde başlatıldıktan sonra bu kodu UI'nizden uygun şekilde aramıyoruz? – ManoDestra

+0

@ManoDestra [bamboozling intensifies] – flakes

cevap

0

Bu hatayı yeniden oluşturamıyorum. 18K satırlı bir dosya oluşturdum ve siz programın gayet iyi çalışıyor. Bu nedenle, dosyanızı gözden geçirmeyi ve yığın izlemeyi kesinlikle düşünün.

Şimdi istisna ExceptionInInitializerError geri geliyor, ardından mümkündür: beklenmedik bir istisna statik başlatıcısı oluştu

ExceptionInInitializerError sinyaller. Statik bir başlatıcı veya bir statik değişken için başlatıcı değerlendirilirken bir özel durum oluştuğunu göstermek için bir ExceptionInInitializerError atılır.

class ItemIds 
{ 
    static 
    { 
    // if something does wrong -> ExceptionInInitializerError 
    } 
} 

Statik bloklarda statik değişkenler başlatıldığından, hataların tanıtımı için de bir potansiyel vardır. Bir örnek:

foo() o zaman bir ExceptionInInitializerError alabilirsiniz delirir Yani eğer
class ItemIds 
{ 
    static int v = D.foo(); 
} 

=>

class ItemIds 
{ 
    static int v; 

    static 
    { 
    v = D.foo(); 
    } 
} 

.

Tam kodunuzu statik blokta sundun mu?

İlgili konular