2011-11-07 24 views
7

Vì vậy, đây là mã của tôi:Không có yếu tố ngoại lệ như vậy?

public static void getArmor(String treasure) 
    throws FileNotFoundException{ 
    Random rand=new Random(); 
    Scanner file=new Scanner(new File ("armor.txt")); 
    while(!file.next().equals(treasure)){ 
     file.next(); //stack trace error here 
     } 
    int min=file.nextInt(); 
    int max=file.nextInt(); 
    int defense=min + (int)(Math.random() * ((max - min) + 1)); 
    treasure=treasure.replace("_", " "); 
    System.out.println(treasure); 
    System.out.println("Defense: "+defense); 
    System.out.println("====="); 
    System.out.println(); 
    } 

public static void getTreasureClass(Monster monGet) 
throws FileNotFoundException{ 
    Random rand = new Random(); 
    String tc=monGet.getTreasureClass(); 
    while (tc.startsWith("tc:")){ 
     Scanner scan=new Scanner(new File ("TreasureClassEx.txt")); 
     String eachLine=scan.nextLine(); 
     while(!tc.equals(scan.next())){ 
     eachLine=scan.nextLine(); 
     } 
     for (int i=0;i<=rand.nextInt(3);i++){ 
      tc=scan.next(); 
     } 
    getArmor(tc); //stack trace error here 
    } 
} 

Đối với một số lý do tôi nhận được một số phần tử ngoại lệ như vậy

at java.util.Scanner.throwFor(Scanner.java:907) 
at java.util.Scanner.next(Scanner.java:1416) 
at LootGenerator.getArmor(LootGenerator.java:43) 
at LootGenerator.getTreasureClass(LootGenerator.java:68) 
at LootGenerator.getMonster(LootGenerator.java:127) 
at LootGenerator.theGame(LootGenerator.java:19) 
at LootGenerator.main(LootGenerator.java:11) 

Tôi không chắc chắn lý do tại sao mặc dù. Về cơ bản chương trình của tôi là tìm kiếm thông qua hai tập tin văn bản - armor.txt và TreasureClassEx.txt. getTreasureClass nhận một lớp kho báu từ một con quái vật và tìm kiếm thông qua txt cho đến khi nó đạt đến một mục giáp cơ bản (một chuỗi không bắt đầu bằng tc :.) Sau đó tìm kiếm getArmor cho một bộ giáp phù hợp với tên của bộ giáp cơ bản mà nó có được lớp kho báu. Lời khuyên nào sẽ được đánh giá cao! Cảm ơn!

Các liên kết đến các file txt là ở đây: http://www.cis.upenn.edu/~cis110/hw/hw06/large_data.zip

+0

Thật tuyệt nếu bạn có thể gắn cờ các dòng mã được đề cập trong theo dõi ngăn xếp bằng cách sử dụng các nhận xét để chúng tôi có thể nhận được một điểm tham chiếu. –

+0

Bạn có thể đăng nội dung tập tin không? – Tom

Trả lời

12

Dường như bạn đang gọi tiếp theo ngay cả khi máy quét không còn có một yếu tố tiếp theo để cung cấp ... ném ngoại lệ.

while(!file.next().equals(treasure)){ 
     file.next(); 
     } 

nên được một cái gì đó giống như

boolean foundTreasure = false; 

while(file.hasNext()){ 
    if(file.next().equals(treasure)){ 
      foundTreasure = true; 
      break; // found treasure, if you need to use it, assign to variable beforehand 
    } 
} 
    // out here, either we never found treasure at all, or the last element we looked as was treasure... act accordingly 
+0

Tôi đã thử mã của bạn cho điều đó nhưng sau đó tôi nhận được không có ngoại lệ yếu tố như vậy cho min/max nextInt của tôi(), đó là lạ vì không phá vỡ vòng lặp khi nó bằng kho báu?Không nên có một int tiếp theo sau đó? Tôi liên kết các tập tin txt trong bài viết chính của tôi bằng cách này, một trong những có liên quan là armor.txt và TreasureClassEx.txt. Cảm ơn! – Akaraka

+0

Tôi đã chỉnh sửa phản hồi của mình rõ ràng hơn một chút. Có thể là bạn không tìm thấy kho báu chút nào ... vì vậy các cuộc gọi của bạn tới nextInt sẽ thất bại ở đây vì không có thêm thẻ để đọc. Tôi sẽ thử nghiệm với một cái gì đó giống như mã trên, và thêm một gỡ lỗi để xem nếu file.next(). Bằng (kho báu) là bao giờ đánh giá là đúng sự thật. – Bryan

0

Hình như file.next của bạn() dòng trong vòng lặp while là ném NoSuchElementException kể từ khi máy quét đạt đến cuối tập tin. Đọc() java API here

Ngoài ra, bạn không nên gọi tiếp theo() trong vòng lặp và cũng trong điều kiện thời gian. Trong điều kiện trong khi bạn nên kiểm tra xem mã thông báo tiếp theo có sẵn và bên trong vòng lặp while kiểm tra xem nó có bằng kho báu không.

0

Tôi biết câu hỏi này đã được aked 3 năm trước đây, nhưng tôi chỉ có cùng một vấn đề, và những gì giải quyết đó là thay vì đặt:

while (i.hasNext()) { 
    // code goes here 
} 

tôi đã làm một lần lặp lúc bắt đầu, và sau đó kiểm tra điều kiện sử dụng:

do { 
    // code goes here 
} while (i.hasNext()); 

Tôi hy vọng điều này sẽ giúp một số người ở một giai đoạn nào đó.

0

Tôi đã gặp sự cố tương tự trong khi tôi đang xử lý tập dữ liệu lớn. Một điều tôi đã nhận thấy là NoSuchElementException được ném khi Máy quét đạt đến endOfFile, nơi nó sẽ không ảnh hưởng đến dữ liệu của chúng tôi.

Ở đây, tôi đã đặt mã của mình ở try blockcatch block xử lý exception. Bạn cũng có thể để trống, nếu bạn không muốn thực hiện bất kỳ tác vụ nào.

Đối với câu hỏi trên, bởi vì bạn đang sử dụng file.next() cả trong điều kiện và trong vòng lặp trong khi bạn có thể xử lý các ngoại lệ như

while(!file.next().equals(treasure)){ 
    try{ 
     file.next(); //stack trace error here 
     }catch(NoSuchElementException e) { } 
} 

này đã làm việc một cách hoàn hảo đối với tôi, nếu có bất kỳ trường hợp góc cho tôi cách tiếp cận, hãy cho tôi biết qua nhận xét.

+1

[khối catch rỗng thường là một ý tưởng tồi] (https://stackoverflow.com/questions/1234343/why-are-empty-catch-blocks-a-bad-idea) –

Các vấn đề liên quan