2015-09-16 32 views
2

我讀的文件具有String後跟int在同一行,然後繼續,直到它達到這個人物:*如何在沒有跳到下一個標記的情況下讀取特定標記時停止循環?

例如:

A 1300 
B 1200 
C 1100 
D 1000 
* 

我需要它停止讀取文件,一旦到達恆星就停止循環。當我做了一個if語句,它並沒有*讀,它會跳到下一行,符合市場預期,但導致對齊問題與在讀的下一個標記

這裏是我的代碼:

static GradingScale reportCard = new GradingScale(); 
public static void main(String[] args) { 
    readInputFile(); 
    javax.swing.JOptionPane.showMessageDialog(null,reportCard.toString()); 
} 

public static void readInputFile(){ 
    try{ 
     Scanner file = new Scanner(new File("grades.txt")); 
     int maxPoints = file.nextInt(); 
     reportCard.setMaxPoints(maxPoints); 
     while(!file.hasNext("*")){ 
       String grade = file.next(); 
       int points = file.nextInt(); 
       double percent = points/(maxPoints*1.0); 
       reportCard.addGradeLevel(grade, points, percent); 
     } 
    } 
    catch(java.io.FileNotFoundException fnfe){ 
     javax.swing.JOptionPane.showMessageDialog(null, "File not found"); 
    } 

} 

我嘗試使用hasNext(Pattern)方法,但我不斷收到此錯誤:

at java.util.regex.Pattern.error(Pattern.java:1955) 
at java.util.regex.Pattern.sequence(Pattern.java:2123) 
at java.util.regex.Pattern.expr(Pattern.java:1996) 
at java.util.regex.Pattern.compile(Pattern.java:1696) 
at java.util.regex.Pattern.<init>(Pattern.java:1351) 
at java.util.regex.Pattern.compile(Pattern.java:1028) 
at java.util.Scanner$1.create(Scanner.java:367) 
at java.util.Scanner$1.create(Scanner.java:365) 
at sun.misc.LRUCache.forName(LRUCache.java:72) 
at java.util.Scanner.hasNext(Scanner.java:1400) 
at mp1.MP1.readInputFile(MP1.java:32) 
at mp1.MP1.main(MP1.java:23) 

導致此:

private void dispatchUncaughtException(Throwable e) { 
    getUncaughtExceptionHandler().uncaughtException(this, e); 
} 

我是在做一些錯誤的方法,或者我應該完全做其他事情嗎?

我對java很陌生,所以請儘量讓它儘可能容易理解。 如果這很難讀,我很抱歉;這是我的第一篇文章。

回答

4

hasNext()的參數是一個正則表達式,而*是無效的正則表達式,因爲星號表示前面的表達式爲「零次或多次」,並且沒有前面的表達式。

你必須逃離明星:hasNext("\\*")

備選:hasNext(Pattern.quote("*"))

Pattern的Javadoc有關正則表達式的更多信息。

5

Scanner#hasNext(String)接受正則表達式模式

但你似乎需要搜索文字*

因此,與逃避它,

Scanner.hasNext("\\*"); 

Scanner.hasNext(Pattern.quote("*")); 
+0

謝謝!那正是我期待的! – Jordyn

相關問題